From e88abbad94820611dc8c544a14e7d9b7f217ea9b Mon Sep 17 00:00:00 2001 From: Facundo Medica <14063057+facundomedica@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:52:36 +0200 Subject: [PATCH 01/41] bring changes from main to release (#244) * progress * progress * progress * adr1009 * add getters to x/reporter * edit md * Add test * chore: Add backport + release + changelog * fix * fix * fix --------- Co-authored-by: brendaloya Co-authored-by: tkernell Co-authored-by: akrem Co-authored-by: brendaloya <35778124+brendaloya@users.noreply.github.com> --- .github/workflows/backport.yml | 26 + .github/workflows/release.yml | 30 + .gitignore | 2 + .goreleaser.yaml | 66 + CHANGELOG.md | 42 + ...dr1009-handling of reporter delegations.md | 23 +- api/layer/reporter/query.pulsar.go | 2057 ++++++++++++++++- api/layer/reporter/query_grpc.pb.go | 76 + createmultikey.md | 59 + docs/static/openapi.yml | 1024 ++++---- package-lock.json | 6 + proto/layer/reporter/query.proto | 42 + x/oracle/keeper/cycle_list.go | 6 +- x/reporter/keeper/query.go | 34 + x/reporter/keeper/query_test.go | 30 + x/reporter/keeper/reporter.go | 12 + x/reporter/module/autocli.go | 12 + x/reporter/types/query.pb.go | 855 ++++++- x/reporter/types/query.pb.gw.go | 202 ++ 19 files changed, 3836 insertions(+), 768 deletions(-) create mode 100644 .github/workflows/backport.yml create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 CHANGELOG.md create mode 100644 createmultikey.md create mode 100644 package-lock.json diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml new file mode 100644 index 000000000..971e8a650 --- /dev/null +++ b/.github/workflows/backport.yml @@ -0,0 +1,26 @@ +name: Backport +on: + pull_request_target: + types: + - closed + - labeled + +jobs: + backport: + name: Backport + runs-on: ubuntu-latest + # Only react to merged PRs for security reasons. + # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target. + if: > + github.event.pull_request.merged + && ( + github.event.action == 'closed' + || ( + github.event.action == 'labeled' + && contains(github.event.label.name, 'backport') + ) + ) + steps: + - uses: tibdex/backport@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..9b5ec890b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +name: goreleaser + +on: + push: + tags: + - '*' + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: stable + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser + version: "~> v2" + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 876a462bd..0eb8bca1a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ build/* secrets.yaml .env prod-sim + +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 000000000..3c19d3f14 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,66 @@ +# This is an example .goreleaser.yml file with some sensible defaults. +# Make sure to check the documentation at https://goreleaser.com + +# The lines below are called `modelines`. See `:help modeline` +# Feel free to remove those if you don't want/need to use them. +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +before: + hooks: + # You may remove this if you don't use go modules. + - go mod tidy + # you may remove this if you don't need go generate + - go generate ./... + +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + + main: ./cmd/layerd/main.go + + ldflags: + - -X github.com/cosmos/cosmos-sdk/version.Name=layer + - -X github.com/cosmos/cosmos-sdk/version.AppName=layerd + - -X github.com/cosmos/cosmos-sdk/version.Version={{ .Version }} + - -X github.com/cosmos/cosmos-sdk/version.Commit={{ .Commit }} + - -X github.com/cosmos/cosmos-sdk/version.BuildTags=netgo,ledger + + tags: + - netgo + - ledger + + binary: layerd + +archives: + - format: tar.gz + # this name template makes the OS and Arch compatible with the results of `uname`. + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + # use zip for windows archives + format_overrides: + - goos: windows + format: zip + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + prerelease: auto + draft: true + header: | + ## Release {{ .CurrentTag }} - ({{ .Date }}) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..5e8a55386 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,42 @@ + + +# Changelog + +## [Unreleased] + + \ No newline at end of file diff --git a/adr/adr1009-handling of reporter delegations.md b/adr/adr1009-handling of reporter delegations.md index e13ce20e2..cbba156f6 100644 --- a/adr/adr1009-handling of reporter delegations.md +++ b/adr/adr1009-handling of reporter delegations.md @@ -1,24 +1,31 @@ -# ADR 1009: Handling of Reporter Delegations - Selectors +# ADR 1009: Handling of Reporter Selections(delegations) and Selectors ## Authors -@themandalore +@themandalore @brendaloya ## Changelog - 2024-06-25: initial version +- 2024-07-30: Clarifications added ## Context -Part of the layer design is that when a reporter submits a price, the system loops through her "selectors" (all parties who have delegated (or selected to give) reporting duties to this reporter) and checks whether or not they are bonded. The reason for the bonding check is that only "bonded" tokens or ones delegated to one of the top 100 validators are considered valid for reporting (we need to keep the token amounts for each set equal). One negative of this approach is that the list of selectors could become so large that looping through this list would cause the transactions to fail. To prevent this, we limited the number of selectors to 100 per reporter. This makes sense but there are some UX and attack vectors that arise from this, namely: +In layer, people can delegate their stakes to validators. To distinguish between delegation to validators and delegations to reporters, delegations to reporters are called selections and those making those selections, selectors. -- Do you allow re-selections, ie selecting a different reporter? If yes, how fast? If you allow instant re-selections you can re-select to another reporter to increase your vote power (the first reporter reports early in the report time frame, and the second selected reporter goes later. You could even do this multiple times) to get extra rewards or manipulate the median. This is a non-starter. Additionaly, since we check for bonding status (part of the top 100 validators), there is a scenario where your selected reporter falls out of being bonded. This means you would effectively lose out on reporting rewards until you reselect. +Part of the layer design is that when a reporter submits a price, the system loops through its "selectors" (all parties who have delegated (or selected to give) reporting duties to this reporter) and checks whether or not they are bonded. The reason for the bonding check is that only "bonded" tokens, ones delegated to one of the top 100 validators, are considered valid for reporting. One negative of this approach is that the list of selectors could become so large that looping through this list would cause the transactions to fail. To prevent this, we limited the number of selectors to 100 per reporter. -- There are additional issues where a party can spam the 100 selector limit with tiny amounts to effectively censor the reporter from getting additional selectors and force them to spin up new addresses and pay more gas for reporting multiple times. +However, the cap on selectors and how we handle re-selections can lead to some UX and attack vectors, namely: + +- If we allowed instant re-selections you can re-select to another reporter to increase your vote power. To carry out the attack the first reporter would reports early in the report time frame(the user defines the report collection time frame for each queryID), and the second selected reporter goes later. This could be done multiple times to get extra rewards or manipulate the median. + +- Additionaly, since all reporter tokens have to be bonded (being part of the top 100 validators), there is a scenario where your selected reporter falls out of being bonded. This means you would effectively lose out on reporting rewards until you reselect. + +- Another issue is that a party can spam the 100 selector limit with tiny amounts to effectively censor the reporter from getting additional selectors and force them to spin up new addresses and pay more gas for reporting multiple times. The current solution is to: -- Allow for re-selection after a lock period where the tokens are not counted in any reporters total for that time period. The time will be the maximum report time frame of 21 days. +- To ensure that any reporter only reports once during the time frame window (which has a maximum of 21 days) and can't reselect to exploit this, re-selection will only be allowed after a lock period of 21 days (meaning that tokens are not counted in any reporters total for that time period). - The reporter can set a minimum stake amount that they allow to be selected with. This prevents cheap spam attacks for larger reporters. @@ -26,7 +33,7 @@ The current solution is to: ### Can never re-select -- This would work, but it makes the UX for selectors very bad. In this case if your reporter goes down or you want to switch to yourself, you must unstake both your reporter AND validator...which will lead to a loss in rewards. With the current method, selectors will only lose out on reporting rewards and the validator delegation can remain untouched. +- This would work, but it makes for poor UX for selectors. In this case if your reporter goes down or you want to switch to yourself, you must unstake both your reporter AND validator, which will lead to a loss in rewards. With the current method, selectors will only lose out on reporting rewards and the validator delegation can remain untouched. ### Selectors are just locked at first 100 with no minimum @@ -44,4 +51,4 @@ The current solution is to: ### Cost to attack / prevention method -If censoring is still an issue (filling up the 100 slots), the reporter can always get other repelegators to move and then submit a bad value, thus slashing the attackers tokens. Therefore the cost of spam is 100 slots * min stake amount, and you'll likely lose it. We see this being a valid solution as the only reason to attack is to prevent repelators from choosing a specific reporter to increase rewards for your own reporter for a specific period of time. If the rewards for any time period are much greater than the attack to censor (very likely not the case with a non-zero minimum), censoring could happen for a short period of time. For this reason, we expect reporters, especially validator/reporters with high reputation, to have larger minimums for selection. +If censoring is still an issue (filling up the 100 slots), the reporter can always get other redelegators to move and then submit a bad value, thus slashing the attackers tokens. Therefore the cost of spam is 100 slots * min stake amount, and you'll likely lose it. We see this being a valid solution as the only reason to attack is to prevent repelators from choosing a specific reporter to increase rewards for your own reporter for a specific period of time. If the rewards for any time period are much greater than the attack to censor (very likely not the case with a non-zero minimum), censoring could happen for a short period of time. For this reason, we expect reporters, especially validator/reporters with high reputation, to have larger minimums for selection. diff --git a/api/layer/reporter/query.pulsar.go b/api/layer/reporter/query.pulsar.go index 8694770f4..c6d5a2364 100644 --- a/api/layer/reporter/query.pulsar.go +++ b/api/layer/reporter/query.pulsar.go @@ -3996,6 +3996,1654 @@ func (x *fastReflection_QueryAllowedAmountResponse) ProtoMethods() *protoiface.M } } +var ( + md_QueryNumOfSelectorsByReporterRequest protoreflect.MessageDescriptor + fd_QueryNumOfSelectorsByReporterRequest_reporter_address protoreflect.FieldDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QueryNumOfSelectorsByReporterRequest = File_layer_reporter_query_proto.Messages().ByName("QueryNumOfSelectorsByReporterRequest") + fd_QueryNumOfSelectorsByReporterRequest_reporter_address = md_QueryNumOfSelectorsByReporterRequest.Fields().ByName("reporter_address") +} + +var _ protoreflect.Message = (*fastReflection_QueryNumOfSelectorsByReporterRequest)(nil) + +type fastReflection_QueryNumOfSelectorsByReporterRequest QueryNumOfSelectorsByReporterRequest + +func (x *QueryNumOfSelectorsByReporterRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryNumOfSelectorsByReporterRequest)(x) +} + +func (x *QueryNumOfSelectorsByReporterRequest) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryNumOfSelectorsByReporterRequest_messageType fastReflection_QueryNumOfSelectorsByReporterRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryNumOfSelectorsByReporterRequest_messageType{} + +type fastReflection_QueryNumOfSelectorsByReporterRequest_messageType struct{} + +func (x fastReflection_QueryNumOfSelectorsByReporterRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryNumOfSelectorsByReporterRequest)(nil) +} +func (x fastReflection_QueryNumOfSelectorsByReporterRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryNumOfSelectorsByReporterRequest) +} +func (x fastReflection_QueryNumOfSelectorsByReporterRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryNumOfSelectorsByReporterRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryNumOfSelectorsByReporterRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryNumOfSelectorsByReporterRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) New() protoreflect.Message { + return new(fastReflection_QueryNumOfSelectorsByReporterRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Interface() protoreflect.ProtoMessage { + return (*QueryNumOfSelectorsByReporterRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ReporterAddress != "" { + value := protoreflect.ValueOfString(x.ReporterAddress) + if !f(fd_QueryNumOfSelectorsByReporterRequest_reporter_address, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + return x.ReporterAddress != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + x.ReporterAddress = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + value := x.ReporterAddress + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + x.ReporterAddress = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + panic(fmt.Errorf("field reporter_address of message layer.reporter.QueryNumOfSelectorsByReporterRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterRequest.reporter_address": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QueryNumOfSelectorsByReporterRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryNumOfSelectorsByReporterRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.ReporterAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ReporterAddress) > 0 { + i -= len(x.ReporterAddress) + copy(dAtA[i:], x.ReporterAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ReporterAddress))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryNumOfSelectorsByReporterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryNumOfSelectorsByReporterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ReporterAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ReporterAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryNumOfSelectorsByReporterResponse protoreflect.MessageDescriptor + fd_QueryNumOfSelectorsByReporterResponse_num_of_selectors protoreflect.FieldDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QueryNumOfSelectorsByReporterResponse = File_layer_reporter_query_proto.Messages().ByName("QueryNumOfSelectorsByReporterResponse") + fd_QueryNumOfSelectorsByReporterResponse_num_of_selectors = md_QueryNumOfSelectorsByReporterResponse.Fields().ByName("num_of_selectors") +} + +var _ protoreflect.Message = (*fastReflection_QueryNumOfSelectorsByReporterResponse)(nil) + +type fastReflection_QueryNumOfSelectorsByReporterResponse QueryNumOfSelectorsByReporterResponse + +func (x *QueryNumOfSelectorsByReporterResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryNumOfSelectorsByReporterResponse)(x) +} + +func (x *QueryNumOfSelectorsByReporterResponse) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryNumOfSelectorsByReporterResponse_messageType fastReflection_QueryNumOfSelectorsByReporterResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryNumOfSelectorsByReporterResponse_messageType{} + +type fastReflection_QueryNumOfSelectorsByReporterResponse_messageType struct{} + +func (x fastReflection_QueryNumOfSelectorsByReporterResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryNumOfSelectorsByReporterResponse)(nil) +} +func (x fastReflection_QueryNumOfSelectorsByReporterResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryNumOfSelectorsByReporterResponse) +} +func (x fastReflection_QueryNumOfSelectorsByReporterResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryNumOfSelectorsByReporterResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryNumOfSelectorsByReporterResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryNumOfSelectorsByReporterResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) New() protoreflect.Message { + return new(fastReflection_QueryNumOfSelectorsByReporterResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Interface() protoreflect.ProtoMessage { + return (*QueryNumOfSelectorsByReporterResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.NumOfSelectors != int32(0) { + value := protoreflect.ValueOfInt32(x.NumOfSelectors) + if !f(fd_QueryNumOfSelectorsByReporterResponse_num_of_selectors, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + return x.NumOfSelectors != int32(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + x.NumOfSelectors = int32(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + value := x.NumOfSelectors + return protoreflect.ValueOfInt32(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + x.NumOfSelectors = int32(value.Int()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + panic(fmt.Errorf("field num_of_selectors of message layer.reporter.QueryNumOfSelectorsByReporterResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryNumOfSelectorsByReporterResponse.num_of_selectors": + return protoreflect.ValueOfInt32(int32(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryNumOfSelectorsByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryNumOfSelectorsByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QueryNumOfSelectorsByReporterResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryNumOfSelectorsByReporterResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.NumOfSelectors != 0 { + n += 1 + runtime.Sov(uint64(x.NumOfSelectors)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.NumOfSelectors != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.NumOfSelectors)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryNumOfSelectorsByReporterResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryNumOfSelectorsByReporterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryNumOfSelectorsByReporterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field NumOfSelectors", wireType) + } + x.NumOfSelectors = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.NumOfSelectors |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QuerySpaceAvailableByReporterRequest protoreflect.MessageDescriptor + fd_QuerySpaceAvailableByReporterRequest_reporter_address protoreflect.FieldDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QuerySpaceAvailableByReporterRequest = File_layer_reporter_query_proto.Messages().ByName("QuerySpaceAvailableByReporterRequest") + fd_QuerySpaceAvailableByReporterRequest_reporter_address = md_QuerySpaceAvailableByReporterRequest.Fields().ByName("reporter_address") +} + +var _ protoreflect.Message = (*fastReflection_QuerySpaceAvailableByReporterRequest)(nil) + +type fastReflection_QuerySpaceAvailableByReporterRequest QuerySpaceAvailableByReporterRequest + +func (x *QuerySpaceAvailableByReporterRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QuerySpaceAvailableByReporterRequest)(x) +} + +func (x *QuerySpaceAvailableByReporterRequest) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QuerySpaceAvailableByReporterRequest_messageType fastReflection_QuerySpaceAvailableByReporterRequest_messageType +var _ protoreflect.MessageType = fastReflection_QuerySpaceAvailableByReporterRequest_messageType{} + +type fastReflection_QuerySpaceAvailableByReporterRequest_messageType struct{} + +func (x fastReflection_QuerySpaceAvailableByReporterRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QuerySpaceAvailableByReporterRequest)(nil) +} +func (x fastReflection_QuerySpaceAvailableByReporterRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QuerySpaceAvailableByReporterRequest) +} +func (x fastReflection_QuerySpaceAvailableByReporterRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QuerySpaceAvailableByReporterRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QuerySpaceAvailableByReporterRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Type() protoreflect.MessageType { + return _fastReflection_QuerySpaceAvailableByReporterRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) New() protoreflect.Message { + return new(fastReflection_QuerySpaceAvailableByReporterRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Interface() protoreflect.ProtoMessage { + return (*QuerySpaceAvailableByReporterRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ReporterAddress != "" { + value := protoreflect.ValueOfString(x.ReporterAddress) + if !f(fd_QuerySpaceAvailableByReporterRequest_reporter_address, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + return x.ReporterAddress != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + x.ReporterAddress = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + value := x.ReporterAddress + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + x.ReporterAddress = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + panic(fmt.Errorf("field reporter_address of message layer.reporter.QuerySpaceAvailableByReporterRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterRequest.reporter_address": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterRequest")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QuerySpaceAvailableByReporterRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QuerySpaceAvailableByReporterRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.ReporterAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ReporterAddress) > 0 { + i -= len(x.ReporterAddress) + copy(dAtA[i:], x.ReporterAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ReporterAddress))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QuerySpaceAvailableByReporterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QuerySpaceAvailableByReporterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ReporterAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ReporterAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QuerySpaceAvailableByReporterResponse protoreflect.MessageDescriptor + fd_QuerySpaceAvailableByReporterResponse_space_available protoreflect.FieldDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QuerySpaceAvailableByReporterResponse = File_layer_reporter_query_proto.Messages().ByName("QuerySpaceAvailableByReporterResponse") + fd_QuerySpaceAvailableByReporterResponse_space_available = md_QuerySpaceAvailableByReporterResponse.Fields().ByName("space_available") +} + +var _ protoreflect.Message = (*fastReflection_QuerySpaceAvailableByReporterResponse)(nil) + +type fastReflection_QuerySpaceAvailableByReporterResponse QuerySpaceAvailableByReporterResponse + +func (x *QuerySpaceAvailableByReporterResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QuerySpaceAvailableByReporterResponse)(x) +} + +func (x *QuerySpaceAvailableByReporterResponse) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QuerySpaceAvailableByReporterResponse_messageType fastReflection_QuerySpaceAvailableByReporterResponse_messageType +var _ protoreflect.MessageType = fastReflection_QuerySpaceAvailableByReporterResponse_messageType{} + +type fastReflection_QuerySpaceAvailableByReporterResponse_messageType struct{} + +func (x fastReflection_QuerySpaceAvailableByReporterResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QuerySpaceAvailableByReporterResponse)(nil) +} +func (x fastReflection_QuerySpaceAvailableByReporterResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QuerySpaceAvailableByReporterResponse) +} +func (x fastReflection_QuerySpaceAvailableByReporterResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QuerySpaceAvailableByReporterResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QuerySpaceAvailableByReporterResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Type() protoreflect.MessageType { + return _fastReflection_QuerySpaceAvailableByReporterResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) New() protoreflect.Message { + return new(fastReflection_QuerySpaceAvailableByReporterResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Interface() protoreflect.ProtoMessage { + return (*QuerySpaceAvailableByReporterResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.SpaceAvailable != int32(0) { + value := protoreflect.ValueOfInt32(x.SpaceAvailable) + if !f(fd_QuerySpaceAvailableByReporterResponse_space_available, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + return x.SpaceAvailable != int32(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + x.SpaceAvailable = int32(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + value := x.SpaceAvailable + return protoreflect.ValueOfInt32(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + x.SpaceAvailable = int32(value.Int()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + panic(fmt.Errorf("field space_available of message layer.reporter.QuerySpaceAvailableByReporterResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QuerySpaceAvailableByReporterResponse.space_available": + return protoreflect.ValueOfInt32(int32(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QuerySpaceAvailableByReporterResponse")) + } + panic(fmt.Errorf("message layer.reporter.QuerySpaceAvailableByReporterResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QuerySpaceAvailableByReporterResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QuerySpaceAvailableByReporterResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.SpaceAvailable != 0 { + n += 1 + runtime.Sov(uint64(x.SpaceAvailable)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.SpaceAvailable != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.SpaceAvailable)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QuerySpaceAvailableByReporterResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QuerySpaceAvailableByReporterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QuerySpaceAvailableByReporterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SpaceAvailable", wireType) + } + x.SpaceAvailable = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.SpaceAvailable |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -4345,6 +5993,158 @@ func (x *QueryAllowedAmountResponse) GetUnstakingAmount() string { return "" } +// QueryNumOfSelectorsByReporterRequest is the request type for the +// Query/NumOfSelectorsByReporter RPC method. +type QueryNumOfSelectorsByReporterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // reporter_address defines the reporter address to query for. + ReporterAddress string `protobuf:"bytes,1,opt,name=reporter_address,json=reporterAddress,proto3" json:"reporter_address,omitempty"` +} + +func (x *QueryNumOfSelectorsByReporterRequest) Reset() { + *x = QueryNumOfSelectorsByReporterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryNumOfSelectorsByReporterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryNumOfSelectorsByReporterRequest) ProtoMessage() {} + +// Deprecated: Use QueryNumOfSelectorsByReporterRequest.ProtoReflect.Descriptor instead. +func (*QueryNumOfSelectorsByReporterRequest) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{9} +} + +func (x *QueryNumOfSelectorsByReporterRequest) GetReporterAddress() string { + if x != nil { + return x.ReporterAddress + } + return "" +} + +// QueryNumOfSelectorsByReporterResponse is the response type for the +// Query/NumOfSelectorsByReporter RPC method. +type QueryNumOfSelectorsByReporterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // num_of_selectors defines the number of selectors by a reporter. + NumOfSelectors int32 `protobuf:"varint,1,opt,name=num_of_selectors,json=numOfSelectors,proto3" json:"num_of_selectors,omitempty"` +} + +func (x *QueryNumOfSelectorsByReporterResponse) Reset() { + *x = QueryNumOfSelectorsByReporterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryNumOfSelectorsByReporterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryNumOfSelectorsByReporterResponse) ProtoMessage() {} + +// Deprecated: Use QueryNumOfSelectorsByReporterResponse.ProtoReflect.Descriptor instead. +func (*QueryNumOfSelectorsByReporterResponse) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{10} +} + +func (x *QueryNumOfSelectorsByReporterResponse) GetNumOfSelectors() int32 { + if x != nil { + return x.NumOfSelectors + } + return 0 +} + +// QuerySpaceAvailableByReporterRequest is the request type for the +// Query/SpaceAvailableByReporter RPC method. +type QuerySpaceAvailableByReporterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // reporter_address defines the reporter address to query for. + ReporterAddress string `protobuf:"bytes,1,opt,name=reporter_address,json=reporterAddress,proto3" json:"reporter_address,omitempty"` +} + +func (x *QuerySpaceAvailableByReporterRequest) Reset() { + *x = QuerySpaceAvailableByReporterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QuerySpaceAvailableByReporterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QuerySpaceAvailableByReporterRequest) ProtoMessage() {} + +// Deprecated: Use QuerySpaceAvailableByReporterRequest.ProtoReflect.Descriptor instead. +func (*QuerySpaceAvailableByReporterRequest) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{11} +} + +func (x *QuerySpaceAvailableByReporterRequest) GetReporterAddress() string { + if x != nil { + return x.ReporterAddress + } + return "" +} + +// QuerySpaceAvailableByReporterResponse is the response type for the +// Query/SpaceAvailableByReporter RPC method. +type QuerySpaceAvailableByReporterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // space_available defines the space available in a reporter. + SpaceAvailable int32 `protobuf:"varint,1,opt,name=space_available,json=spaceAvailable,proto3" json:"space_available,omitempty"` +} + +func (x *QuerySpaceAvailableByReporterResponse) Reset() { + *x = QuerySpaceAvailableByReporterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QuerySpaceAvailableByReporterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QuerySpaceAvailableByReporterResponse) ProtoMessage() {} + +// Deprecated: Use QuerySpaceAvailableByReporterResponse.ProtoReflect.Descriptor instead. +func (*QuerySpaceAvailableByReporterResponse) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{12} +} + +func (x *QuerySpaceAvailableByReporterResponse) GetSpaceAvailable() int32 { + if x != nil { + return x.SpaceAvailable + } + return 0 +} + var File_layer_reporter_query_proto protoreflect.FileDescriptor var file_layer_reporter_query_proto_rawDesc = []byte{ @@ -4422,57 +6222,110 @@ var file_layer_reporter_query_proto_rawDesc = []byte{ 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0f, 0x75, 0x6e, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xe3, 0x04, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x7b, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x22, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x12, 0x20, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x25, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, - 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x12, 0xb7, 0x01, - 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x24, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, + 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, + 0xa0, 0x1f, 0x00, 0x22, 0x51, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, + 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, + 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x75, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, + 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x50, 0x0a, + 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x32, + 0x9c, 0x08, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x7b, 0x0a, 0x06, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, + 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x74, 0x65, + 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, + 0x12, 0xb7, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x74, 0x65, 0x6c, + 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x74, 0x65, + 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2d, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xda, 0x01, 0x0a, 0x18, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, + 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, + 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x41, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, - 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2d, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x42, 0xa8, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x4c, 0x52, 0x58, 0xaa, 0x02, 0x0e, 0x4c, - 0x61, 0x79, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xca, 0x02, 0x0e, - 0x4c, 0x61, 0x79, 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xe2, 0x02, - 0x1a, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4c, 0x61, - 0x79, 0x65, 0x72, 0x3a, 0x3a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x2f, 0x6e, 0x75, 0x6d, 0x2d, 0x6f, 0x66, 0x2d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, + 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x7d, 0x12, 0xd9, 0x01, 0x0a, 0x18, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, + 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2d, + 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x42, 0xa8, + 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0xa2, 0x02, 0x03, 0x4c, 0x52, 0x58, 0xaa, 0x02, 0x0e, 0x4c, 0x61, 0x79, 0x65, 0x72, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xca, 0x02, 0x0e, 0x4c, 0x61, 0x79, 0x65, + 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xe2, 0x02, 0x1a, 0x4c, 0x61, 0x79, + 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x3a, + 0x3a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -4487,38 +6340,46 @@ func file_layer_reporter_query_proto_rawDescGZIP() []byte { return file_layer_reporter_query_proto_rawDescData } -var file_layer_reporter_query_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_layer_reporter_query_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_layer_reporter_query_proto_goTypes = []interface{}{ - (*QueryParamsRequest)(nil), // 0: layer.reporter.QueryParamsRequest - (*QueryParamsResponse)(nil), // 1: layer.reporter.QueryParamsResponse - (*QueryReportersRequest)(nil), // 2: layer.reporter.QueryReportersRequest - (*Reporter)(nil), // 3: layer.reporter.reporter - (*QueryReportersResponse)(nil), // 4: layer.reporter.QueryReportersResponse - (*QuerySelectorReporterRequest)(nil), // 5: layer.reporter.QuerySelectorReporterRequest - (*QuerySelectorReporterResponse)(nil), // 6: layer.reporter.QuerySelectorReporterResponse - (*QueryAllowedAmountRequest)(nil), // 7: layer.reporter.QueryAllowedAmountRequest - (*QueryAllowedAmountResponse)(nil), // 8: layer.reporter.QueryAllowedAmountResponse - (*Params)(nil), // 9: layer.reporter.Params - (*v1beta1.PageRequest)(nil), // 10: cosmos.base.query.v1beta1.PageRequest - (*OracleReporter)(nil), // 11: layer.reporter.OracleReporter - (*v1beta1.PageResponse)(nil), // 12: cosmos.base.query.v1beta1.PageResponse + (*QueryParamsRequest)(nil), // 0: layer.reporter.QueryParamsRequest + (*QueryParamsResponse)(nil), // 1: layer.reporter.QueryParamsResponse + (*QueryReportersRequest)(nil), // 2: layer.reporter.QueryReportersRequest + (*Reporter)(nil), // 3: layer.reporter.reporter + (*QueryReportersResponse)(nil), // 4: layer.reporter.QueryReportersResponse + (*QuerySelectorReporterRequest)(nil), // 5: layer.reporter.QuerySelectorReporterRequest + (*QuerySelectorReporterResponse)(nil), // 6: layer.reporter.QuerySelectorReporterResponse + (*QueryAllowedAmountRequest)(nil), // 7: layer.reporter.QueryAllowedAmountRequest + (*QueryAllowedAmountResponse)(nil), // 8: layer.reporter.QueryAllowedAmountResponse + (*QueryNumOfSelectorsByReporterRequest)(nil), // 9: layer.reporter.QueryNumOfSelectorsByReporterRequest + (*QueryNumOfSelectorsByReporterResponse)(nil), // 10: layer.reporter.QueryNumOfSelectorsByReporterResponse + (*QuerySpaceAvailableByReporterRequest)(nil), // 11: layer.reporter.QuerySpaceAvailableByReporterRequest + (*QuerySpaceAvailableByReporterResponse)(nil), // 12: layer.reporter.QuerySpaceAvailableByReporterResponse + (*Params)(nil), // 13: layer.reporter.Params + (*v1beta1.PageRequest)(nil), // 14: cosmos.base.query.v1beta1.PageRequest + (*OracleReporter)(nil), // 15: layer.reporter.OracleReporter + (*v1beta1.PageResponse)(nil), // 16: cosmos.base.query.v1beta1.PageResponse } var file_layer_reporter_query_proto_depIdxs = []int32{ - 9, // 0: layer.reporter.QueryParamsResponse.params:type_name -> layer.reporter.Params - 10, // 1: layer.reporter.QueryReportersRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 11, // 2: layer.reporter.reporter.metadata:type_name -> layer.reporter.OracleReporter + 13, // 0: layer.reporter.QueryParamsResponse.params:type_name -> layer.reporter.Params + 14, // 1: layer.reporter.QueryReportersRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 15, // 2: layer.reporter.reporter.metadata:type_name -> layer.reporter.OracleReporter 3, // 3: layer.reporter.QueryReportersResponse.reporters:type_name -> layer.reporter.reporter - 12, // 4: layer.reporter.QueryReportersResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 16, // 4: layer.reporter.QueryReportersResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 0, // 5: layer.reporter.Query.Params:input_type -> layer.reporter.QueryParamsRequest 2, // 6: layer.reporter.Query.Reporters:input_type -> layer.reporter.QueryReportersRequest 5, // 7: layer.reporter.Query.SelectorReporter:input_type -> layer.reporter.QuerySelectorReporterRequest 7, // 8: layer.reporter.Query.AllowedAmount:input_type -> layer.reporter.QueryAllowedAmountRequest - 1, // 9: layer.reporter.Query.Params:output_type -> layer.reporter.QueryParamsResponse - 4, // 10: layer.reporter.Query.Reporters:output_type -> layer.reporter.QueryReportersResponse - 6, // 11: layer.reporter.Query.SelectorReporter:output_type -> layer.reporter.QuerySelectorReporterResponse - 8, // 12: layer.reporter.Query.AllowedAmount:output_type -> layer.reporter.QueryAllowedAmountResponse - 9, // [9:13] is the sub-list for method output_type - 5, // [5:9] is the sub-list for method input_type + 9, // 9: layer.reporter.Query.NumOfSelectorsByReporter:input_type -> layer.reporter.QueryNumOfSelectorsByReporterRequest + 11, // 10: layer.reporter.Query.SpaceAvailableByReporter:input_type -> layer.reporter.QuerySpaceAvailableByReporterRequest + 1, // 11: layer.reporter.Query.Params:output_type -> layer.reporter.QueryParamsResponse + 4, // 12: layer.reporter.Query.Reporters:output_type -> layer.reporter.QueryReportersResponse + 6, // 13: layer.reporter.Query.SelectorReporter:output_type -> layer.reporter.QuerySelectorReporterResponse + 8, // 14: layer.reporter.Query.AllowedAmount:output_type -> layer.reporter.QueryAllowedAmountResponse + 10, // 15: layer.reporter.Query.NumOfSelectorsByReporter:output_type -> layer.reporter.QueryNumOfSelectorsByReporterResponse + 12, // 16: layer.reporter.Query.SpaceAvailableByReporter:output_type -> layer.reporter.QuerySpaceAvailableByReporterResponse + 11, // [11:17] is the sub-list for method output_type + 5, // [5:11] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name @@ -4640,6 +6501,54 @@ func file_layer_reporter_query_proto_init() { return nil } } + file_layer_reporter_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryNumOfSelectorsByReporterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_layer_reporter_query_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryNumOfSelectorsByReporterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_layer_reporter_query_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QuerySpaceAvailableByReporterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_layer_reporter_query_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QuerySpaceAvailableByReporterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -4647,7 +6556,7 @@ func file_layer_reporter_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_layer_reporter_query_proto_rawDesc, NumEnums: 0, - NumMessages: 9, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/api/layer/reporter/query_grpc.pb.go b/api/layer/reporter/query_grpc.pb.go index 3d2a94112..8ea98d59c 100644 --- a/api/layer/reporter/query_grpc.pb.go +++ b/api/layer/reporter/query_grpc.pb.go @@ -26,6 +26,10 @@ type QueryClient interface { SelectorReporter(ctx context.Context, in *QuerySelectorReporterRequest, opts ...grpc.CallOption) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(ctx context.Context, in *QueryAllowedAmountRequest, opts ...grpc.CallOption) (*QueryAllowedAmountResponse, error) + // NumOfSelectorsByReporter queries the number of selectors by a reporter. + NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) + // SpaceAvailableByReporter queries the space available in a reporter. + SpaceAvailableByReporter(ctx context.Context, in *QuerySpaceAvailableByReporterRequest, opts ...grpc.CallOption) (*QuerySpaceAvailableByReporterResponse, error) } type queryClient struct { @@ -72,6 +76,24 @@ func (c *queryClient) AllowedAmount(ctx context.Context, in *QueryAllowedAmountR return out, nil } +func (c *queryClient) NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) { + out := new(QueryNumOfSelectorsByReporterResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/NumOfSelectorsByReporter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) SpaceAvailableByReporter(ctx context.Context, in *QuerySpaceAvailableByReporterRequest, opts ...grpc.CallOption) (*QuerySpaceAvailableByReporterResponse, error) { + out := new(QuerySpaceAvailableByReporterResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/SpaceAvailableByReporter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility @@ -84,6 +106,10 @@ type QueryServer interface { SelectorReporter(context.Context, *QuerySelectorReporterRequest) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) + // NumOfSelectorsByReporter queries the number of selectors by a reporter. + NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) + // SpaceAvailableByReporter queries the space available in a reporter. + SpaceAvailableByReporter(context.Context, *QuerySpaceAvailableByReporterRequest) (*QuerySpaceAvailableByReporterResponse, error) mustEmbedUnimplementedQueryServer() } @@ -103,6 +129,12 @@ func (UnimplementedQueryServer) SelectorReporter(context.Context, *QuerySelector func (UnimplementedQueryServer) AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllowedAmount not implemented") } +func (UnimplementedQueryServer) NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NumOfSelectorsByReporter not implemented") +} +func (UnimplementedQueryServer) SpaceAvailableByReporter(context.Context, *QuerySpaceAvailableByReporterRequest) (*QuerySpaceAvailableByReporterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SpaceAvailableByReporter not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} // UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. @@ -188,6 +220,42 @@ func _Query_AllowedAmount_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Query_NumOfSelectorsByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNumOfSelectorsByReporterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).NumOfSelectorsByReporter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/NumOfSelectorsByReporter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).NumOfSelectorsByReporter(ctx, req.(*QueryNumOfSelectorsByReporterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_SpaceAvailableByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySpaceAvailableByReporterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).SpaceAvailableByReporter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/SpaceAvailableByReporter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).SpaceAvailableByReporter(ctx, req.(*QuerySpaceAvailableByReporterRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -211,6 +279,14 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "AllowedAmount", Handler: _Query_AllowedAmount_Handler, }, + { + MethodName: "NumOfSelectorsByReporter", + Handler: _Query_NumOfSelectorsByReporter_Handler, + }, + { + MethodName: "SpaceAvailableByReporter", + Handler: _Query_SpaceAvailableByReporter_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "layer/reporter/query.proto", diff --git a/createmultikey.md b/createmultikey.md new file mode 100644 index 000000000..958cd74e1 --- /dev/null +++ b/createmultikey.md @@ -0,0 +1,59 @@ +# How to create multisig key through cli using layerd binray + +Note: example keys are stored in test backend but could be stored in os + +- Purpose: to create keys locally and share pubkey in order to generate a multikey that will create a tellor prefixed address that is controlled by generating keys. + +## Create single keys + +```sh +layerd keys add key1 --keyring-backend test --keyring-dir ~/.layer +``` + +```sh +layerd keys add key2 --keyring-backend test --keyring-dir ~/.layer +``` + +```sh +layerd keys add key3 --keyring-backend test --keyring-dir ~/.layer +``` + +## Show created keys pubkey to share w/others + +```sh +layerd keys show key1 --keyring-backend test --keyring-dir ~/.layer -p +``` + +example output: +`{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A1Td9cx4t8nKF42C9ag+Hron4Ny32r2365E0eoVlHhpZ"}` + +## Create a multi key in different device given pub keys + +- first add keys locally using pubkey + +```sh +layerd keys add key1 --pubkey '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A00994obHdjRcP+C1NTwMcRbC5b+C8uQjqsYg9Xcf5ZO"}' --keyring-backend test --keyring-dir ~/.layer +``` + +```sh +layerd keys add key2 --pubkey '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AsetxjcT/JPB9t5ddPHoou5zEW32Kst2mMWoxzjnxAsC"}' --keyring-backend test --keyring-dir ~/.layer +``` + +```sh +layerd keys add key3 --pubkey '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A6dkBv59j1xL1zHGahPq0s6gO2aSUX2wAZyUwey57l+Q"}' --keyring-backend test --keyring-dir ~/.layer +``` + +## Generate or create the multi using the public keys + +```sh +layerd keys add teammulti --multisig key1,key2,key3 --multisig-threshold 2 --keyring-backend test --keyring-dir ~/.layer +``` + +## Show mulitsig address + +```sh +layerd keys show teammulti --keyring-backend test --keyring-dir ~/.layer -a +``` + +example output: +`tellor1025y9ux4uprvu6fchjxja6n555teeqvqadg97q` diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index 181f17ba7..1c3131f80 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -4,30 +4,22 @@ info: name: '' description: '' paths: - /layer/bridge/get_attestation_data_by_snapshot/{snapshot}: + /tellor-io/layer/reporter/allowed-amount: get: - operationId: LayerBridgeGetAttestationDataBySnapshot + summary: AllowedAmount queries the currently allowed amount to stake or unstake. + operationId: LayerReporterAllowedAmount responses: '200': description: A successful response. schema: type: object properties: - query_id: + staking_amount: type: string - timestamp: - type: string - aggregate_value: - type: string - aggregate_power: - type: string - checkpoint: - type: string - attestation_timestamp: - type: string - previous_report_timestamp: - type: string - next_report_timestamp: + description: >- + allowed_amount defines the currently allowed amount to stake + or unstake. + unstaking_amount: type: string default: description: An unexpected error response. @@ -47,26 +39,27 @@ paths: '@type': type: string additionalProperties: {} - parameters: - - name: snapshot - in: path - required: true - type: string tags: - Query - /layer/bridge/get_attestations_by_snapshot/{snapshot}: + /tellor-io/layer/reporter/num-of-selectors-by-reporter/{reporter_address}: get: - operationId: LayerBridgeGetAttestationsBySnapshot + summary: NumOfSelectorsByReporter queries the number of selectors by a reporter. + operationId: LayerReporterNumOfSelectorsByReporter responses: '200': description: A successful response. schema: type: object properties: - attestations: - type: array - items: - type: string + num_of_selectors: + type: integer + format: int32 + description: >- + num_of_selectors defines the number of selectors by a + reporter. + description: |- + QueryNumOfSelectorsByReporterResponse is the response type for the + Query/NumOfSelectorsByReporter RPC method. default: description: An unexpected error response. schema: @@ -86,129 +79,42 @@ paths: type: string additionalProperties: {} parameters: - - name: snapshot + - name: reporter_address + description: reporter_address defines the reporter address to query for. in: path required: true type: string tags: - Query - /layer/bridge/get_current_aggregate_report/{query_id}: + /tellor-io/layer/reporter/params: get: - operationId: LayerBridgeGetCurrentAggregateReport + summary: Parameters queries the parameters of the module. + operationId: LayerReporterParams responses: '200': description: A successful response. schema: type: object properties: - aggregate: + params: + description: params holds all the parameters of this module. type: object properties: - query_id: - type: string - format: byte - aggregateValue: - type: string - aggregateReporter: - type: string - reporterPower: - type: string - format: int64 - standard_deviation: - type: number - format: double - reporters: - type: array - items: - type: object - properties: - reporter: - type: string - power: - type: string - format: int64 - flagged: - type: boolean - nonce: + min_commission_rate: type: string - format: int64 - aggregateReportIndex: + title: >- + min_commission_rate, adopted from staking module, is the + minimum commission rate a reporter can their delegators + min_trb: type: string - format: int64 - height: + title: min_trb to be a reporter + max_selectors: type: string - format: int64 - timestamp: - type: string - format: uint64 - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - parameters: - - name: query_id - in: path - required: true - type: string - tags: - - Query - /layer/bridge/get_current_validator_set_timestamp: - get: - operationId: LayerBridgeGetCurrentValidatorSetTimestamp - responses: - '200': - description: A successful response. - schema: - type: object - properties: - timestamp: - type: string - format: int64 - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - tags: - - Query - /layer/bridge/get_evm_address_by_validator_address/{validator_address}: - get: - operationId: LayerBridgeGetEvmAddressByValidatorAddress - responses: - '200': - description: A successful response. - schema: - type: object - properties: - evm_address: - type: string + format: uint64 + title: max number of selectors for a reporter + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. default: description: An unexpected error response. schema: @@ -227,66 +133,71 @@ paths: '@type': type: string additionalProperties: {} - parameters: - - name: validator_address - in: path - required: true - type: string tags: - Query - /layer/bridge/get_evm_validators: + /tellor-io/layer/reporter/reporters: get: - summary: Queries a list of GetEvmValidators items. - operationId: LayerBridgeGetEvmValidators + summary: Reporters queries all the staked reporters. + operationId: LayerReporterReporters responses: '200': description: A successful response. schema: type: object properties: - bridge_validator_set: - type: array - items: - type: object - properties: - ethereumAddress: - type: string - power: - type: string - format: uint64 - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: + reporters: type: array items: type: object properties: - '@type': + address: type: string - additionalProperties: {} - tags: - - Query - /layer/bridge/get_snapshots_by_report/{query_id}/{timestamp}: - get: - operationId: LayerBridgeGetSnapshotsByReport - responses: - '200': - description: A successful response. - schema: - type: object - properties: - snapshots: - type: array - items: - type: string + metadata: + type: object + properties: + min_tokens_required: + type: string + title: min_tokens_required to select this reporter + commission_rate: + type: string + title: commission for the reporter + jailed: + type: boolean + title: >- + jailed is a bool whether the reporter is jailed or + not + jailed_until: + type: string + format: date-time + title: >- + jailed_until is the time the reporter is jailed + until + title: >- + OracleReporter is the struct that holds the data for a + reporter + description: all the reporters. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryReportersResponse is the response type for the + Query/Reporters RPC method. default: description: An unexpected error response. schema: @@ -306,104 +217,80 @@ paths: type: string additionalProperties: {} parameters: - - name: query_id - in: path - required: true + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false type: string - - name: timestamp - in: path - required: true + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false type: string - tags: - - Query - /layer/bridge/get_validator_checkpoint: - get: - operationId: LayerBridgeGetValidatorCheckpoint - responses: - '200': - description: A successful response. - schema: - type: object - properties: - validator_checkpoint: - type: string - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - tags: - - Query - /layer/bridge/get_validator_checkpoint_params/{timestamp}: - get: - operationId: LayerBridgeGetValidatorCheckpointParams - responses: - '200': - description: A successful response. - schema: - type: object - properties: - checkpoint: - type: string - valset_hash: - type: string - timestamp: - type: string - format: int64 - power_threshold: - type: string - format: int64 - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - parameters: - - name: timestamp - in: path - required: true + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false type: string - format: int64 + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean tags: - Query - /layer/bridge/get_validator_set_index_by_timestamp/{timestamp}: + /tellor-io/layer/reporter/selector-reporter/{selector_address}: get: - operationId: LayerBridgeGetValidatorSetIndexByTimestamp + summary: SelectorReporter queries the reporter of a selector. + operationId: LayerReporterSelectorReporter responses: '200': description: A successful response. schema: type: object properties: - index: + reporter: type: string - format: int64 + description: reporter defines the reporter of a selector. + description: |- + QuerySelectorReporterResponse is the response type for the + Query/SelectorReporter RPC method. default: description: An unexpected error response. schema: @@ -423,70 +310,30 @@ paths: type: string additionalProperties: {} parameters: - - name: timestamp + - name: selector_address + description: selector_address defines the selector address to query for. in: path required: true type: string - format: int64 tags: - Query - /layer/bridge/get_validator_timestamp_by_index/{index}: + /tellor-io/layer/reporter/space-available-by-reporter/{reporter_address}: get: - operationId: LayerBridgeGetValidatorTimestampByIndex + summary: SpaceAvailableByReporter queries the space available in a reporter. + operationId: LayerReporterSpaceAvailableByReporter responses: '200': description: A successful response. schema: type: object properties: - timestamp: - type: string - format: int64 - default: - description: An unexpected error response. - schema: - type: object - properties: - code: + space_available: type: integer format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - parameters: - - name: index - in: path - required: true - type: string - format: int64 - tags: - - Query - /layer/bridge/get_valset_by_timestamp/{timestamp}: - get: - operationId: LayerBridgeGetValsetByTimestamp - responses: - '200': - description: A successful response. - schema: - type: object - properties: - bridge_validator_set: - type: array - items: - type: object - properties: - ethereumAddress: - type: string - power: - type: string - format: uint64 + description: space_available defines the space available in a reporter. + description: |- + QuerySpaceAvailableByReporterResponse is the response type for the + Query/SpaceAvailableByReporter RPC method. default: description: An unexpected error response. schema: @@ -506,86 +353,11 @@ paths: type: string additionalProperties: {} parameters: - - name: timestamp + - name: reporter_address + description: reporter_address defines the reporter address to query for. in: path required: true type: string - format: int64 - tags: - - Query - /layer/bridge/get_valset_sigs/{timestamp}: - get: - operationId: LayerBridgeGetValsetSigs - responses: - '200': - description: A successful response. - schema: - type: object - properties: - signatures: - type: array - items: - type: string - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} - parameters: - - name: timestamp - in: path - required: true - type: string - format: int64 - tags: - - Query - /layer/bridge/params: - get: - summary: Parameters queries the parameters of the module. - operationId: LayerBridgeParams - responses: - '200': - description: A successful response. - schema: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: >- - QueryParamsResponse is response type for the Query/Params RPC - method. - default: - description: An unexpected error response. - schema: - type: object - properties: - code: - type: integer - format: int32 - message: - type: string - details: - type: array - items: - type: object - properties: - '@type': - type: string - additionalProperties: {} tags: - Query definitions: @@ -2618,219 +2390,6 @@ definitions: type: object layer.bridge.MsgWithdrawTokensResponse: type: object - layer.bridge.Aggregate: - type: object - properties: - query_id: - type: string - format: byte - aggregateValue: - type: string - aggregateReporter: - type: string - reporterPower: - type: string - format: int64 - standard_deviation: - type: number - format: double - reporters: - type: array - items: - type: object - properties: - reporter: - type: string - power: - type: string - format: int64 - flagged: - type: boolean - nonce: - type: string - format: int64 - aggregateReportIndex: - type: string - format: int64 - height: - type: string - format: int64 - layer.bridge.AggregateReporter: - type: object - properties: - reporter: - type: string - power: - type: string - format: int64 - layer.bridge.Params: - type: object - description: Params defines the parameters for the module. - layer.bridge.QueryBridgeValidator: - type: object - properties: - ethereumAddress: - type: string - power: - type: string - format: uint64 - layer.bridge.QueryGetAttestationDataBySnapshotResponse: - type: object - properties: - query_id: - type: string - timestamp: - type: string - aggregate_value: - type: string - aggregate_power: - type: string - checkpoint: - type: string - attestation_timestamp: - type: string - previous_report_timestamp: - type: string - next_report_timestamp: - type: string - layer.bridge.QueryGetAttestationsBySnapshotResponse: - type: object - properties: - attestations: - type: array - items: - type: string - layer.bridge.QueryGetCurrentAggregateReportResponse: - type: object - properties: - aggregate: - type: object - properties: - query_id: - type: string - format: byte - aggregateValue: - type: string - aggregateReporter: - type: string - reporterPower: - type: string - format: int64 - standard_deviation: - type: number - format: double - reporters: - type: array - items: - type: object - properties: - reporter: - type: string - power: - type: string - format: int64 - flagged: - type: boolean - nonce: - type: string - format: int64 - aggregateReportIndex: - type: string - format: int64 - height: - type: string - format: int64 - timestamp: - type: string - format: uint64 - layer.bridge.QueryGetCurrentValidatorSetTimestampResponse: - type: object - properties: - timestamp: - type: string - format: int64 - layer.bridge.QueryGetEvmAddressByValidatorAddressResponse: - type: object - properties: - evm_address: - type: string - layer.bridge.QueryGetEvmValidatorsResponse: - type: object - properties: - bridge_validator_set: - type: array - items: - type: object - properties: - ethereumAddress: - type: string - power: - type: string - format: uint64 - layer.bridge.QueryGetSnapshotsByReportResponse: - type: object - properties: - snapshots: - type: array - items: - type: string - layer.bridge.QueryGetValidatorCheckpointParamsResponse: - type: object - properties: - checkpoint: - type: string - valset_hash: - type: string - timestamp: - type: string - format: int64 - power_threshold: - type: string - format: int64 - layer.bridge.QueryGetValidatorCheckpointResponse: - type: object - properties: - validator_checkpoint: - type: string - layer.bridge.QueryGetValidatorSetIndexByTimestampResponse: - type: object - properties: - index: - type: string - format: int64 - layer.bridge.QueryGetValidatorTimestampByIndexResponse: - type: object - properties: - timestamp: - type: string - format: int64 - layer.bridge.QueryGetValsetByTimestampResponse: - type: object - properties: - bridge_validator_set: - type: array - items: - type: object - properties: - ethereumAddress: - type: string - power: - type: string - format: uint64 - layer.bridge.QueryGetValsetSigsResponse: - type: object - properties: - signatures: - type: array - items: - type: string - layer.bridge.QueryParamsResponse: - type: object - properties: - params: - description: params holds all the parameters of this module. - type: object - description: QueryParamsResponse is response type for the Query/Params RPC method. layer.mint.MsgMsgInitResponse: type: object layer.registry.ABIComponent: @@ -2897,6 +2456,247 @@ definitions: description: MsgRegisterSpecResponse defines the Msg/RegisterSpec response type. layer.registry.MsgUpdateDataSpecResponse: type: object + cosmos.base.query.v1beta1.PageRequest: + type: object + properties: + key: + type: string + format: byte + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + offset: + type: string + format: uint64 + description: |- + offset is a numeric offset that can be used when key is unavailable. + It is less efficient than using key. Only one of offset or key should + be set. + limit: + type: string + format: uint64 + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + count_total: + type: boolean + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in UIs. + + count_total is only respected when offset is used. It is ignored when + key + + is set. + reverse: + type: boolean + description: >- + reverse is set to true if results are to be returned in the descending + order. + + + Since: cosmos-sdk 0.43 + description: |- + message SomeRequest { + Foo some_parameter = 1; + PageRequest pagination = 2; + } + title: |- + PageRequest is to be embedded in gRPC request messages for efficient + pagination. Ex: + cosmos.base.query.v1beta1.PageResponse: + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: |- + total is total number of results available if PageRequest.count_total + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + layer.reporter.OracleReporter: + type: object + properties: + min_tokens_required: + type: string + title: min_tokens_required to select this reporter + commission_rate: + type: string + title: commission for the reporter + jailed: + type: boolean + title: jailed is a bool whether the reporter is jailed or not + jailed_until: + type: string + format: date-time + title: jailed_until is the time the reporter is jailed until + title: OracleReporter is the struct that holds the data for a reporter + layer.reporter.Params: + type: object + properties: + min_commission_rate: + type: string + title: >- + min_commission_rate, adopted from staking module, is the minimum + commission rate a reporter can their delegators + min_trb: + type: string + title: min_trb to be a reporter + max_selectors: + type: string + format: uint64 + title: max number of selectors for a reporter + description: Params defines the parameters for the module. + layer.reporter.QueryAllowedAmountResponse: + type: object + properties: + staking_amount: + type: string + description: >- + allowed_amount defines the currently allowed amount to stake or + unstake. + unstaking_amount: + type: string + layer.reporter.QueryNumOfSelectorsByReporterResponse: + type: object + properties: + num_of_selectors: + type: integer + format: int32 + description: num_of_selectors defines the number of selectors by a reporter. + description: |- + QueryNumOfSelectorsByReporterResponse is the response type for the + Query/NumOfSelectorsByReporter RPC method. + layer.reporter.QueryParamsResponse: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + min_commission_rate: + type: string + title: >- + min_commission_rate, adopted from staking module, is the minimum + commission rate a reporter can their delegators + min_trb: + type: string + title: min_trb to be a reporter + max_selectors: + type: string + format: uint64 + title: max number of selectors for a reporter + description: QueryParamsResponse is response type for the Query/Params RPC method. + layer.reporter.QueryReportersResponse: + type: object + properties: + reporters: + type: array + items: + type: object + properties: + address: + type: string + metadata: + type: object + properties: + min_tokens_required: + type: string + title: min_tokens_required to select this reporter + commission_rate: + type: string + title: commission for the reporter + jailed: + type: boolean + title: jailed is a bool whether the reporter is jailed or not + jailed_until: + type: string + format: date-time + title: jailed_until is the time the reporter is jailed until + title: OracleReporter is the struct that holds the data for a reporter + description: all the reporters. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryReportersResponse is the response type for the Query/Reporters RPC + method. + layer.reporter.QuerySelectorReporterResponse: + type: object + properties: + reporter: + type: string + description: reporter defines the reporter of a selector. + description: |- + QuerySelectorReporterResponse is the response type for the + Query/SelectorReporter RPC method. + layer.reporter.QuerySpaceAvailableByReporterResponse: + type: object + properties: + space_available: + type: integer + format: int32 + description: space_available defines the space available in a reporter. + description: |- + QuerySpaceAvailableByReporterResponse is the response type for the + Query/SpaceAvailableByReporter RPC method. + layer.reporter.reporter: + type: object + properties: + address: + type: string + metadata: + type: object + properties: + min_tokens_required: + type: string + title: min_tokens_required to select this reporter + commission_rate: + type: string + title: commission for the reporter + jailed: + type: boolean + title: jailed is a bool whether the reporter is jailed or not + jailed_until: + type: string + format: date-time + title: jailed_until is the time the reporter is jailed until + title: OracleReporter is the struct that holds the data for a reporter layer.reporter.MsgCreateReporterResponse: type: object description: MsgCreateReporterResponse defines the Msg/CreateReporter response type. @@ -2919,19 +2719,3 @@ definitions: layer.reporter.MsgWithdrawTipResponse: type: object description: MsgWithdrawTipResponse defines the Msg/WithdrawTip response type. - layer.reporter.Params: - type: object - properties: - min_commission_rate: - type: string - title: >- - min_commission_rate, adopted from staking module, is the minimum - commission rate a reporter can their delegators - min_trb: - type: string - title: min_trb to be a reporter - max_selectors: - type: string - format: uint64 - title: max number of selectors for a reporter - description: Params defines the parameters for the module. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..c037c1d0a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "layer", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/proto/layer/reporter/query.proto b/proto/layer/reporter/query.proto index 127f6397c..3cff8d3a5 100644 --- a/proto/layer/reporter/query.proto +++ b/proto/layer/reporter/query.proto @@ -30,6 +30,14 @@ service Query { rpc AllowedAmount(QueryAllowedAmountRequest) returns (QueryAllowedAmountResponse) { option (google.api.http).get = "/tellor-io/layer/reporter/allowed-amount"; } + // NumOfSelectorsByReporter queries the number of selectors by a reporter. + rpc NumOfSelectorsByReporter(QueryNumOfSelectorsByReporterRequest) returns (QueryNumOfSelectorsByReporterResponse) { + option (google.api.http).get = "/tellor-io/layer/reporter/num-of-selectors-by-reporter/{reporter_address}"; + } + // SpaceAvailableByReporter queries the space available in a reporter. + rpc SpaceAvailableByReporter(QuerySpaceAvailableByReporterRequest) returns (QuerySpaceAvailableByReporterResponse) { + option (google.api.http).get = "/tellor-io/layer/reporter/space-available-by-reporter/{reporter_address}"; + } } // QueryParamsRequest is request type for the Query/Params RPC method. @@ -94,3 +102,37 @@ message QueryAllowedAmountResponse { (gogoproto.nullable) = false ]; } + +// QueryNumOfSelectorsByReporterRequest is the request type for the +// Query/NumOfSelectorsByReporter RPC method. +message QueryNumOfSelectorsByReporterRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // reporter_address defines the reporter address to query for. + string reporter_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; +} + +// QueryNumOfSelectorsByReporterResponse is the response type for the +// Query/NumOfSelectorsByReporter RPC method. +message QueryNumOfSelectorsByReporterResponse { + // num_of_selectors defines the number of selectors by a reporter. + int32 num_of_selectors = 1; +} + +// QuerySpaceAvailableByReporterRequest is the request type for the +// Query/SpaceAvailableByReporter RPC method. +message QuerySpaceAvailableByReporterRequest { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // reporter_address defines the reporter address to query for. + string reporter_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; +} + +// QuerySpaceAvailableByReporterResponse is the response type for the +// Query/SpaceAvailableByReporter RPC method. +message QuerySpaceAvailableByReporterResponse { + // space_available defines the space available in a reporter. + int32 space_available = 1; +} diff --git a/x/oracle/keeper/cycle_list.go b/x/oracle/keeper/cycle_list.go index d0a358b6f..9c128529b 100644 --- a/x/oracle/keeper/cycle_list.go +++ b/x/oracle/keeper/cycle_list.go @@ -12,11 +12,7 @@ func (k Keeper) GetCyclelist(ctx context.Context) ([][]byte, error) { if err != nil { return nil, err } - q, err := iter.Values() - if err != nil { - return nil, err - } - return q, nil + return iter.Values() } // rotation of the cycle list diff --git a/x/reporter/keeper/query.go b/x/reporter/keeper/query.go index a57539c7b..d7869705c 100644 --- a/x/reporter/keeper/query.go +++ b/x/reporter/keeper/query.go @@ -95,3 +95,37 @@ func (k Querier) AllowedAmount(ctx context.Context, req *types.QueryAllowedAmoun UnstakingAmount: unstakingAmountAllowed, }, nil } + +// query for num of selectors in reporter +func (k Querier) NumOfSelectorsByReporter(ctx context.Context, req *types.QueryNumOfSelectorsByReporterRequest) (*types.QueryNumOfSelectorsByReporterResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + repAddr := sdk.MustAccAddressFromBech32(req.ReporterAddress) + count, err := k.Keeper.GetNumOfSelectors(ctx, repAddr) + if err != nil { + return nil, err + } + + return &types.QueryNumOfSelectorsByReporterResponse{NumOfSelectors: int32(count)}, nil +} + +// query for num of space available in reporter +func (k Querier) SpaceAvailableByReporter(ctx context.Context, req *types.QuerySpaceAvailableByReporterRequest) (*types.QuerySpaceAvailableByReporterResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + repAddr := sdk.MustAccAddressFromBech32(req.ReporterAddress) + count, err := k.Keeper.GetNumOfSelectors(ctx, repAddr) + if err != nil { + return nil, err + } + params, err := k.Keeper.Params.Get(ctx) + if err != nil { + return nil, err + } + remaining := int(params.MaxSelectors) - count + return &types.QuerySpaceAvailableByReporterResponse{SpaceAvailable: int32(remaining)}, nil +} diff --git a/x/reporter/keeper/query_test.go b/x/reporter/keeper/query_test.go index 8f4a24c13..623817b05 100644 --- a/x/reporter/keeper/query_test.go +++ b/x/reporter/keeper/query_test.go @@ -52,3 +52,33 @@ func TestAllowedAmountQuery(t *testing.T) { require.Equal(t, expectedAllowedAmount, res.StakingAmount) require.Equal(t, expectedAllowedAmount.Neg(), res.UnstakingAmount) } + +func TestNumOfSelectorsByReporter(t *testing.T) { + k, _, _, _, ctx, _ := setupKeeper(t) + querier := keeper.NewQuerier(k) + + reporterAddr := sample.AccAddressBytes() + for i := 0; i < 10; i++ { + err := k.Selectors.Set(ctx, sample.AccAddressBytes(), types.NewSelection(reporterAddr, 1)) + require.NoError(t, err) + } + + res, err := querier.NumOfSelectorsByReporter(ctx, &types.QueryNumOfSelectorsByReporterRequest{ReporterAddress: reporterAddr.String()}) + require.NoError(t, err) + require.Equal(t, res.NumOfSelectors, int32(10)) +} + +func TestSpaceAvailableByReporter(t *testing.T) { + k, _, _, _, ctx, _ := setupKeeper(t) + querier := keeper.NewQuerier(k) + + reporterAddr := sample.AccAddressBytes() + for i := 0; i < 10; i++ { + err := k.Selectors.Set(ctx, sample.AccAddressBytes(), types.NewSelection(reporterAddr, 1)) + require.NoError(t, err) + } + + res, err := querier.SpaceAvailableByReporter(ctx, &types.QuerySpaceAvailableByReporterRequest{ReporterAddress: reporterAddr.String()}) + require.NoError(t, err) + require.Equal(t, res.SpaceAvailable, int32(90)) +} diff --git a/x/reporter/keeper/reporter.go b/x/reporter/keeper/reporter.go index 7a045f0cf..2a190f698 100644 --- a/x/reporter/keeper/reporter.go +++ b/x/reporter/keeper/reporter.go @@ -183,3 +183,15 @@ func (k Keeper) Delegation(ctx context.Context, delegator sdk.AccAddress) (types func (k Keeper) Reporter(ctx context.Context, reporter sdk.AccAddress) (types.OracleReporter, error) { return k.Reporters.Get(ctx, reporter.Bytes()) } + +func (k Keeper) GetNumOfSelectors(ctx context.Context, repAddr sdk.AccAddress) (int, error) { + iter, err := k.Selectors.Indexes.Reporter.MatchExact(ctx, repAddr.Bytes()) + if err != nil { + return 0, err + } + keys, err := iter.FullKeys() + if err != nil { + return 0, err + } + return len(keys), nil +} diff --git a/x/reporter/module/autocli.go b/x/reporter/module/autocli.go index 7cc29a75d..c2f826059 100644 --- a/x/reporter/module/autocli.go +++ b/x/reporter/module/autocli.go @@ -35,6 +35,18 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { Short: "Query current allowed amount to stake or unstake", PositionalArgs: []*autocliv1.PositionalArgDescriptor{}, }, + { + RpcMethod: "NumOfSelectorsByReporter", + Use: "num-of-selectors-by-reporter", + Short: "Query how many selectors a reporter has", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "reporter_address"}}, + }, + { + RpcMethod: "SpaceAvailableByReporter", + Use: "space-available-by-reporter", + Short: "Query how much space a reporter has", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "reporter_address"}}, + }, // this line is used by ignite scaffolding # autocli/query }, }, diff --git a/x/reporter/types/query.pb.go b/x/reporter/types/query.pb.go index 50848b24e..182a00202 100644 --- a/x/reporter/types/query.pb.go +++ b/x/reporter/types/query.pb.go @@ -432,6 +432,180 @@ func (m *QueryAllowedAmountResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryAllowedAmountResponse proto.InternalMessageInfo +// QueryNumOfSelectorsByReporterRequest is the request type for the +// Query/NumOfSelectorsByReporter RPC method. +type QueryNumOfSelectorsByReporterRequest struct { + // reporter_address defines the reporter address to query for. + ReporterAddress string `protobuf:"bytes,1,opt,name=reporter_address,json=reporterAddress,proto3" json:"reporter_address,omitempty"` +} + +func (m *QueryNumOfSelectorsByReporterRequest) Reset() { *m = QueryNumOfSelectorsByReporterRequest{} } +func (m *QueryNumOfSelectorsByReporterRequest) String() string { return proto.CompactTextString(m) } +func (*QueryNumOfSelectorsByReporterRequest) ProtoMessage() {} +func (*QueryNumOfSelectorsByReporterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{9} +} +func (m *QueryNumOfSelectorsByReporterRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryNumOfSelectorsByReporterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryNumOfSelectorsByReporterRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryNumOfSelectorsByReporterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryNumOfSelectorsByReporterRequest.Merge(m, src) +} +func (m *QueryNumOfSelectorsByReporterRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryNumOfSelectorsByReporterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryNumOfSelectorsByReporterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryNumOfSelectorsByReporterRequest proto.InternalMessageInfo + +// QueryNumOfSelectorsByReporterResponse is the response type for the +// Query/NumOfSelectorsByReporter RPC method. +type QueryNumOfSelectorsByReporterResponse struct { + // num_of_selectors defines the number of selectors by a reporter. + NumOfSelectors int32 `protobuf:"varint,1,opt,name=num_of_selectors,json=numOfSelectors,proto3" json:"num_of_selectors,omitempty"` +} + +func (m *QueryNumOfSelectorsByReporterResponse) Reset() { *m = QueryNumOfSelectorsByReporterResponse{} } +func (m *QueryNumOfSelectorsByReporterResponse) String() string { return proto.CompactTextString(m) } +func (*QueryNumOfSelectorsByReporterResponse) ProtoMessage() {} +func (*QueryNumOfSelectorsByReporterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{10} +} +func (m *QueryNumOfSelectorsByReporterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryNumOfSelectorsByReporterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryNumOfSelectorsByReporterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryNumOfSelectorsByReporterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryNumOfSelectorsByReporterResponse.Merge(m, src) +} +func (m *QueryNumOfSelectorsByReporterResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryNumOfSelectorsByReporterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryNumOfSelectorsByReporterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryNumOfSelectorsByReporterResponse proto.InternalMessageInfo + +func (m *QueryNumOfSelectorsByReporterResponse) GetNumOfSelectors() int32 { + if m != nil { + return m.NumOfSelectors + } + return 0 +} + +// QuerySpaceAvailableByReporterRequest is the request type for the +// Query/SpaceAvailableByReporter RPC method. +type QuerySpaceAvailableByReporterRequest struct { + // reporter_address defines the reporter address to query for. + ReporterAddress string `protobuf:"bytes,1,opt,name=reporter_address,json=reporterAddress,proto3" json:"reporter_address,omitempty"` +} + +func (m *QuerySpaceAvailableByReporterRequest) Reset() { *m = QuerySpaceAvailableByReporterRequest{} } +func (m *QuerySpaceAvailableByReporterRequest) String() string { return proto.CompactTextString(m) } +func (*QuerySpaceAvailableByReporterRequest) ProtoMessage() {} +func (*QuerySpaceAvailableByReporterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{11} +} +func (m *QuerySpaceAvailableByReporterRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySpaceAvailableByReporterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySpaceAvailableByReporterRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySpaceAvailableByReporterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySpaceAvailableByReporterRequest.Merge(m, src) +} +func (m *QuerySpaceAvailableByReporterRequest) XXX_Size() int { + return m.Size() +} +func (m *QuerySpaceAvailableByReporterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySpaceAvailableByReporterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySpaceAvailableByReporterRequest proto.InternalMessageInfo + +// QuerySpaceAvailableByReporterResponse is the response type for the +// Query/SpaceAvailableByReporter RPC method. +type QuerySpaceAvailableByReporterResponse struct { + // space_available defines the space available in a reporter. + SpaceAvailable int32 `protobuf:"varint,1,opt,name=space_available,json=spaceAvailable,proto3" json:"space_available,omitempty"` +} + +func (m *QuerySpaceAvailableByReporterResponse) Reset() { *m = QuerySpaceAvailableByReporterResponse{} } +func (m *QuerySpaceAvailableByReporterResponse) String() string { return proto.CompactTextString(m) } +func (*QuerySpaceAvailableByReporterResponse) ProtoMessage() {} +func (*QuerySpaceAvailableByReporterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{12} +} +func (m *QuerySpaceAvailableByReporterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySpaceAvailableByReporterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySpaceAvailableByReporterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySpaceAvailableByReporterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySpaceAvailableByReporterResponse.Merge(m, src) +} +func (m *QuerySpaceAvailableByReporterResponse) XXX_Size() int { + return m.Size() +} +func (m *QuerySpaceAvailableByReporterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySpaceAvailableByReporterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySpaceAvailableByReporterResponse proto.InternalMessageInfo + +func (m *QuerySpaceAvailableByReporterResponse) GetSpaceAvailable() int32 { + if m != nil { + return m.SpaceAvailable + } + return 0 +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "layer.reporter.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "layer.reporter.QueryParamsResponse") @@ -442,59 +616,74 @@ func init() { proto.RegisterType((*QuerySelectorReporterResponse)(nil), "layer.reporter.QuerySelectorReporterResponse") proto.RegisterType((*QueryAllowedAmountRequest)(nil), "layer.reporter.QueryAllowedAmountRequest") proto.RegisterType((*QueryAllowedAmountResponse)(nil), "layer.reporter.QueryAllowedAmountResponse") + proto.RegisterType((*QueryNumOfSelectorsByReporterRequest)(nil), "layer.reporter.QueryNumOfSelectorsByReporterRequest") + proto.RegisterType((*QueryNumOfSelectorsByReporterResponse)(nil), "layer.reporter.QueryNumOfSelectorsByReporterResponse") + proto.RegisterType((*QuerySpaceAvailableByReporterRequest)(nil), "layer.reporter.QuerySpaceAvailableByReporterRequest") + proto.RegisterType((*QuerySpaceAvailableByReporterResponse)(nil), "layer.reporter.QuerySpaceAvailableByReporterResponse") } func init() { proto.RegisterFile("layer/reporter/query.proto", fileDescriptor_a043abc58a7b99a9) } var fileDescriptor_a043abc58a7b99a9 = []byte{ - // 742 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcf, 0x4f, 0x13, 0x4f, - 0x14, 0xef, 0xf2, 0xfd, 0x8a, 0x74, 0x08, 0x3f, 0x1c, 0x81, 0x94, 0x05, 0xb7, 0x64, 0x11, 0xac, - 0xc5, 0xee, 0x4a, 0x35, 0x26, 0x72, 0x30, 0x82, 0x11, 0xc3, 0x49, 0x5c, 0xa2, 0x07, 0x2f, 0xcd, - 0xb4, 0x9d, 0x2c, 0x1b, 0x76, 0x77, 0x96, 0xd9, 0xa9, 0x8a, 0xc4, 0x8b, 0x17, 0x3d, 0x9a, 0x78, - 0xd1, 0x1b, 0x47, 0x8f, 0x1e, 0x48, 0xfc, 0x17, 0x38, 0x12, 0xbc, 0x18, 0x0f, 0xc4, 0x50, 0x13, - 0xfd, 0x33, 0x4c, 0xe7, 0x47, 0x4b, 0x97, 0x56, 0xf0, 0xd2, 0xec, 0xbc, 0xf7, 0x79, 0x9f, 0xf7, - 0x79, 0x9f, 0x7d, 0xd3, 0x05, 0xba, 0x8f, 0xb6, 0x30, 0xb5, 0x29, 0x8e, 0x08, 0x65, 0x98, 0xda, - 0x9b, 0x35, 0x4c, 0xb7, 0xac, 0x88, 0x12, 0x46, 0xe0, 0x20, 0xcf, 0x59, 0x2a, 0xa7, 0x5f, 0x40, - 0x81, 0x17, 0x12, 0x9b, 0xff, 0x0a, 0x88, 0x9e, 0xaf, 0x90, 0x38, 0x20, 0xb1, 0x5d, 0x46, 0x31, - 0x16, 0xb5, 0xf6, 0xb3, 0xf9, 0x32, 0x66, 0x68, 0xde, 0x8e, 0x90, 0xeb, 0x85, 0x88, 0x79, 0x24, - 0x94, 0x58, 0xe3, 0x38, 0x56, 0xa1, 0x2a, 0xc4, 0x53, 0xf9, 0x71, 0x91, 0x2f, 0xf1, 0x93, 0x2d, - 0x0e, 0x32, 0x35, 0xe2, 0x12, 0x97, 0x88, 0x78, 0xe3, 0x49, 0x46, 0x27, 0x5d, 0x42, 0x5c, 0x1f, - 0xdb, 0x28, 0xf2, 0x6c, 0x14, 0x86, 0x84, 0xf1, 0x6e, 0xaa, 0xe6, 0x72, 0x62, 0x32, 0x42, 0x51, - 0xc5, 0xc7, 0x25, 0x75, 0x96, 0xa8, 0x89, 0x04, 0x2a, 0x42, 0x14, 0x05, 0x92, 0xc2, 0x1c, 0x01, - 0xf0, 0x51, 0x63, 0xa6, 0x55, 0x1e, 0x74, 0xf0, 0x66, 0x0d, 0xc7, 0xcc, 0x5c, 0x05, 0x17, 0xdb, - 0xa2, 0x71, 0x44, 0xc2, 0x18, 0xc3, 0xdb, 0xa0, 0x57, 0x14, 0x67, 0xb4, 0x29, 0x2d, 0xd7, 0x5f, - 0x1c, 0xb3, 0xda, 0xed, 0xb3, 0x04, 0x7e, 0x29, 0xbd, 0x77, 0x98, 0x4d, 0x7d, 0xfa, 0xf5, 0x39, - 0xaf, 0x39, 0xb2, 0xc0, 0x2c, 0x81, 0x51, 0xce, 0xe8, 0x48, 0xa8, 0x6a, 0x05, 0x97, 0x01, 0x68, - 0xd9, 0x28, 0x79, 0x67, 0x2d, 0x69, 0x4d, 0xc3, 0x47, 0x4b, 0xbc, 0x2f, 0xe9, 0xa6, 0xb5, 0x8a, - 0x5c, 0x2c, 0x6b, 0x9d, 0x63, 0x95, 0xe6, 0x4b, 0xd0, 0xa7, 0x64, 0xc0, 0x22, 0x38, 0x8f, 0xaa, - 0x55, 0x8a, 0x63, 0x21, 0x34, 0xbd, 0x94, 0x39, 0xd8, 0x2d, 0x8c, 0x48, 0xce, 0x45, 0x91, 0x59, - 0x63, 0xd4, 0x0b, 0x5d, 0x47, 0x01, 0xe1, 0x02, 0xe8, 0x0b, 0x30, 0x43, 0x55, 0xc4, 0x50, 0xa6, - 0x87, 0xab, 0x30, 0x92, 0xd3, 0x3d, 0xe4, 0xf6, 0xaa, 0x09, 0x9c, 0x26, 0xde, 0xfc, 0xa8, 0x81, - 0xb1, 0xe4, 0x74, 0xd2, 0xb2, 0x5b, 0x20, 0xad, 0xea, 0x1b, 0x62, 0xfe, 0xcb, 0xf5, 0x17, 0x33, - 0x49, 0x5e, 0xf5, 0xe0, 0xb4, 0xa0, 0xf0, 0x41, 0x9b, 0x2d, 0x42, 0xd0, 0x95, 0x53, 0x6d, 0x11, - 0x4d, 0xdb, 0x7c, 0x09, 0xc0, 0x24, 0x97, 0xb6, 0x86, 0x7d, 0x5c, 0x61, 0x84, 0x36, 0xe5, 0x4b, - 0xff, 0xef, 0x81, 0xe1, 0x58, 0xa6, 0x4a, 0x67, 0x35, 0x6d, 0x48, 0x55, 0xc8, 0xf0, 0x42, 0xdf, - 0xdb, 0x9d, 0x6c, 0xea, 0xf7, 0x4e, 0x36, 0x65, 0x3e, 0x06, 0x97, 0xba, 0xb4, 0x93, 0x86, 0xdc, - 0x6c, 0xbd, 0xa7, 0x53, 0xfb, 0x34, 0x91, 0xe6, 0x04, 0x18, 0xe7, 0xb4, 0x8b, 0xbe, 0x4f, 0x9e, - 0xe3, 0xea, 0x62, 0x40, 0x6a, 0x21, 0x53, 0xdb, 0xba, 0xa7, 0x01, 0xbd, 0x53, 0x56, 0x76, 0x74, - 0xc0, 0x60, 0xcc, 0xd0, 0x86, 0x17, 0xba, 0x25, 0xc4, 0x33, 0xb2, 0xef, 0x5c, 0x63, 0x4b, 0xbf, - 0x1f, 0x66, 0x47, 0x45, 0xef, 0xb8, 0xba, 0x61, 0x79, 0xc4, 0x0e, 0x10, 0x5b, 0xb7, 0x56, 0x42, - 0x76, 0xb0, 0x5b, 0x00, 0x52, 0xd4, 0x4a, 0xc8, 0x9c, 0x01, 0x49, 0x21, 0xb8, 0xe1, 0x13, 0x30, - 0x5c, 0x0b, 0x13, 0xac, 0x3d, 0xff, 0xce, 0x3a, 0xd4, 0x24, 0x11, 0xbc, 0xc5, 0xfa, 0xff, 0xe0, - 0x1c, 0x1f, 0x05, 0x6e, 0x83, 0x5e, 0x71, 0x9b, 0xa0, 0x99, 0xdc, 0x97, 0x93, 0x17, 0x56, 0x9f, - 0xfe, 0x2b, 0x46, 0x18, 0x61, 0xe6, 0x5e, 0x7f, 0xfd, 0xf9, 0xbe, 0xc7, 0x84, 0x53, 0x36, 0xc3, - 0xbe, 0x4f, 0x68, 0xc1, 0x23, 0x76, 0xc7, 0xff, 0x06, 0xf8, 0x46, 0x03, 0xe9, 0xe6, 0x2e, 0xc3, - 0x99, 0x8e, 0xe4, 0xc9, 0x9b, 0xac, 0xcf, 0x9e, 0x06, 0x93, 0x32, 0xe6, 0xb8, 0x8c, 0x19, 0x38, - 0xdd, 0x5d, 0x46, 0xeb, 0x1e, 0x7c, 0xd1, 0xc0, 0x70, 0x72, 0x97, 0xe0, 0xb5, 0x8e, 0x9d, 0xba, - 0x6c, 0xb8, 0x5e, 0x38, 0x23, 0x5a, 0xca, 0x5b, 0xe6, 0xf2, 0xee, 0xc2, 0x3b, 0xdd, 0xe5, 0xa9, - 0xf5, 0x2f, 0x34, 0x23, 0xdb, 0xc9, 0x3b, 0xf4, 0x0a, 0x7e, 0xd0, 0xc0, 0x40, 0xdb, 0x42, 0xc2, - 0xab, 0x1d, 0x85, 0x74, 0x5a, 0x69, 0x3d, 0x7f, 0x16, 0xa8, 0x14, 0x7c, 0x9d, 0x0b, 0xce, 0xc3, - 0x5c, 0x77, 0xc1, 0x48, 0x14, 0x16, 0xc4, 0xa6, 0x2e, 0xdd, 0xdf, 0x3b, 0x32, 0xb4, 0xfd, 0x23, - 0x43, 0xfb, 0x71, 0x64, 0x68, 0xef, 0xea, 0x46, 0x6a, 0xbf, 0x6e, 0xa4, 0xbe, 0xd5, 0x8d, 0xd4, - 0xd3, 0x39, 0xd7, 0x63, 0xeb, 0xb5, 0xb2, 0x55, 0x21, 0xc1, 0x09, 0xb6, 0x17, 0x2d, 0x3e, 0xb6, - 0x15, 0xe1, 0xb8, 0xdc, 0xcb, 0x3f, 0x21, 0x37, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x09, 0x44, - 0x57, 0x52, 0x61, 0x07, 0x00, 0x00, + // 917 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcf, 0x8f, 0xdb, 0x44, + 0x14, 0x8e, 0x17, 0x75, 0x49, 0xa6, 0xea, 0x6e, 0x18, 0xb6, 0x55, 0xea, 0x16, 0xa7, 0x72, 0xbb, + 0x6d, 0xc8, 0x62, 0x9b, 0x86, 0x82, 0x44, 0x0f, 0x88, 0x04, 0x51, 0x58, 0x90, 0x68, 0xd6, 0x2b, + 0x38, 0x70, 0xb1, 0x26, 0xc9, 0xac, 0x6b, 0xd5, 0xf6, 0xb8, 0xf6, 0xb8, 0x10, 0xaa, 0x5e, 0xb8, + 0xc0, 0x11, 0x89, 0x0b, 0x48, 0x1c, 0x7a, 0xe4, 0xc8, 0xa1, 0x12, 0xff, 0xc2, 0x1e, 0xab, 0x72, + 0x81, 0x1e, 0x2a, 0xb4, 0x8b, 0x04, 0x7f, 0x06, 0xca, 0xfc, 0x70, 0x36, 0x5e, 0xbb, 0x4e, 0x0f, + 0xbd, 0x44, 0x9e, 0x79, 0xdf, 0x7b, 0xef, 0x7b, 0xdf, 0xcc, 0x7c, 0x0a, 0x50, 0x7d, 0x34, 0xc5, + 0xb1, 0x15, 0xe3, 0x88, 0xc4, 0x14, 0xc7, 0xd6, 0x9d, 0x14, 0xc7, 0x53, 0x33, 0x8a, 0x09, 0x25, + 0x70, 0x8d, 0xc5, 0x4c, 0x19, 0x53, 0x5f, 0x41, 0x81, 0x17, 0x12, 0x8b, 0xfd, 0x72, 0x88, 0xda, + 0x1d, 0x93, 0x24, 0x20, 0x89, 0x35, 0x42, 0x09, 0xe6, 0xb9, 0xd6, 0xdd, 0xab, 0x23, 0x4c, 0xd1, + 0x55, 0x2b, 0x42, 0xae, 0x17, 0x22, 0xea, 0x91, 0x50, 0x60, 0xb5, 0xa3, 0x58, 0x89, 0x1a, 0x13, + 0x4f, 0xc6, 0xcf, 0xf2, 0xb8, 0xc3, 0x56, 0x16, 0x5f, 0x88, 0xd0, 0x86, 0x4b, 0x5c, 0xc2, 0xf7, + 0x67, 0x5f, 0x62, 0xf7, 0xbc, 0x4b, 0x88, 0xeb, 0x63, 0x0b, 0x45, 0x9e, 0x85, 0xc2, 0x90, 0x50, + 0xd6, 0x4d, 0xe6, 0x5c, 0xca, 0x4d, 0x46, 0x62, 0x34, 0xf6, 0xb1, 0x23, 0xd7, 0x02, 0x75, 0x2e, + 0x87, 0x8a, 0x50, 0x8c, 0x02, 0x51, 0x42, 0xdf, 0x00, 0x70, 0x67, 0x36, 0xd3, 0x90, 0x6d, 0xda, + 0xf8, 0x4e, 0x8a, 0x13, 0xaa, 0x0f, 0xc1, 0xab, 0x0b, 0xbb, 0x49, 0x44, 0xc2, 0x04, 0xc3, 0x77, + 0xc1, 0x2a, 0x4f, 0x6e, 0x29, 0x17, 0x94, 0xce, 0xc9, 0xde, 0x19, 0x73, 0x51, 0x3e, 0x93, 0xe3, + 0x07, 0x8d, 0xfd, 0xa7, 0xed, 0xda, 0xaf, 0xff, 0xfe, 0xd6, 0x55, 0x6c, 0x91, 0xa0, 0x3b, 0xe0, + 0x34, 0xab, 0x68, 0x0b, 0xa8, 0x6c, 0x05, 0x6f, 0x00, 0x30, 0x97, 0x51, 0xd4, 0xbd, 0x6c, 0x0a, + 0x69, 0x66, 0x3a, 0x9a, 0xfc, 0xbc, 0x84, 0x9a, 0xe6, 0x10, 0xb9, 0x58, 0xe4, 0xda, 0x47, 0x32, + 0xf5, 0x6f, 0x40, 0x5d, 0xd2, 0x80, 0x3d, 0xf0, 0x32, 0x9a, 0x4c, 0x62, 0x9c, 0x70, 0xa2, 0x8d, + 0x41, 0xeb, 0xf1, 0x43, 0x63, 0x43, 0xd4, 0xec, 0xf3, 0xc8, 0x2e, 0x8d, 0xbd, 0xd0, 0xb5, 0x25, + 0x10, 0x5e, 0x07, 0xf5, 0x00, 0x53, 0x34, 0x41, 0x14, 0xb5, 0x56, 0x18, 0x0b, 0x2d, 0x3f, 0xdd, + 0x4d, 0x26, 0xaf, 0x9c, 0xc0, 0xce, 0xf0, 0xfa, 0xcf, 0x0a, 0x38, 0x93, 0x9f, 0x4e, 0x48, 0xf6, + 0x0e, 0x68, 0xc8, 0xfc, 0x19, 0x99, 0x97, 0x3a, 0x27, 0x7b, 0xad, 0x7c, 0x5d, 0xf9, 0x61, 0xcf, + 0xa1, 0xf0, 0xa3, 0x05, 0x59, 0x38, 0xa1, 0x2b, 0x95, 0xb2, 0xf0, 0xa6, 0x0b, 0xba, 0x04, 0xe0, + 0x3c, 0xa3, 0xb6, 0x8b, 0x7d, 0x3c, 0xa6, 0x24, 0xce, 0xe8, 0x0b, 0xfd, 0x3f, 0x00, 0xcd, 0x44, + 0x84, 0x9c, 0x65, 0x45, 0x5b, 0x97, 0x19, 0x62, 0xfb, 0x7a, 0xfd, 0xfb, 0x07, 0xed, 0xda, 0x7f, + 0x0f, 0xda, 0x35, 0xfd, 0x73, 0xf0, 0x5a, 0x49, 0x3b, 0x21, 0xc8, 0xb5, 0xf9, 0x39, 0x55, 0xf6, + 0xc9, 0x90, 0xfa, 0x39, 0x70, 0x96, 0x95, 0xed, 0xfb, 0x3e, 0xf9, 0x0a, 0x4f, 0xfa, 0x01, 0x49, + 0x43, 0x2a, 0x6f, 0xeb, 0xbe, 0x02, 0xd4, 0xa2, 0xa8, 0xe8, 0x68, 0x83, 0xb5, 0x84, 0xa2, 0xdb, + 0x5e, 0xe8, 0x3a, 0x88, 0x45, 0x44, 0xdf, 0xad, 0xd9, 0x2d, 0x7d, 0xf2, 0xb4, 0x7d, 0x9a, 0xf7, + 0x4e, 0x26, 0xb7, 0x4d, 0x8f, 0x58, 0x01, 0xa2, 0xb7, 0xcc, 0xed, 0x90, 0x3e, 0x7e, 0x68, 0x00, + 0x41, 0x6a, 0x3b, 0xa4, 0xf6, 0x29, 0x51, 0x82, 0xd7, 0x86, 0x5f, 0x80, 0x66, 0x1a, 0xe6, 0xaa, + 0xae, 0x3c, 0x7f, 0xd5, 0xf5, 0xac, 0x08, 0xaf, 0xab, 0xa7, 0xe0, 0x12, 0x9b, 0xe4, 0xb3, 0x34, + 0xb8, 0xb9, 0x27, 0x35, 0x4c, 0x06, 0xd3, 0x82, 0x53, 0x93, 0xda, 0x2c, 0x7f, 0x6a, 0x32, 0xe3, + 0xf8, 0xa9, 0xed, 0x80, 0xcd, 0x8a, 0xb6, 0x42, 0xcb, 0x0e, 0x68, 0x86, 0x69, 0xe0, 0x90, 0x3d, + 0x47, 0x5e, 0x01, 0xde, 0xf7, 0x84, 0xbd, 0x16, 0x2e, 0xe4, 0x66, 0x93, 0xec, 0x46, 0x68, 0x8c, + 0xfb, 0x77, 0x91, 0xe7, 0xa3, 0x91, 0x8f, 0x5f, 0xf8, 0x24, 0x43, 0x31, 0x49, 0x79, 0x5b, 0x31, + 0xc9, 0x15, 0xb0, 0x9e, 0xcc, 0x30, 0x0e, 0x92, 0x20, 0x39, 0x48, 0xb2, 0x90, 0xda, 0xfb, 0xa5, + 0x0e, 0x4e, 0xb0, 0x92, 0xf0, 0x1e, 0x58, 0xe5, 0x06, 0x07, 0xf5, 0xfc, 0x13, 0x3e, 0xee, 0xa1, + 0xea, 0xc5, 0x67, 0x62, 0x38, 0x0b, 0xbd, 0xf3, 0xed, 0x1f, 0xff, 0xfc, 0xb8, 0xa2, 0xc3, 0x0b, + 0x16, 0xc5, 0xbe, 0x4f, 0x62, 0xc3, 0x23, 0x56, 0xa1, 0x5d, 0xc3, 0xef, 0x14, 0xd0, 0xc8, 0xec, + 0x05, 0x6e, 0x16, 0x16, 0xcf, 0x9b, 0xab, 0x7a, 0xb9, 0x0a, 0x26, 0x68, 0x6c, 0x31, 0x1a, 0x9b, + 0xf0, 0x62, 0x39, 0x8d, 0xb9, 0x35, 0xfd, 0xae, 0x80, 0x66, 0xfe, 0x79, 0xc3, 0x37, 0x0a, 0x3b, + 0x95, 0x98, 0x8e, 0x6a, 0x2c, 0x89, 0x16, 0xf4, 0x6e, 0x30, 0x7a, 0xef, 0xc3, 0xf7, 0xca, 0xe9, + 0xc9, 0xeb, 0x68, 0x64, 0x3b, 0xf7, 0xf2, 0xb6, 0x76, 0x1f, 0xfe, 0xa4, 0x80, 0x53, 0x0b, 0x1e, + 0x01, 0x5f, 0x2f, 0x24, 0x52, 0xe4, 0x32, 0x6a, 0x77, 0x19, 0xa8, 0x20, 0xfc, 0x26, 0x23, 0xdc, + 0x85, 0x9d, 0x72, 0xc2, 0x88, 0x27, 0x1a, 0xdc, 0x3c, 0xe0, 0x13, 0x05, 0xb4, 0xca, 0x5e, 0x1f, + 0xbc, 0x56, 0xd8, 0xba, 0xc2, 0x23, 0xd4, 0xb7, 0x9f, 0x33, 0x4b, 0x70, 0xdf, 0x61, 0xdc, 0x3f, + 0x85, 0xdb, 0xe5, 0xdc, 0xc3, 0x34, 0x30, 0xc8, 0x9e, 0x91, 0x59, 0x80, 0x31, 0x9a, 0x1e, 0xd1, + 0x3d, 0xff, 0x9c, 0xef, 0xc3, 0xbf, 0x14, 0xd0, 0x2a, 0x7b, 0x90, 0x25, 0xc3, 0x55, 0xd8, 0x46, + 0xc9, 0x70, 0x55, 0xaf, 0x5e, 0x1f, 0xb2, 0xe1, 0x3e, 0x81, 0x1f, 0x3f, 0xe3, 0x26, 0xcd, 0x6a, + 0x18, 0x99, 0x2b, 0x54, 0xcc, 0x36, 0xf8, 0x70, 0xff, 0x40, 0x53, 0x1e, 0x1d, 0x68, 0xca, 0xdf, + 0x07, 0x9a, 0xf2, 0xc3, 0xa1, 0x56, 0x7b, 0x74, 0xa8, 0xd5, 0xfe, 0x3c, 0xd4, 0x6a, 0x5f, 0x6e, + 0xb9, 0x1e, 0xbd, 0x95, 0x8e, 0xcc, 0x31, 0x09, 0x8e, 0x75, 0xfb, 0x7a, 0xde, 0x8f, 0x4e, 0x23, + 0x9c, 0x8c, 0x56, 0xd9, 0xdf, 0xb1, 0xb7, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x8e, 0x41, + 0x76, 0xad, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -517,6 +706,10 @@ type QueryClient interface { SelectorReporter(ctx context.Context, in *QuerySelectorReporterRequest, opts ...grpc.CallOption) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(ctx context.Context, in *QueryAllowedAmountRequest, opts ...grpc.CallOption) (*QueryAllowedAmountResponse, error) + // NumOfSelectorsByReporter queries the number of selectors by a reporter. + NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) + // SpaceAvailableByReporter queries the space available in a reporter. + SpaceAvailableByReporter(ctx context.Context, in *QuerySpaceAvailableByReporterRequest, opts ...grpc.CallOption) (*QuerySpaceAvailableByReporterResponse, error) } type queryClient struct { @@ -563,6 +756,24 @@ func (c *queryClient) AllowedAmount(ctx context.Context, in *QueryAllowedAmountR return out, nil } +func (c *queryClient) NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) { + out := new(QueryNumOfSelectorsByReporterResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/NumOfSelectorsByReporter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) SpaceAvailableByReporter(ctx context.Context, in *QuerySpaceAvailableByReporterRequest, opts ...grpc.CallOption) (*QuerySpaceAvailableByReporterResponse, error) { + out := new(QuerySpaceAvailableByReporterResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/SpaceAvailableByReporter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Parameters queries the parameters of the module. @@ -573,6 +784,10 @@ type QueryServer interface { SelectorReporter(context.Context, *QuerySelectorReporterRequest) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) + // NumOfSelectorsByReporter queries the number of selectors by a reporter. + NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) + // SpaceAvailableByReporter queries the space available in a reporter. + SpaceAvailableByReporter(context.Context, *QuerySpaceAvailableByReporterRequest) (*QuerySpaceAvailableByReporterResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -591,6 +806,12 @@ func (*UnimplementedQueryServer) SelectorReporter(ctx context.Context, req *Quer func (*UnimplementedQueryServer) AllowedAmount(ctx context.Context, req *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllowedAmount not implemented") } +func (*UnimplementedQueryServer) NumOfSelectorsByReporter(ctx context.Context, req *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NumOfSelectorsByReporter not implemented") +} +func (*UnimplementedQueryServer) SpaceAvailableByReporter(ctx context.Context, req *QuerySpaceAvailableByReporterRequest) (*QuerySpaceAvailableByReporterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SpaceAvailableByReporter not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -668,6 +889,42 @@ func _Query_AllowedAmount_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Query_NumOfSelectorsByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNumOfSelectorsByReporterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).NumOfSelectorsByReporter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/NumOfSelectorsByReporter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).NumOfSelectorsByReporter(ctx, req.(*QueryNumOfSelectorsByReporterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_SpaceAvailableByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySpaceAvailableByReporterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).SpaceAvailableByReporter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/SpaceAvailableByReporter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).SpaceAvailableByReporter(ctx, req.(*QuerySpaceAvailableByReporterRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "layer.reporter.Query", HandlerType: (*QueryServer)(nil), @@ -688,6 +945,14 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "AllowedAmount", Handler: _Query_AllowedAmount_Handler, }, + { + MethodName: "NumOfSelectorsByReporter", + Handler: _Query_NumOfSelectorsByReporter_Handler, + }, + { + MethodName: "SpaceAvailableByReporter", + Handler: _Query_SpaceAvailableByReporter_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "layer/reporter/query.proto", @@ -1001,6 +1266,122 @@ func (m *QueryAllowedAmountResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *QueryNumOfSelectorsByReporterRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryNumOfSelectorsByReporterRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryNumOfSelectorsByReporterRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ReporterAddress) > 0 { + i -= len(m.ReporterAddress) + copy(dAtA[i:], m.ReporterAddress) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ReporterAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryNumOfSelectorsByReporterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryNumOfSelectorsByReporterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryNumOfSelectorsByReporterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NumOfSelectors != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.NumOfSelectors)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QuerySpaceAvailableByReporterRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySpaceAvailableByReporterRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySpaceAvailableByReporterRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ReporterAddress) > 0 { + i -= len(m.ReporterAddress) + copy(dAtA[i:], m.ReporterAddress) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ReporterAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QuerySpaceAvailableByReporterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySpaceAvailableByReporterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySpaceAvailableByReporterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SpaceAvailable != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.SpaceAvailable)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1129,21 +1510,71 @@ func (m *QueryAllowedAmountResponse) Size() (n int) { return n } -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func (m *QueryNumOfSelectorsByReporterRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ReporterAddress) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n } -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + +func (m *QueryNumOfSelectorsByReporterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NumOfSelectors != 0 { + n += 1 + sovQuery(uint64(m.NumOfSelectors)) + } + return n } -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery + +func (m *QuerySpaceAvailableByReporterRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ReporterAddress) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QuerySpaceAvailableByReporterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SpaceAvailable != 0 { + n += 1 + sovQuery(uint64(m.SpaceAvailable)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -1924,6 +2355,308 @@ func (m *QueryAllowedAmountResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryNumOfSelectorsByReporterRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryNumOfSelectorsByReporterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryNumOfSelectorsByReporterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReporterAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReporterAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryNumOfSelectorsByReporterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryNumOfSelectorsByReporterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryNumOfSelectorsByReporterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumOfSelectors", wireType) + } + m.NumOfSelectors = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumOfSelectors |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySpaceAvailableByReporterRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySpaceAvailableByReporterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySpaceAvailableByReporterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReporterAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReporterAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySpaceAvailableByReporterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySpaceAvailableByReporterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySpaceAvailableByReporterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceAvailable", wireType) + } + m.SpaceAvailable = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SpaceAvailable |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/reporter/types/query.pb.gw.go b/x/reporter/types/query.pb.gw.go index ac5e9756b..425631b7b 100644 --- a/x/reporter/types/query.pb.gw.go +++ b/x/reporter/types/query.pb.gw.go @@ -159,6 +159,114 @@ func local_request_Query_AllowedAmount_0(ctx context.Context, marshaler runtime. } +func request_Query_NumOfSelectorsByReporter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNumOfSelectorsByReporterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["reporter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "reporter_address") + } + + protoReq.ReporterAddress, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "reporter_address", err) + } + + msg, err := client.NumOfSelectorsByReporter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_NumOfSelectorsByReporter_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNumOfSelectorsByReporterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["reporter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "reporter_address") + } + + protoReq.ReporterAddress, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "reporter_address", err) + } + + msg, err := server.NumOfSelectorsByReporter(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_SpaceAvailableByReporter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySpaceAvailableByReporterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["reporter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "reporter_address") + } + + protoReq.ReporterAddress, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "reporter_address", err) + } + + msg, err := client.SpaceAvailableByReporter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_SpaceAvailableByReporter_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySpaceAvailableByReporterRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["reporter_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "reporter_address") + } + + protoReq.ReporterAddress, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "reporter_address", err) + } + + msg, err := server.SpaceAvailableByReporter(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -257,6 +365,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_NumOfSelectorsByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_NumOfSelectorsByReporter_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_NumOfSelectorsByReporter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SpaceAvailableByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SpaceAvailableByReporter_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SpaceAvailableByReporter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -378,6 +532,46 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_NumOfSelectorsByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_NumOfSelectorsByReporter_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_NumOfSelectorsByReporter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SpaceAvailableByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_SpaceAvailableByReporter_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SpaceAvailableByReporter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -389,6 +583,10 @@ var ( pattern_Query_SelectorReporter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"tellor-io", "layer", "reporter", "selector-reporter", "selector_address"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_AllowedAmount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"tellor-io", "layer", "reporter", "allowed-amount"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_NumOfSelectorsByReporter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"tellor-io", "layer", "reporter", "num-of-selectors-by-reporter", "reporter_address"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_SpaceAvailableByReporter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"tellor-io", "layer", "reporter", "space-available-by-reporter", "reporter_address"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -399,4 +597,8 @@ var ( forward_Query_SelectorReporter_0 = runtime.ForwardResponseMessage forward_Query_AllowedAmount_0 = runtime.ForwardResponseMessage + + forward_Query_NumOfSelectorsByReporter_0 = runtime.ForwardResponseMessage + + forward_Query_SpaceAvailableByReporter_0 = runtime.ForwardResponseMessage ) From 8568d560a6cbb0ea671e26551df443ee4573e8a9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 21:36:08 +0200 Subject: [PATCH 02/41] fix: release tag in header (#246) (#247) (cherry picked from commit 1113ec44634c67684f5a7d81064929443d08add2) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- .goreleaser.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 3c19d3f14..911e5da60 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -63,4 +63,4 @@ release: prerelease: auto draft: true header: | - ## Release {{ .CurrentTag }} - ({{ .Date }}) \ No newline at end of file + ## Release {{ .Tag }} - ({{ .Date }}) \ No newline at end of file From 294aaf25a0140561caa7400466fe3449e7becd49 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:26:36 -0400 Subject: [PATCH 03/41] playground tbr minting (#248) (#250) (cherry picked from commit 8eeed20a858678ade483a01fbb919a13227ad6d2) Co-authored-by: tkernell --- evm/contracts/testing/SimpleLayerUser.sol | 4 +++- evm/contracts/testing/TellorPlayground.sol | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/evm/contracts/testing/SimpleLayerUser.sol b/evm/contracts/testing/SimpleLayerUser.sol index b70ec8d58..15de1613f 100644 --- a/evm/contracts/testing/SimpleLayerUser.sol +++ b/evm/contracts/testing/SimpleLayerUser.sol @@ -14,6 +14,7 @@ contract SimpleLayerUser { uint256 aggregatePower; uint256 previousTimestamp; uint256 nextTimestamp; + uint256 relayTimestamp; } constructor(address _blobstreamO, bytes32 _queryId) { @@ -34,7 +35,8 @@ contract SimpleLayerUser { _attestData.attestationTimestamp, _attestData.report.aggregatePower, _attestData.report.previousTimestamp, - _attestData.report.nextTimestamp + _attestData.report.nextTimestamp, + block.timestamp ) ); } diff --git a/evm/contracts/testing/TellorPlayground.sol b/evm/contracts/testing/TellorPlayground.sol index dcd24828e..44b8688a5 100644 --- a/evm/contracts/testing/TellorPlayground.sol +++ b/evm/contracts/testing/TellorPlayground.sol @@ -43,6 +43,7 @@ contract TellorPlayground { uint8 private _decimals; address public oracleMintRecipient; uint256 public lastReleaseTimeDao; + address public deployer; // Structs struct StakeInfo { @@ -63,6 +64,7 @@ contract TellorPlayground { _decimals = 18; token = address(this); lastReleaseTimeDao = block.timestamp; + deployer = msg.sender; } /** @@ -144,8 +146,16 @@ contract TellorPlayground { uint256 _releasedAmount = (146.94 ether * (block.timestamp - lastReleaseTimeDao)) / 86400; - _mint(oracleMintRecipient, _releasedAmount); lastReleaseTimeDao = block.timestamp; + uint256 _stakingRewards = (_releasedAmount * 2) / 100; + _mint(oracleMintRecipient, _releasedAmount - _stakingRewards); + _mint(address(this), _stakingRewards); + _allowances[address(this)][ + oracleMintRecipient + ] = _stakingRewards; + TellorPlayground(oracleMintRecipient).addStakingRewards( + _stakingRewards + ); } /** @@ -169,6 +179,7 @@ contract TellorPlayground { * @param _oracle The new oracle mint recipient */ function setOracleMintRecipient(address _oracle) external { + require(msg.sender == deployer, "only deployer can set oracle mint recipient"); oracleMintRecipient = _oracle; } From 201858aa948a233268eada4994c0a9cf7b9c9254 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:27:03 -0400 Subject: [PATCH 04/41] stake update expiration getter (#249) (#251) (cherry picked from commit 3d8af49d5a692b342fcaea599fa00c7033ebf468) Co-authored-by: tkernell --- api/layer/reporter/query.pulsar.go | 1140 ++++++++-- api/layer/reporter/query_grpc.pb.go | 36 + docs/static/openapi.yml | 3012 +++++++++++++++++++++++---- proto/layer/reporter/query.proto | 11 + x/reporter/keeper/query.go | 9 + x/reporter/types/query.pb.go | 439 +++- x/reporter/types/query.pb.gw.go | 65 + 7 files changed, 4116 insertions(+), 596 deletions(-) diff --git a/api/layer/reporter/query.pulsar.go b/api/layer/reporter/query.pulsar.go index c6d5a2364..659bc163d 100644 --- a/api/layer/reporter/query.pulsar.go +++ b/api/layer/reporter/query.pulsar.go @@ -3996,6 +3996,766 @@ func (x *fastReflection_QueryAllowedAmountResponse) ProtoMethods() *protoiface.M } } +var ( + md_QueryAllowedAmountExpirationRequest protoreflect.MessageDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QueryAllowedAmountExpirationRequest = File_layer_reporter_query_proto.Messages().ByName("QueryAllowedAmountExpirationRequest") +} + +var _ protoreflect.Message = (*fastReflection_QueryAllowedAmountExpirationRequest)(nil) + +type fastReflection_QueryAllowedAmountExpirationRequest QueryAllowedAmountExpirationRequest + +func (x *QueryAllowedAmountExpirationRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryAllowedAmountExpirationRequest)(x) +} + +func (x *QueryAllowedAmountExpirationRequest) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryAllowedAmountExpirationRequest_messageType fastReflection_QueryAllowedAmountExpirationRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryAllowedAmountExpirationRequest_messageType{} + +type fastReflection_QueryAllowedAmountExpirationRequest_messageType struct{} + +func (x fastReflection_QueryAllowedAmountExpirationRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryAllowedAmountExpirationRequest)(nil) +} +func (x fastReflection_QueryAllowedAmountExpirationRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryAllowedAmountExpirationRequest) +} +func (x fastReflection_QueryAllowedAmountExpirationRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllowedAmountExpirationRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllowedAmountExpirationRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryAllowedAmountExpirationRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) New() protoreflect.Message { + return new(fastReflection_QueryAllowedAmountExpirationRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Interface() protoreflect.ProtoMessage { + return (*QueryAllowedAmountExpirationRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationRequest")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QueryAllowedAmountExpirationRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryAllowedAmountExpirationRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryAllowedAmountExpirationRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryAllowedAmountExpirationRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryAllowedAmountExpirationRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllowedAmountExpirationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllowedAmountExpirationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryAllowedAmountExpirationResponse protoreflect.MessageDescriptor + fd_QueryAllowedAmountExpirationResponse_expiration protoreflect.FieldDescriptor +) + +func init() { + file_layer_reporter_query_proto_init() + md_QueryAllowedAmountExpirationResponse = File_layer_reporter_query_proto.Messages().ByName("QueryAllowedAmountExpirationResponse") + fd_QueryAllowedAmountExpirationResponse_expiration = md_QueryAllowedAmountExpirationResponse.Fields().ByName("expiration") +} + +var _ protoreflect.Message = (*fastReflection_QueryAllowedAmountExpirationResponse)(nil) + +type fastReflection_QueryAllowedAmountExpirationResponse QueryAllowedAmountExpirationResponse + +func (x *QueryAllowedAmountExpirationResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryAllowedAmountExpirationResponse)(x) +} + +func (x *QueryAllowedAmountExpirationResponse) slowProtoReflect() protoreflect.Message { + mi := &file_layer_reporter_query_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryAllowedAmountExpirationResponse_messageType fastReflection_QueryAllowedAmountExpirationResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryAllowedAmountExpirationResponse_messageType{} + +type fastReflection_QueryAllowedAmountExpirationResponse_messageType struct{} + +func (x fastReflection_QueryAllowedAmountExpirationResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryAllowedAmountExpirationResponse)(nil) +} +func (x fastReflection_QueryAllowedAmountExpirationResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryAllowedAmountExpirationResponse) +} +func (x fastReflection_QueryAllowedAmountExpirationResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllowedAmountExpirationResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryAllowedAmountExpirationResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryAllowedAmountExpirationResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) New() protoreflect.Message { + return new(fastReflection_QueryAllowedAmountExpirationResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Interface() protoreflect.ProtoMessage { + return (*QueryAllowedAmountExpirationResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Expiration != int64(0) { + value := protoreflect.ValueOfInt64(x.Expiration) + if !f(fd_QueryAllowedAmountExpirationResponse_expiration, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + return x.Expiration != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + x.Expiration = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + value := x.Expiration + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + x.Expiration = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + panic(fmt.Errorf("field expiration of message layer.reporter.QueryAllowedAmountExpirationResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "layer.reporter.QueryAllowedAmountExpirationResponse.expiration": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: layer.reporter.QueryAllowedAmountExpirationResponse")) + } + panic(fmt.Errorf("message layer.reporter.QueryAllowedAmountExpirationResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in layer.reporter.QueryAllowedAmountExpirationResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryAllowedAmountExpirationResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryAllowedAmountExpirationResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.Expiration != 0 { + n += 1 + runtime.Sov(uint64(x.Expiration)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryAllowedAmountExpirationResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Expiration != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Expiration)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryAllowedAmountExpirationResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllowedAmountExpirationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryAllowedAmountExpirationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + x.Expiration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.Expiration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_QueryNumOfSelectorsByReporterRequest protoreflect.MessageDescriptor fd_QueryNumOfSelectorsByReporterRequest_reporter_address protoreflect.FieldDescriptor @@ -4016,7 +4776,7 @@ func (x *QueryNumOfSelectorsByReporterRequest) ProtoReflect() protoreflect.Messa } func (x *QueryNumOfSelectorsByReporterRequest) slowProtoReflect() protoreflect.Message { - mi := &file_layer_reporter_query_proto_msgTypes[9] + mi := &file_layer_reporter_query_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4436,7 +5196,7 @@ func (x *QueryNumOfSelectorsByReporterResponse) ProtoReflect() protoreflect.Mess } func (x *QueryNumOfSelectorsByReporterResponse) slowProtoReflect() protoreflect.Message { - mi := &file_layer_reporter_query_proto_msgTypes[10] + mi := &file_layer_reporter_query_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4840,7 +5600,7 @@ func (x *QuerySpaceAvailableByReporterRequest) ProtoReflect() protoreflect.Messa } func (x *QuerySpaceAvailableByReporterRequest) slowProtoReflect() protoreflect.Message { - mi := &file_layer_reporter_query_proto_msgTypes[11] + mi := &file_layer_reporter_query_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5260,7 +6020,7 @@ func (x *QuerySpaceAvailableByReporterResponse) ProtoReflect() protoreflect.Mess } func (x *QuerySpaceAvailableByReporterResponse) slowProtoReflect() protoreflect.Message { - mi := &file_layer_reporter_query_proto_msgTypes[12] + mi := &file_layer_reporter_query_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5993,6 +6753,67 @@ func (x *QueryAllowedAmountResponse) GetUnstakingAmount() string { return "" } +type QueryAllowedAmountExpirationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *QueryAllowedAmountExpirationRequest) Reset() { + *x = QueryAllowedAmountExpirationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllowedAmountExpirationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllowedAmountExpirationRequest) ProtoMessage() {} + +// Deprecated: Use QueryAllowedAmountExpirationRequest.ProtoReflect.Descriptor instead. +func (*QueryAllowedAmountExpirationRequest) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{9} +} + +type QueryAllowedAmountExpirationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Expiration int64 `protobuf:"varint,1,opt,name=expiration,proto3" json:"expiration,omitempty"` +} + +func (x *QueryAllowedAmountExpirationResponse) Reset() { + *x = QueryAllowedAmountExpirationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_layer_reporter_query_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllowedAmountExpirationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllowedAmountExpirationResponse) ProtoMessage() {} + +// Deprecated: Use QueryAllowedAmountExpirationResponse.ProtoReflect.Descriptor instead. +func (*QueryAllowedAmountExpirationResponse) Descriptor() ([]byte, []int) { + return file_layer_reporter_query_proto_rawDescGZIP(), []int{10} +} + +func (x *QueryAllowedAmountExpirationResponse) GetExpiration() int64 { + if x != nil { + return x.Expiration + } + return 0 +} + // QueryNumOfSelectorsByReporterRequest is the request type for the // Query/NumOfSelectorsByReporter RPC method. type QueryNumOfSelectorsByReporterRequest struct { @@ -6007,7 +6828,7 @@ type QueryNumOfSelectorsByReporterRequest struct { func (x *QueryNumOfSelectorsByReporterRequest) Reset() { *x = QueryNumOfSelectorsByReporterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_layer_reporter_query_proto_msgTypes[9] + mi := &file_layer_reporter_query_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6021,7 +6842,7 @@ func (*QueryNumOfSelectorsByReporterRequest) ProtoMessage() {} // Deprecated: Use QueryNumOfSelectorsByReporterRequest.ProtoReflect.Descriptor instead. func (*QueryNumOfSelectorsByReporterRequest) Descriptor() ([]byte, []int) { - return file_layer_reporter_query_proto_rawDescGZIP(), []int{9} + return file_layer_reporter_query_proto_rawDescGZIP(), []int{11} } func (x *QueryNumOfSelectorsByReporterRequest) GetReporterAddress() string { @@ -6045,7 +6866,7 @@ type QueryNumOfSelectorsByReporterResponse struct { func (x *QueryNumOfSelectorsByReporterResponse) Reset() { *x = QueryNumOfSelectorsByReporterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_layer_reporter_query_proto_msgTypes[10] + mi := &file_layer_reporter_query_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6059,7 +6880,7 @@ func (*QueryNumOfSelectorsByReporterResponse) ProtoMessage() {} // Deprecated: Use QueryNumOfSelectorsByReporterResponse.ProtoReflect.Descriptor instead. func (*QueryNumOfSelectorsByReporterResponse) Descriptor() ([]byte, []int) { - return file_layer_reporter_query_proto_rawDescGZIP(), []int{10} + return file_layer_reporter_query_proto_rawDescGZIP(), []int{12} } func (x *QueryNumOfSelectorsByReporterResponse) GetNumOfSelectors() int32 { @@ -6083,7 +6904,7 @@ type QuerySpaceAvailableByReporterRequest struct { func (x *QuerySpaceAvailableByReporterRequest) Reset() { *x = QuerySpaceAvailableByReporterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_layer_reporter_query_proto_msgTypes[11] + mi := &file_layer_reporter_query_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6097,7 +6918,7 @@ func (*QuerySpaceAvailableByReporterRequest) ProtoMessage() {} // Deprecated: Use QuerySpaceAvailableByReporterRequest.ProtoReflect.Descriptor instead. func (*QuerySpaceAvailableByReporterRequest) Descriptor() ([]byte, []int) { - return file_layer_reporter_query_proto_rawDescGZIP(), []int{11} + return file_layer_reporter_query_proto_rawDescGZIP(), []int{13} } func (x *QuerySpaceAvailableByReporterRequest) GetReporterAddress() string { @@ -6121,7 +6942,7 @@ type QuerySpaceAvailableByReporterResponse struct { func (x *QuerySpaceAvailableByReporterResponse) Reset() { *x = QuerySpaceAvailableByReporterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_layer_reporter_query_proto_msgTypes[12] + mi := &file_layer_reporter_query_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6135,7 +6956,7 @@ func (*QuerySpaceAvailableByReporterResponse) ProtoMessage() {} // Deprecated: Use QuerySpaceAvailableByReporterResponse.ProtoReflect.Descriptor instead. func (*QuerySpaceAvailableByReporterResponse) Descriptor() ([]byte, []int) { - return file_layer_reporter_query_proto_rawDescGZIP(), []int{12} + return file_layer_reporter_query_proto_rawDescGZIP(), []int{14} } func (x *QuerySpaceAvailableByReporterResponse) GetSpaceAvailable() int32 { @@ -6222,110 +7043,129 @@ var file_layer_reporter_query_proto_rawDesc = []byte{ 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0f, 0x75, 0x6e, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x24, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, - 0xa0, 0x1f, 0x00, 0x22, 0x51, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x25, 0x0a, 0x23, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x46, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x24, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, + 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, + 0x1f, 0x00, 0x22, 0x51, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x75, 0x6d, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x75, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, + 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x50, 0x0a, 0x25, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x32, 0xe0, + 0x09, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x7b, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x74, 0x65, 0x6c, + 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x12, + 0xb7, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x74, 0x65, 0x6c, 0x6c, + 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x74, 0x65, 0x6c, + 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2d, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xc1, 0x01, 0x0a, 0x17, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x33, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2d, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2d, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xda, 0x01, 0x0a, 0x18, 0x4e, 0x75, 0x6d, + 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x75, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, - 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x50, 0x0a, - 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x32, - 0x9c, 0x08, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x7b, 0x0a, 0x06, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, - 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6c, 0x61, + 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x74, 0x65, - 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x73, - 0x12, 0xb7, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x74, 0x65, 0x6c, + 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x2e, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x74, 0x65, - 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x2d, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xda, 0x01, 0x0a, 0x18, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x6e, 0x75, 0x6d, 0x2d, 0x6f, 0x66, 0x2d, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x2f, 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xd9, 0x01, 0x0a, 0x18, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, - 0x75, 0x6d, 0x4f, 0x66, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x52, + 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, + 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x2f, 0x6e, 0x75, 0x6d, 0x2d, 0x6f, 0x66, 0x2d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, - 0x7b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x7d, 0x12, 0xd9, 0x01, 0x0a, 0x18, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x34, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x61, 0x63, - 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, - 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2d, - 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x42, 0xa8, - 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0xa2, 0x02, 0x03, 0x4c, 0x52, 0x58, 0xaa, 0x02, 0x0e, 0x4c, 0x61, 0x79, 0x65, 0x72, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xca, 0x02, 0x0e, 0x4c, 0x61, 0x79, 0x65, - 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xe2, 0x02, 0x1a, 0x4c, 0x61, 0x79, - 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x3a, - 0x3a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x72, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2d, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x2d, 0x62, 0x79, 0x2d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2f, 0x7b, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x7d, 0x42, 0xa8, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x6c, 0x6c, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x4c, 0x52, 0x58, 0xaa, 0x02, 0x0e, 0x4c, 0x61, + 0x79, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xca, 0x02, 0x0e, 0x4c, + 0x61, 0x79, 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0xe2, 0x02, 0x1a, + 0x4c, 0x61, 0x79, 0x65, 0x72, 0x5c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x4c, 0x61, 0x79, + 0x65, 0x72, 0x3a, 0x3a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6340,7 +7180,7 @@ func file_layer_reporter_query_proto_rawDescGZIP() []byte { return file_layer_reporter_query_proto_rawDescData } -var file_layer_reporter_query_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_layer_reporter_query_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_layer_reporter_query_proto_goTypes = []interface{}{ (*QueryParamsRequest)(nil), // 0: layer.reporter.QueryParamsRequest (*QueryParamsResponse)(nil), // 1: layer.reporter.QueryParamsResponse @@ -6351,35 +7191,39 @@ var file_layer_reporter_query_proto_goTypes = []interface{}{ (*QuerySelectorReporterResponse)(nil), // 6: layer.reporter.QuerySelectorReporterResponse (*QueryAllowedAmountRequest)(nil), // 7: layer.reporter.QueryAllowedAmountRequest (*QueryAllowedAmountResponse)(nil), // 8: layer.reporter.QueryAllowedAmountResponse - (*QueryNumOfSelectorsByReporterRequest)(nil), // 9: layer.reporter.QueryNumOfSelectorsByReporterRequest - (*QueryNumOfSelectorsByReporterResponse)(nil), // 10: layer.reporter.QueryNumOfSelectorsByReporterResponse - (*QuerySpaceAvailableByReporterRequest)(nil), // 11: layer.reporter.QuerySpaceAvailableByReporterRequest - (*QuerySpaceAvailableByReporterResponse)(nil), // 12: layer.reporter.QuerySpaceAvailableByReporterResponse - (*Params)(nil), // 13: layer.reporter.Params - (*v1beta1.PageRequest)(nil), // 14: cosmos.base.query.v1beta1.PageRequest - (*OracleReporter)(nil), // 15: layer.reporter.OracleReporter - (*v1beta1.PageResponse)(nil), // 16: cosmos.base.query.v1beta1.PageResponse + (*QueryAllowedAmountExpirationRequest)(nil), // 9: layer.reporter.QueryAllowedAmountExpirationRequest + (*QueryAllowedAmountExpirationResponse)(nil), // 10: layer.reporter.QueryAllowedAmountExpirationResponse + (*QueryNumOfSelectorsByReporterRequest)(nil), // 11: layer.reporter.QueryNumOfSelectorsByReporterRequest + (*QueryNumOfSelectorsByReporterResponse)(nil), // 12: layer.reporter.QueryNumOfSelectorsByReporterResponse + (*QuerySpaceAvailableByReporterRequest)(nil), // 13: layer.reporter.QuerySpaceAvailableByReporterRequest + (*QuerySpaceAvailableByReporterResponse)(nil), // 14: layer.reporter.QuerySpaceAvailableByReporterResponse + (*Params)(nil), // 15: layer.reporter.Params + (*v1beta1.PageRequest)(nil), // 16: cosmos.base.query.v1beta1.PageRequest + (*OracleReporter)(nil), // 17: layer.reporter.OracleReporter + (*v1beta1.PageResponse)(nil), // 18: cosmos.base.query.v1beta1.PageResponse } var file_layer_reporter_query_proto_depIdxs = []int32{ - 13, // 0: layer.reporter.QueryParamsResponse.params:type_name -> layer.reporter.Params - 14, // 1: layer.reporter.QueryReportersRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 15, // 2: layer.reporter.reporter.metadata:type_name -> layer.reporter.OracleReporter + 15, // 0: layer.reporter.QueryParamsResponse.params:type_name -> layer.reporter.Params + 16, // 1: layer.reporter.QueryReportersRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 17, // 2: layer.reporter.reporter.metadata:type_name -> layer.reporter.OracleReporter 3, // 3: layer.reporter.QueryReportersResponse.reporters:type_name -> layer.reporter.reporter - 16, // 4: layer.reporter.QueryReportersResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 18, // 4: layer.reporter.QueryReportersResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 0, // 5: layer.reporter.Query.Params:input_type -> layer.reporter.QueryParamsRequest 2, // 6: layer.reporter.Query.Reporters:input_type -> layer.reporter.QueryReportersRequest 5, // 7: layer.reporter.Query.SelectorReporter:input_type -> layer.reporter.QuerySelectorReporterRequest 7, // 8: layer.reporter.Query.AllowedAmount:input_type -> layer.reporter.QueryAllowedAmountRequest - 9, // 9: layer.reporter.Query.NumOfSelectorsByReporter:input_type -> layer.reporter.QueryNumOfSelectorsByReporterRequest - 11, // 10: layer.reporter.Query.SpaceAvailableByReporter:input_type -> layer.reporter.QuerySpaceAvailableByReporterRequest - 1, // 11: layer.reporter.Query.Params:output_type -> layer.reporter.QueryParamsResponse - 4, // 12: layer.reporter.Query.Reporters:output_type -> layer.reporter.QueryReportersResponse - 6, // 13: layer.reporter.Query.SelectorReporter:output_type -> layer.reporter.QuerySelectorReporterResponse - 8, // 14: layer.reporter.Query.AllowedAmount:output_type -> layer.reporter.QueryAllowedAmountResponse - 10, // 15: layer.reporter.Query.NumOfSelectorsByReporter:output_type -> layer.reporter.QueryNumOfSelectorsByReporterResponse - 12, // 16: layer.reporter.Query.SpaceAvailableByReporter:output_type -> layer.reporter.QuerySpaceAvailableByReporterResponse - 11, // [11:17] is the sub-list for method output_type - 5, // [5:11] is the sub-list for method input_type + 9, // 9: layer.reporter.Query.AllowedAmountExpiration:input_type -> layer.reporter.QueryAllowedAmountExpirationRequest + 11, // 10: layer.reporter.Query.NumOfSelectorsByReporter:input_type -> layer.reporter.QueryNumOfSelectorsByReporterRequest + 13, // 11: layer.reporter.Query.SpaceAvailableByReporter:input_type -> layer.reporter.QuerySpaceAvailableByReporterRequest + 1, // 12: layer.reporter.Query.Params:output_type -> layer.reporter.QueryParamsResponse + 4, // 13: layer.reporter.Query.Reporters:output_type -> layer.reporter.QueryReportersResponse + 6, // 14: layer.reporter.Query.SelectorReporter:output_type -> layer.reporter.QuerySelectorReporterResponse + 8, // 15: layer.reporter.Query.AllowedAmount:output_type -> layer.reporter.QueryAllowedAmountResponse + 10, // 16: layer.reporter.Query.AllowedAmountExpiration:output_type -> layer.reporter.QueryAllowedAmountExpirationResponse + 12, // 17: layer.reporter.Query.NumOfSelectorsByReporter:output_type -> layer.reporter.QueryNumOfSelectorsByReporterResponse + 14, // 18: layer.reporter.Query.SpaceAvailableByReporter:output_type -> layer.reporter.QuerySpaceAvailableByReporterResponse + 12, // [12:19] is the sub-list for method output_type + 5, // [5:12] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name @@ -6502,7 +7346,7 @@ func file_layer_reporter_query_proto_init() { } } file_layer_reporter_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryNumOfSelectorsByReporterRequest); i { + switch v := v.(*QueryAllowedAmountExpirationRequest); i { case 0: return &v.state case 1: @@ -6514,7 +7358,7 @@ func file_layer_reporter_query_proto_init() { } } file_layer_reporter_query_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryNumOfSelectorsByReporterResponse); i { + switch v := v.(*QueryAllowedAmountExpirationResponse); i { case 0: return &v.state case 1: @@ -6526,7 +7370,7 @@ func file_layer_reporter_query_proto_init() { } } file_layer_reporter_query_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuerySpaceAvailableByReporterRequest); i { + switch v := v.(*QueryNumOfSelectorsByReporterRequest); i { case 0: return &v.state case 1: @@ -6538,6 +7382,30 @@ func file_layer_reporter_query_proto_init() { } } file_layer_reporter_query_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryNumOfSelectorsByReporterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_layer_reporter_query_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QuerySpaceAvailableByReporterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_layer_reporter_query_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QuerySpaceAvailableByReporterResponse); i { case 0: return &v.state @@ -6556,7 +7424,7 @@ func file_layer_reporter_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_layer_reporter_query_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/api/layer/reporter/query_grpc.pb.go b/api/layer/reporter/query_grpc.pb.go index 8ea98d59c..7bde49599 100644 --- a/api/layer/reporter/query_grpc.pb.go +++ b/api/layer/reporter/query_grpc.pb.go @@ -26,6 +26,7 @@ type QueryClient interface { SelectorReporter(ctx context.Context, in *QuerySelectorReporterRequest, opts ...grpc.CallOption) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(ctx context.Context, in *QueryAllowedAmountRequest, opts ...grpc.CallOption) (*QueryAllowedAmountResponse, error) + AllowedAmountExpiration(ctx context.Context, in *QueryAllowedAmountExpirationRequest, opts ...grpc.CallOption) (*QueryAllowedAmountExpirationResponse, error) // NumOfSelectorsByReporter queries the number of selectors by a reporter. NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) // SpaceAvailableByReporter queries the space available in a reporter. @@ -76,6 +77,15 @@ func (c *queryClient) AllowedAmount(ctx context.Context, in *QueryAllowedAmountR return out, nil } +func (c *queryClient) AllowedAmountExpiration(ctx context.Context, in *QueryAllowedAmountExpirationRequest, opts ...grpc.CallOption) (*QueryAllowedAmountExpirationResponse, error) { + out := new(QueryAllowedAmountExpirationResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/AllowedAmountExpiration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) { out := new(QueryNumOfSelectorsByReporterResponse) err := c.cc.Invoke(ctx, "/layer.reporter.Query/NumOfSelectorsByReporter", in, out, opts...) @@ -106,6 +116,7 @@ type QueryServer interface { SelectorReporter(context.Context, *QuerySelectorReporterRequest) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) + AllowedAmountExpiration(context.Context, *QueryAllowedAmountExpirationRequest) (*QueryAllowedAmountExpirationResponse, error) // NumOfSelectorsByReporter queries the number of selectors by a reporter. NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) // SpaceAvailableByReporter queries the space available in a reporter. @@ -129,6 +140,9 @@ func (UnimplementedQueryServer) SelectorReporter(context.Context, *QuerySelector func (UnimplementedQueryServer) AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllowedAmount not implemented") } +func (UnimplementedQueryServer) AllowedAmountExpiration(context.Context, *QueryAllowedAmountExpirationRequest) (*QueryAllowedAmountExpirationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AllowedAmountExpiration not implemented") +} func (UnimplementedQueryServer) NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NumOfSelectorsByReporter not implemented") } @@ -220,6 +234,24 @@ func _Query_AllowedAmount_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Query_AllowedAmountExpiration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllowedAmountExpirationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AllowedAmountExpiration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/AllowedAmountExpiration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AllowedAmountExpiration(ctx, req.(*QueryAllowedAmountExpirationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_NumOfSelectorsByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryNumOfSelectorsByReporterRequest) if err := dec(in); err != nil { @@ -279,6 +311,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "AllowedAmount", Handler: _Query_AllowedAmount_Handler, }, + { + MethodName: "AllowedAmountExpiration", + Handler: _Query_AllowedAmountExpiration_Handler, + }, { MethodName: "NumOfSelectorsByReporter", Handler: _Query_NumOfSelectorsByReporter_Handler, diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index 1c3131f80..3e9bbfe4e 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -4,22 +4,30 @@ info: name: '' description: '' paths: - /tellor-io/layer/reporter/allowed-amount: + /layer/bridge/get_attestation_data_by_snapshot/{snapshot}: get: - summary: AllowedAmount queries the currently allowed amount to stake or unstake. - operationId: LayerReporterAllowedAmount + operationId: LayerBridgeGetAttestationDataBySnapshot responses: '200': description: A successful response. schema: type: object properties: - staking_amount: + query_id: type: string - description: >- - allowed_amount defines the currently allowed amount to stake - or unstake. - unstaking_amount: + timestamp: + type: string + aggregate_value: + type: string + aggregate_power: + type: string + checkpoint: + type: string + attestation_timestamp: + type: string + previous_report_timestamp: + type: string + next_report_timestamp: type: string default: description: An unexpected error response. @@ -39,27 +47,26 @@ paths: '@type': type: string additionalProperties: {} + parameters: + - name: snapshot + in: path + required: true + type: string tags: - Query - /tellor-io/layer/reporter/num-of-selectors-by-reporter/{reporter_address}: + /layer/bridge/get_attestations_by_snapshot/{snapshot}: get: - summary: NumOfSelectorsByReporter queries the number of selectors by a reporter. - operationId: LayerReporterNumOfSelectorsByReporter + operationId: LayerBridgeGetAttestationsBySnapshot responses: '200': description: A successful response. schema: type: object properties: - num_of_selectors: - type: integer - format: int32 - description: >- - num_of_selectors defines the number of selectors by a - reporter. - description: |- - QueryNumOfSelectorsByReporterResponse is the response type for the - Query/NumOfSelectorsByReporter RPC method. + attestations: + type: array + items: + type: string default: description: An unexpected error response. schema: @@ -79,42 +86,24 @@ paths: type: string additionalProperties: {} parameters: - - name: reporter_address - description: reporter_address defines the reporter address to query for. + - name: snapshot in: path required: true type: string tags: - Query - /tellor-io/layer/reporter/params: + /layer/bridge/get_current_validator_set_timestamp: get: - summary: Parameters queries the parameters of the module. - operationId: LayerReporterParams + operationId: LayerBridgeGetCurrentValidatorSetTimestamp responses: '200': description: A successful response. schema: type: object properties: - params: - description: params holds all the parameters of this module. - type: object - properties: - min_commission_rate: - type: string - title: >- - min_commission_rate, adopted from staking module, is the - minimum commission rate a reporter can their delegators - min_trb: - type: string - title: min_trb to be a reporter - max_selectors: - type: string - format: uint64 - title: max number of selectors for a reporter - description: >- - QueryParamsResponse is response type for the Query/Params RPC - method. + timestamp: + type: string + format: int64 default: description: An unexpected error response. schema: @@ -135,69 +124,62 @@ paths: additionalProperties: {} tags: - Query - /tellor-io/layer/reporter/reporters: + /layer/bridge/get_evm_address_by_validator_address/{validator_address}: get: - summary: Reporters queries all the staked reporters. - operationId: LayerReporterReporters + operationId: LayerBridgeGetEvmAddressByValidatorAddress responses: '200': description: A successful response. schema: type: object properties: - reporters: + evm_address: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: type: array items: type: object properties: - address: + '@type': type: string - metadata: - type: object - properties: - min_tokens_required: - type: string - title: min_tokens_required to select this reporter - commission_rate: - type: string - title: commission for the reporter - jailed: - type: boolean - title: >- - jailed is a bool whether the reporter is jailed or - not - jailed_until: - type: string - format: date-time - title: >- - jailed_until is the time the reporter is jailed - until - title: >- - OracleReporter is the struct that holds the data for a - reporter - description: all the reporters. - pagination: - description: pagination defines the pagination in the response. - type: object - properties: - next_key: - type: string - format: byte - description: |- - next_key is the key to be passed to PageRequest.key to - query the next page most efficiently. It will be empty if - there are no more results. - total: - type: string - format: uint64 - title: >- - total is total number of results available if - PageRequest.count_total - - was set, its value is undefined otherwise - description: >- - QueryReportersResponse is the response type for the - Query/Reporters RPC method. + additionalProperties: {} + parameters: + - name: validator_address + in: path + required: true + type: string + tags: + - Query + /layer/bridge/get_evm_validators: + get: + summary: Queries a list of GetEvmValidators items. + operationId: LayerBridgeGetEvmValidators + responses: + '200': + description: A successful response. + schema: + type: object + properties: + bridge_validator_set: + type: array + items: + type: object + properties: + ethereumAddress: + type: string + power: + type: string + format: uint64 default: description: An unexpected error response. schema: @@ -216,81 +198,21 @@ paths: '@type': type: string additionalProperties: {} - parameters: - - name: pagination.key - description: |- - key is a value returned in PageResponse.next_key to begin - querying the next page most efficiently. Only one of offset or key - should be set. - in: query - required: false - type: string - format: byte - - name: pagination.offset - description: >- - offset is a numeric offset that can be used when key is unavailable. - - It is less efficient than using key. Only one of offset or key - should - - be set. - in: query - required: false - type: string - format: uint64 - - name: pagination.limit - description: >- - limit is the total number of results to be returned in the result - page. - - If left empty it will default to a value to be set by each app. - in: query - required: false - type: string - format: uint64 - - name: pagination.count_total - description: >- - count_total is set to true to indicate that the result set should - include - - a count of the total number of items available for pagination in - UIs. - - count_total is only respected when offset is used. It is ignored - when key - - is set. - in: query - required: false - type: boolean - - name: pagination.reverse - description: >- - reverse is set to true if results are to be returned in the - descending order. - - - Since: cosmos-sdk 0.43 - in: query - required: false - type: boolean tags: - Query - /tellor-io/layer/reporter/selector-reporter/{selector_address}: + /layer/bridge/get_snapshots_by_report/{query_id}/{timestamp}: get: - summary: SelectorReporter queries the reporter of a selector. - operationId: LayerReporterSelectorReporter + operationId: LayerBridgeGetSnapshotsByReport responses: '200': description: A successful response. schema: type: object properties: - reporter: - type: string - description: reporter defines the reporter of a selector. - description: |- - QuerySelectorReporterResponse is the response type for the - Query/SelectorReporter RPC method. + snapshots: + type: array + items: + type: string default: description: An unexpected error response. schema: @@ -310,30 +232,66 @@ paths: type: string additionalProperties: {} parameters: - - name: selector_address - description: selector_address defines the selector address to query for. + - name: query_id + in: path + required: true + type: string + - name: timestamp in: path required: true type: string tags: - Query - /tellor-io/layer/reporter/space-available-by-reporter/{reporter_address}: + /layer/bridge/get_validator_checkpoint: get: - summary: SpaceAvailableByReporter queries the space available in a reporter. - operationId: LayerReporterSpaceAvailableByReporter + operationId: LayerBridgeGetValidatorCheckpoint responses: '200': description: A successful response. schema: type: object properties: - space_available: + validator_checkpoint: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: type: integer format: int32 - description: space_available defines the space available in a reporter. - description: |- - QuerySpaceAvailableByReporterResponse is the response type for the - Query/SpaceAvailableByReporter RPC method. + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /layer/bridge/get_validator_checkpoint_params/{timestamp}: + get: + operationId: LayerBridgeGetValidatorCheckpointParams + responses: + '200': + description: A successful response. + schema: + type: object + properties: + checkpoint: + type: string + valset_hash: + type: string + timestamp: + type: string + format: int64 + power_threshold: + type: string + format: int64 default: description: An unexpected error response. schema: @@ -353,8 +311,1649 @@ paths: type: string additionalProperties: {} parameters: - - name: reporter_address - description: reporter_address defines the reporter address to query for. + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /layer/bridge/get_validator_set_index_by_timestamp/{timestamp}: + get: + operationId: LayerBridgeGetValidatorSetIndexByTimestamp + responses: + '200': + description: A successful response. + schema: + type: object + properties: + index: + type: string + format: int64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /layer/bridge/get_validator_timestamp_by_index/{index}: + get: + operationId: LayerBridgeGetValidatorTimestampByIndex + responses: + '200': + description: A successful response. + schema: + type: object + properties: + timestamp: + type: string + format: int64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: index + in: path + required: true + type: string + format: int64 + tags: + - Query + /layer/bridge/get_valset_by_timestamp/{timestamp}: + get: + operationId: LayerBridgeGetValsetByTimestamp + responses: + '200': + description: A successful response. + schema: + type: object + properties: + bridge_validator_set: + type: array + items: + type: object + properties: + ethereumAddress: + type: string + power: + type: string + format: uint64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /layer/bridge/get_valset_sigs/{timestamp}: + get: + operationId: LayerBridgeGetValsetSigs + responses: + '200': + description: A successful response. + schema: + type: object + properties: + signatures: + type: array + items: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /layer/bridge/params: + get: + summary: Parameters queries the parameters of the module. + operationId: LayerBridgeParams + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /layer/oracle/get_reportsby_qid/{query_id}: + get: + summary: Queries a list of GetReportsbyQid items. + operationId: LayerOracleGetReportsbyQid + responses: + '200': + description: A successful response. + schema: + type: object + properties: + microReports: + type: array + items: + type: object + properties: + reporter: + type: string + title: reporter is the address of the reporter + power: + type: string + format: int64 + title: >- + the power of the reporter based on total tokens + normalized + query_type: + type: string + title: string identifier of the data spec + query_id: + type: string + format: byte + title: hash of the query data + aggregate_method: + type: string + title: >- + aggregate method to use for aggregating all the reports + for the query id + value: + type: string + title: hex string of the response value + timestamp: + type: string + format: date-time + title: timestamp of when the report was created + cyclelist: + type: boolean + title: indicates if the report's query id is in the cyclelist + block_number: + type: string + format: int64 + title: block number of when the report was created + title: MicroReport represents data for a single report + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_id + description: query id of requested data + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /layer/oracle/get_reportsby_reporter/{reporter}: + get: + operationId: LayerOracleGetReportsbyReporter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + microReports: + type: array + items: + type: object + properties: + reporter: + type: string + title: reporter is the address of the reporter + power: + type: string + format: int64 + title: >- + the power of the reporter based on total tokens + normalized + query_type: + type: string + title: string identifier of the data spec + query_id: + type: string + format: byte + title: hash of the query data + aggregate_method: + type: string + title: >- + aggregate method to use for aggregating all the reports + for the query id + value: + type: string + title: hex string of the response value + timestamp: + type: string + format: date-time + title: timestamp of when the report was created + cyclelist: + type: boolean + title: indicates if the report's query id is in the cyclelist + block_number: + type: string + format: int64 + title: block number of when the report was created + title: MicroReport represents data for a single report + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: reporter + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /layer/oracle/get_reportsby_reporter_qid/{reporter}/{query_id}: + get: + operationId: LayerOracleGetReportsbyReporterQid + responses: + '200': + description: A successful response. + schema: + type: object + properties: + microReports: + type: array + items: + type: object + properties: + reporter: + type: string + title: reporter is the address of the reporter + power: + type: string + format: int64 + title: >- + the power of the reporter based on total tokens + normalized + query_type: + type: string + title: string identifier of the data spec + query_id: + type: string + format: byte + title: hash of the query data + aggregate_method: + type: string + title: >- + aggregate method to use for aggregating all the reports + for the query id + value: + type: string + title: hex string of the response value + timestamp: + type: string + format: date-time + title: timestamp of when the report was created + cyclelist: + type: boolean + title: indicates if the report's query id is in the cyclelist + block_number: + type: string + format: int64 + title: block number of when the report was created + title: MicroReport represents data for a single report + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: reporter + in: path + required: true + type: string + - name: query_id + in: path + required: true + type: string + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /layer/oracle/params: + get: + summary: Parameters queries the parameters of the module. + operationId: LayerOracleParams + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + minStakeAmount: + type: string + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/oracle/current_cyclelist_query: + get: + summary: Queries a list of CurrentCyclelistQuery items. + operationId: LayerOracleCurrentCyclelistQuery + responses: + '200': + description: A successful response. + schema: + type: object + properties: + query_data: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/oracle/get_aggregate_before_by_reporter/{query_id}/{timestamp}/{reporter}: + get: + operationId: LayerOracleGetAggregateBeforeByReporter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + aggregate: + description: aggregate defines the aggregate report. + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the + reports that were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate + report in the micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + description: >- + QueryGetAggregateBeforeByReporterResponse is the response type for + the Query/GetAggregateBeforeByReporter RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_id + description: query_id defines the query id hex string. + in: path + required: true + type: string + - name: timestamp + description: timestamp defines the timestamp of the aggregate report. + in: path + required: true + type: string + format: int64 + - name: reporter + description: reporter defines the reporter address. + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/oracle/get_current_aggregate_report/{query_id}: + get: + operationId: LayerOracleGetCurrentAggregateReport + responses: + '200': + description: A successful response. + schema: + type: object + properties: + aggregate: + description: aggregate defines the current aggregate report. + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the + reports that were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate + report in the micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + timestamp: + type: string + format: uint64 + description: timestamp defines the timestamp of the aggregate report. + description: >- + QueryGetCurrentAggregateReportResponse is the response type for + the Query/GetCurrentAggregateReport RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_id + description: query_id defines the query id hex string. + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/oracle/get_current_tip/{query_data}: + get: + summary: Queries a list of GetCurrentTip items. + operationId: LayerOracleGetCurrentTip + responses: + '200': + description: A successful response. + schema: + type: object + properties: + tips: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_data + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/oracle/get_data_before/{query_id}/{timestamp}: + get: + summary: Queries a list of GetAggregatedReport items. + operationId: LayerOracleGetDataBefore + responses: + '200': + description: A successful response. + schema: + type: object + properties: + aggregate: + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the + reports that were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate + report in the micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + timestamp: + type: string + format: uint64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_id + in: path + required: true + type: string + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /tellor-io/layer/oracle/get_time_based_rewards: + get: + summary: Queries a list of GetTimeBasedRewards items. + operationId: LayerOracleGetTimeBasedRewards + responses: + '200': + description: A successful response. + schema: + type: object + properties: + reward: + type: object + properties: + denom: + type: string + amount: + type: string + description: >- + Coin defines a token with a denomination and an amount. + + + NOTE: The amount field is an Int which implements the custom + method + + signatures required by gogoproto. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/oracle/get_user_tip_total/{tipper}: + get: + summary: Queries a list of GetUserTipTotal items. + operationId: LayerOracleGetUserTipTotal + responses: + '200': + description: A successful response. + schema: + type: object + properties: + total_tips: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: tipper + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/oracle/retrieve_data/{query_id}/{timestamp}: + get: + operationId: LayerOracleRetrieveData + responses: + '200': + description: A successful response. + schema: + type: object + properties: + aggregate: + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the + reports that were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate + report in the micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: query_id + in: path + required: true + type: string + - name: timestamp + in: path + required: true + type: string + format: int64 + tags: + - Query + /tellor-io/layer/reporter/allowed-amount: + get: + summary: AllowedAmount queries the currently allowed amount to stake or unstake. + operationId: LayerReporterAllowedAmount + responses: + '200': + description: A successful response. + schema: + type: object + properties: + staking_amount: + type: string + description: >- + allowed_amount defines the currently allowed amount to stake + or unstake. + unstaking_amount: + type: string + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/reporter/allowed-amount-expiration: + get: + operationId: LayerReporterAllowedAmountExpiration + responses: + '200': + description: A successful response. + schema: + type: object + properties: + expiration: + type: string + format: int64 + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/reporter/num-of-selectors-by-reporter/{reporter_address}: + get: + summary: NumOfSelectorsByReporter queries the number of selectors by a reporter. + operationId: LayerReporterNumOfSelectorsByReporter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + num_of_selectors: + type: integer + format: int32 + description: >- + num_of_selectors defines the number of selectors by a + reporter. + description: |- + QueryNumOfSelectorsByReporterResponse is the response type for the + Query/NumOfSelectorsByReporter RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: reporter_address + description: reporter_address defines the reporter address to query for. + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/reporter/params: + get: + summary: Parameters queries the parameters of the module. + operationId: LayerReporterParams + responses: + '200': + description: A successful response. + schema: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + min_commission_rate: + type: string + title: >- + min_commission_rate, adopted from staking module, is the + minimum commission rate a reporter can their delegators + min_trb: + type: string + title: min_trb to be a reporter + max_selectors: + type: string + format: uint64 + title: max number of selectors for a reporter + description: >- + QueryParamsResponse is response type for the Query/Params RPC + method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + tags: + - Query + /tellor-io/layer/reporter/reporters: + get: + summary: Reporters queries all the staked reporters. + operationId: LayerReporterReporters + responses: + '200': + description: A successful response. + schema: + type: object + properties: + reporters: + type: array + items: + type: object + properties: + address: + type: string + metadata: + type: object + properties: + min_tokens_required: + type: string + title: min_tokens_required to select this reporter + commission_rate: + type: string + title: commission for the reporter + jailed: + type: boolean + title: >- + jailed is a bool whether the reporter is jailed or + not + jailed_until: + type: string + format: date-time + title: >- + jailed_until is the time the reporter is jailed + until + title: >- + OracleReporter is the struct that holds the data for a + reporter + description: all the reporters. + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + description: >- + QueryReportersResponse is the response type for the + Query/Reporters RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: pagination.key + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + in: query + required: false + type: string + format: byte + - name: pagination.offset + description: >- + offset is a numeric offset that can be used when key is unavailable. + + It is less efficient than using key. Only one of offset or key + should + + be set. + in: query + required: false + type: string + format: uint64 + - name: pagination.limit + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + in: query + required: false + type: string + format: uint64 + - name: pagination.count_total + description: >- + count_total is set to true to indicate that the result set should + include + + a count of the total number of items available for pagination in + UIs. + + count_total is only respected when offset is used. It is ignored + when key + + is set. + in: query + required: false + type: boolean + - name: pagination.reverse + description: >- + reverse is set to true if results are to be returned in the + descending order. + + + Since: cosmos-sdk 0.43 + in: query + required: false + type: boolean + tags: + - Query + /tellor-io/layer/reporter/selector-reporter/{selector_address}: + get: + summary: SelectorReporter queries the reporter of a selector. + operationId: LayerReporterSelectorReporter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + reporter: + type: string + description: reporter defines the reporter of a selector. + description: |- + QuerySelectorReporterResponse is the response type for the + Query/SelectorReporter RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: selector_address + description: selector_address defines the selector address to query for. + in: path + required: true + type: string + tags: + - Query + /tellor-io/layer/reporter/space-available-by-reporter/{reporter_address}: + get: + summary: SpaceAvailableByReporter queries the space available in a reporter. + operationId: LayerReporterSpaceAvailableByReporter + responses: + '200': + description: A successful response. + schema: + type: object + properties: + space_available: + type: integer + format: int32 + description: space_available defines the space available in a reporter. + description: |- + QuerySpaceAvailableByReporterResponse is the response type for the + Query/SpaceAvailableByReporter RPC method. + default: + description: An unexpected error response. + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + '@type': + type: string + additionalProperties: {} + parameters: + - name: reporter_address + description: reporter_address defines the reporter address to query for. in: path required: true type: string @@ -2232,165 +3831,855 @@ definitions: Note: this functionality is not currently available in the official - protobuf release, and it is not used for type URLs beginning with + protobuf release, and it is not used for type URLs beginning with + + type.googleapis.com. As of May 2023, there are no widely used type + server + + implementations and no plans to implement one. + + + Schemes other than `http`, `https` (or the empty scheme) might be + + used with implementation specific semantics. + additionalProperties: {} + description: >- + Plan specifies information about a planned upgrade and when it should + occur. + ibc.core.client.v1.MsgCreateClientResponse: + type: object + description: MsgCreateClientResponse defines the Msg/CreateClient response type. + ibc.core.client.v1.MsgIBCSoftwareUpgradeResponse: + type: object + description: >- + MsgIBCSoftwareUpgradeResponse defines the Msg/IBCSoftwareUpgrade response + type. + ibc.core.client.v1.MsgRecoverClientResponse: + type: object + description: MsgRecoverClientResponse defines the Msg/RecoverClient response type. + ibc.core.client.v1.MsgSubmitMisbehaviourResponse: + type: object + description: |- + MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response + type. + ibc.core.client.v1.MsgUpdateClientResponse: + type: object + description: MsgUpdateClientResponse defines the Msg/UpdateClient response type. + ibc.core.client.v1.MsgUpdateParamsResponse: + type: object + description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. + ibc.core.client.v1.MsgUpgradeClientResponse: + type: object + description: MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. + ibc.core.client.v1.Params: + type: object + properties: + allowed_clients: + type: array + items: + type: string + description: >- + allowed_clients defines the list of allowed client state types which + can be created + + and interacted with. If a client type is removed from the allowed + clients list, usage + + of this client will be disabled until it is added again to the list. + description: Params defines the set of IBC light client parameters. + ibc.core.commitment.v1.MerklePrefix: + type: object + properties: + key_prefix: + type: string + format: byte + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + ibc.core.connection.v1.Counterparty: + type: object + properties: + client_id: + type: string + description: >- + identifies the client on the counterparty chain associated with a + given + + connection. + connection_id: + type: string + description: >- + identifies the connection end on the counterparty chain associated + with a + + given connection. + prefix: + description: commitment merkle prefix of the counterparty chain. + type: object + properties: + key_prefix: + type: string + format: byte + title: >- + MerklePrefix is merkle path prefixed to the key. + + The constructed key from the Path and the key will be + append(Path.KeyPath, + + append(Path.KeyPrefix, key...)) + description: >- + Counterparty defines the counterparty chain associated with a connection + end. + ibc.core.connection.v1.MsgConnectionOpenAckResponse: + type: object + description: >- + MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response + type. + ibc.core.connection.v1.MsgConnectionOpenConfirmResponse: + type: object + description: |- + MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm + response type. + ibc.core.connection.v1.MsgConnectionOpenInitResponse: + type: object + description: |- + MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response + type. + ibc.core.connection.v1.MsgConnectionOpenTryResponse: + type: object + description: >- + MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response + type. + ibc.core.connection.v1.MsgUpdateParamsResponse: + type: object + description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. + ibc.core.connection.v1.Params: + type: object + properties: + max_expected_time_per_block: + type: string + format: uint64 + description: >- + maximum expected time per block (in nanoseconds), used to enforce + block delay. This parameter should reflect the + + largest amount of time that the chain might reasonably take to produce + the next block under normal operating + + conditions. A safe choice is 3-5x the expected time per block. + description: Params defines the set of Connection parameters. + ibc.core.connection.v1.Version: + type: object + properties: + identifier: + type: string + title: unique version identifier + features: + type: array + items: + type: string + title: list of features compatible with the specified identifier + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + layer.bridge.MsgClaimDepositResponse: + type: object + layer.bridge.MsgRequestAttestationsResponse: + type: object + layer.bridge.MsgWithdrawTokensResponse: + type: object + layer.bridge.Params: + type: object + description: Params defines the parameters for the module. + layer.bridge.QueryBridgeValidator: + type: object + properties: + ethereumAddress: + type: string + power: + type: string + format: uint64 + layer.bridge.QueryGetAttestationDataBySnapshotResponse: + type: object + properties: + query_id: + type: string + timestamp: + type: string + aggregate_value: + type: string + aggregate_power: + type: string + checkpoint: + type: string + attestation_timestamp: + type: string + previous_report_timestamp: + type: string + next_report_timestamp: + type: string + layer.bridge.QueryGetAttestationsBySnapshotResponse: + type: object + properties: + attestations: + type: array + items: + type: string + layer.bridge.QueryGetCurrentValidatorSetTimestampResponse: + type: object + properties: + timestamp: + type: string + format: int64 + layer.bridge.QueryGetEvmAddressByValidatorAddressResponse: + type: object + properties: + evm_address: + type: string + layer.bridge.QueryGetEvmValidatorsResponse: + type: object + properties: + bridge_validator_set: + type: array + items: + type: object + properties: + ethereumAddress: + type: string + power: + type: string + format: uint64 + layer.bridge.QueryGetSnapshotsByReportResponse: + type: object + properties: + snapshots: + type: array + items: + type: string + layer.bridge.QueryGetValidatorCheckpointParamsResponse: + type: object + properties: + checkpoint: + type: string + valset_hash: + type: string + timestamp: + type: string + format: int64 + power_threshold: + type: string + format: int64 + layer.bridge.QueryGetValidatorCheckpointResponse: + type: object + properties: + validator_checkpoint: + type: string + layer.bridge.QueryGetValidatorSetIndexByTimestampResponse: + type: object + properties: + index: + type: string + format: int64 + layer.bridge.QueryGetValidatorTimestampByIndexResponse: + type: object + properties: + timestamp: + type: string + format: int64 + layer.bridge.QueryGetValsetByTimestampResponse: + type: object + properties: + bridge_validator_set: + type: array + items: + type: object + properties: + ethereumAddress: + type: string + power: + type: string + format: uint64 + layer.bridge.QueryGetValsetSigsResponse: + type: object + properties: + signatures: + type: array + items: + type: string + layer.bridge.QueryParamsResponse: + type: object + properties: + params: + description: params holds all the parameters of this module. + type: object + description: QueryParamsResponse is response type for the Query/Params RPC method. + layer.mint.MsgMsgInitResponse: + type: object + cosmos.base.query.v1beta1.PageRequest: + type: object + properties: + key: + type: string + format: byte + description: |- + key is a value returned in PageResponse.next_key to begin + querying the next page most efficiently. Only one of offset or key + should be set. + offset: + type: string + format: uint64 + description: |- + offset is a numeric offset that can be used when key is unavailable. + It is less efficient than using key. Only one of offset or key should + be set. + limit: + type: string + format: uint64 + description: >- + limit is the total number of results to be returned in the result + page. + + If left empty it will default to a value to be set by each app. + count_total: + type: boolean + description: >- + count_total is set to true to indicate that the result set should + include - type.googleapis.com. As of May 2023, there are no widely used type - server + a count of the total number of items available for pagination in UIs. - implementations and no plans to implement one. + count_total is only respected when offset is used. It is ignored when + key + is set. + reverse: + type: boolean + description: >- + reverse is set to true if results are to be returned in the descending + order. - Schemes other than `http`, `https` (or the empty scheme) might be - used with implementation specific semantics. - additionalProperties: {} - description: >- - Plan specifies information about a planned upgrade and when it should - occur. - ibc.core.client.v1.MsgCreateClientResponse: - type: object - description: MsgCreateClientResponse defines the Msg/CreateClient response type. - ibc.core.client.v1.MsgIBCSoftwareUpgradeResponse: - type: object - description: >- - MsgIBCSoftwareUpgradeResponse defines the Msg/IBCSoftwareUpgrade response - type. - ibc.core.client.v1.MsgRecoverClientResponse: - type: object - description: MsgRecoverClientResponse defines the Msg/RecoverClient response type. - ibc.core.client.v1.MsgSubmitMisbehaviourResponse: - type: object + Since: cosmos-sdk 0.43 description: |- - MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response - type. - ibc.core.client.v1.MsgUpdateClientResponse: - type: object - description: MsgUpdateClientResponse defines the Msg/UpdateClient response type. - ibc.core.client.v1.MsgUpdateParamsResponse: - type: object - description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. - ibc.core.client.v1.MsgUpgradeClientResponse: + message SomeRequest { + Foo some_parameter = 1; + PageRequest pagination = 2; + } + title: |- + PageRequest is to be embedded in gRPC request messages for efficient + pagination. Ex: + cosmos.base.query.v1beta1.PageResponse: type: object - description: MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. - ibc.core.client.v1.Params: + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: |- + total is total number of results available if PageRequest.count_total + was set, its value is undefined otherwise + description: |- + PageResponse is to be embedded in gRPC response messages where the + corresponding request message has used PageRequest. + + message SomeResponse { + repeated Bar results = 1; + PageResponse page = 2; + } + layer.oracle.Aggregate: type: object properties: - allowed_clients: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the reports that were + aggregated + reporters: type: array items: - type: string - description: >- - allowed_clients defines the list of allowed client state types which - can be created - - and interacted with. If a client type is removed from the allowed - clients list, usage - - of this client will be disabled until it is added again to the list. - description: Params defines the set of IBC light client parameters. - ibc.core.commitment.v1.MerklePrefix: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate report in the + micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + layer.oracle.AggregateReporter: type: object properties: - key_prefix: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + layer.oracle.MicroReport: + type: object + properties: + reporter: + type: string + title: reporter is the address of the reporter + power: + type: string + format: int64 + title: the power of the reporter based on total tokens normalized + query_type: + type: string + title: string identifier of the data spec + query_id: type: string format: byte - title: |- - MerklePrefix is merkle path prefixed to the key. - The constructed key from the Path and the key will be append(Path.KeyPath, - append(Path.KeyPrefix, key...)) - ibc.core.connection.v1.Counterparty: + title: hash of the query data + aggregate_method: + type: string + title: >- + aggregate method to use for aggregating all the reports for the query + id + value: + type: string + title: hex string of the response value + timestamp: + type: string + format: date-time + title: timestamp of when the report was created + cyclelist: + type: boolean + title: indicates if the report's query id is in the cyclelist + block_number: + type: string + format: int64 + title: block number of when the report was created + title: MicroReport represents data for a single report + layer.oracle.Params: type: object properties: - client_id: + minStakeAmount: type: string - description: >- - identifies the client on the counterparty chain associated with a - given - - connection. - connection_id: + description: Params defines the parameters for the module. + layer.oracle.QueryCurrentCyclelistQueryResponse: + type: object + properties: + query_data: type: string - description: >- - identifies the connection end on the counterparty chain associated - with a - - given connection. - prefix: - description: commitment merkle prefix of the counterparty chain. + layer.oracle.QueryGetAggregateBeforeByReporterResponse: + type: object + properties: + aggregate: + description: aggregate defines the aggregate report. type: object properties: - key_prefix: + query_id: type: string format: byte - title: >- - MerklePrefix is merkle path prefixed to the key. - - The constructed key from the Path and the key will be - append(Path.KeyPath, - - append(Path.KeyPrefix, key...)) - description: >- - Counterparty defines the counterparty chain associated with a connection - end. - ibc.core.connection.v1.MsgConnectionOpenAckResponse: - type: object + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the reports that + were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate report in the + micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report description: >- - MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck response - type. - ibc.core.connection.v1.MsgConnectionOpenConfirmResponse: - type: object - description: |- - MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm - response type. - ibc.core.connection.v1.MsgConnectionOpenInitResponse: - type: object - description: |- - MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response - type. - ibc.core.connection.v1.MsgConnectionOpenTryResponse: + QueryGetAggregateBeforeByReporterResponse is the response type for the + Query/GetAggregateBeforeByReporter RPC method. + layer.oracle.QueryGetCurrentAggregateReportResponse: type: object + properties: + aggregate: + description: aggregate defines the current aggregate report. + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the reports that + were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate report in the + micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + timestamp: + type: string + format: uint64 + description: timestamp defines the timestamp of the aggregate report. description: >- - MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry response - type. - ibc.core.connection.v1.MsgUpdateParamsResponse: + QueryGetCurrentAggregateReportResponse is the response type for the + Query/GetCurrentAggregateReport RPC method. + layer.oracle.QueryGetCurrentTipResponse: type: object - description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. - ibc.core.connection.v1.Params: + properties: + tips: + type: string + layer.oracle.QueryGetDataBeforeResponse: type: object properties: - max_expected_time_per_block: + aggregate: + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the reports that + were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate report in the + micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + timestamp: type: string format: uint64 - description: >- - maximum expected time per block (in nanoseconds), used to enforce - block delay. This parameter should reflect the - - largest amount of time that the chain might reasonably take to produce - the next block under normal operating + layer.oracle.QueryGetTimeBasedRewardsResponse: + type: object + properties: + reward: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. - conditions. A safe choice is 3-5x the expected time per block. - description: Params defines the set of Connection parameters. - ibc.core.connection.v1.Version: + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + layer.oracle.QueryGetUserTipTotalResponse: type: object properties: - identifier: + total_tips: type: string - title: unique version identifier - features: + layer.oracle.QueryMicroReportsResponse: + type: object + properties: + microReports: type: array items: - type: string - title: list of features compatible with the specified identifier - description: |- - Version defines the versioning scheme used to negotiate the IBC verison in - the connection handshake. - layer.bridge.MsgClaimDepositResponse: + type: object + properties: + reporter: + type: string + title: reporter is the address of the reporter + power: + type: string + format: int64 + title: the power of the reporter based on total tokens normalized + query_type: + type: string + title: string identifier of the data spec + query_id: + type: string + format: byte + title: hash of the query data + aggregate_method: + type: string + title: >- + aggregate method to use for aggregating all the reports for the + query id + value: + type: string + title: hex string of the response value + timestamp: + type: string + format: date-time + title: timestamp of when the report was created + cyclelist: + type: boolean + title: indicates if the report's query id is in the cyclelist + block_number: + type: string + format: int64 + title: block number of when the report was created + title: MicroReport represents data for a single report + pagination: + description: pagination defines the pagination in the response. + type: object + properties: + next_key: + type: string + format: byte + description: |- + next_key is the key to be passed to PageRequest.key to + query the next page most efficiently. It will be empty if + there are no more results. + total: + type: string + format: uint64 + title: >- + total is total number of results available if + PageRequest.count_total + + was set, its value is undefined otherwise + layer.oracle.QueryParamsResponse: type: object - layer.bridge.MsgRequestAttestationsResponse: + properties: + params: + description: params holds all the parameters of this module. + type: object + properties: + minStakeAmount: + type: string + description: QueryParamsResponse is response type for the Query/Params RPC method. + layer.oracle.QueryRetrieveDataResponse: type: object - layer.bridge.MsgWithdrawTokensResponse: + properties: + aggregate: + type: object + properties: + query_id: + type: string + format: byte + title: query_id is the id of the query + aggregate_value: + type: string + title: aggregate_value is the value of the aggregate + aggregate_reporter: + type: string + title: aggregate_reporter is the address of the reporter + reporter_power: + type: string + format: int64 + title: reporter_power is the power of the reporter + standard_deviation: + type: number + format: double + title: >- + standard_deviation is the standard deviation of the reports that + were aggregated + reporters: + type: array + items: + type: object + properties: + reporter: + type: string + power: + type: string + format: int64 + block_number: + type: string + format: int64 + title: list of reporters that were included in the aggregate + flagged: + type: boolean + title: flagged is true if the aggregate was flagged by a dispute + index: + type: string + format: uint64 + title: nonce is the nonce of the aggregate + aggregate_report_index: + type: string + format: int64 + title: >- + aggregate_report_index is the index of the aggregate report in the + micro reports + height: + type: string + format: int64 + title: height of the aggregate report + micro_height: + type: string + format: int64 + title: height of the micro report + title: aggregate struct to represent meta data of an aggregate report + layer.oracle.MsgCommitReportResponse: type: object - layer.mint.MsgMsgInitResponse: + layer.oracle.MsgSubmitValueResponse: + type: object + layer.oracle.MsgTipResponse: + type: object + layer.oracle.MsgUpdateCyclelistResponse: + type: object + description: MsgUpdateCycleResponse defines the Msg/UpdateCycle response type. + layer.oracle.MsgUpdateParamsResponse: type: object layer.registry.ABIComponent: type: object @@ -2456,83 +4745,44 @@ definitions: description: MsgRegisterSpecResponse defines the Msg/RegisterSpec response type. layer.registry.MsgUpdateDataSpecResponse: type: object - cosmos.base.query.v1beta1.PageRequest: + layer.reporter.MsgCreateReporterResponse: + type: object + description: MsgCreateReporterResponse defines the Msg/CreateReporter response type. + layer.reporter.MsgRemoveSelectorResponse: + type: object + description: MsgRemoveSelectorResponse defines the Msg/RemoveSelector response type. + layer.reporter.MsgSelectReporterResponse: + type: object + layer.reporter.MsgSwitchReporterResponse: + type: object + description: MsgSwitchReporterResponse defines the Msg/SwitchReporter response type. + layer.reporter.MsgUnjailReporterResponse: + type: object + description: MsgUnjailReporterResponse defines the Msg/UnjailReporter response type. + layer.reporter.MsgUpdateParamsResponse: type: object - properties: - key: - type: string - format: byte - description: |- - key is a value returned in PageResponse.next_key to begin - querying the next page most efficiently. Only one of offset or key - should be set. - offset: - type: string - format: uint64 - description: |- - offset is a numeric offset that can be used when key is unavailable. - It is less efficient than using key. Only one of offset or key should - be set. - limit: - type: string - format: uint64 - description: >- - limit is the total number of results to be returned in the result - page. - - If left empty it will default to a value to be set by each app. - count_total: - type: boolean - description: >- - count_total is set to true to indicate that the result set should - include - - a count of the total number of items available for pagination in UIs. - - count_total is only respected when offset is used. It is ignored when - key - - is set. - reverse: - type: boolean - description: >- - reverse is set to true if results are to be returned in the descending - order. - - - Since: cosmos-sdk 0.43 description: |- - message SomeRequest { - Foo some_parameter = 1; - PageRequest pagination = 2; - } - title: |- - PageRequest is to be embedded in gRPC request messages for efficient - pagination. Ex: - cosmos.base.query.v1beta1.PageResponse: + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + layer.reporter.MsgWithdrawTipResponse: + type: object + description: MsgWithdrawTipResponse defines the Msg/WithdrawTip response type. + layer.reporter.Params: type: object properties: - next_key: + min_commission_rate: type: string - format: byte - description: |- - next_key is the key to be passed to PageRequest.key to - query the next page most efficiently. It will be empty if - there are no more results. - total: + title: >- + min_commission_rate, adopted from staking module, is the minimum + commission rate a reporter can their delegators + min_trb: + type: string + title: min_trb to be a reporter + max_selectors: type: string format: uint64 - title: |- - total is total number of results available if PageRequest.count_total - was set, its value is undefined otherwise - description: |- - PageResponse is to be embedded in gRPC response messages where the - corresponding request message has used PageRequest. - - message SomeResponse { - repeated Bar results = 1; - PageResponse page = 2; - } + title: max number of selectors for a reporter + description: Params defines the parameters for the module. layer.reporter.OracleReporter: type: object properties: @@ -2550,22 +4800,12 @@ definitions: format: date-time title: jailed_until is the time the reporter is jailed until title: OracleReporter is the struct that holds the data for a reporter - layer.reporter.Params: + layer.reporter.QueryAllowedAmountExpirationResponse: type: object properties: - min_commission_rate: - type: string - title: >- - min_commission_rate, adopted from staking module, is the minimum - commission rate a reporter can their delegators - min_trb: - type: string - title: min_trb to be a reporter - max_selectors: + expiration: type: string - format: uint64 - title: max number of selectors for a reporter - description: Params defines the parameters for the module. + format: int64 layer.reporter.QueryAllowedAmountResponse: type: object properties: @@ -2697,25 +4937,3 @@ definitions: format: date-time title: jailed_until is the time the reporter is jailed until title: OracleReporter is the struct that holds the data for a reporter - layer.reporter.MsgCreateReporterResponse: - type: object - description: MsgCreateReporterResponse defines the Msg/CreateReporter response type. - layer.reporter.MsgRemoveSelectorResponse: - type: object - description: MsgRemoveSelectorResponse defines the Msg/RemoveSelector response type. - layer.reporter.MsgSelectReporterResponse: - type: object - layer.reporter.MsgSwitchReporterResponse: - type: object - description: MsgSwitchReporterResponse defines the Msg/SwitchReporter response type. - layer.reporter.MsgUnjailReporterResponse: - type: object - description: MsgUnjailReporterResponse defines the Msg/UnjailReporter response type. - layer.reporter.MsgUpdateParamsResponse: - type: object - description: |- - MsgUpdateParamsResponse defines the response structure for executing a - MsgUpdateParams message. - layer.reporter.MsgWithdrawTipResponse: - type: object - description: MsgWithdrawTipResponse defines the Msg/WithdrawTip response type. diff --git a/proto/layer/reporter/query.proto b/proto/layer/reporter/query.proto index 3cff8d3a5..1aa497134 100644 --- a/proto/layer/reporter/query.proto +++ b/proto/layer/reporter/query.proto @@ -30,6 +30,11 @@ service Query { rpc AllowedAmount(QueryAllowedAmountRequest) returns (QueryAllowedAmountResponse) { option (google.api.http).get = "/tellor-io/layer/reporter/allowed-amount"; } + + rpc AllowedAmountExpiration(QueryAllowedAmountExpirationRequest) returns (QueryAllowedAmountExpirationResponse) { + option (google.api.http).get = "/tellor-io/layer/reporter/allowed-amount-expiration"; + } + // NumOfSelectorsByReporter queries the number of selectors by a reporter. rpc NumOfSelectorsByReporter(QueryNumOfSelectorsByReporterRequest) returns (QueryNumOfSelectorsByReporterResponse) { option (google.api.http).get = "/tellor-io/layer/reporter/num-of-selectors-by-reporter/{reporter_address}"; @@ -103,6 +108,12 @@ message QueryAllowedAmountResponse { ]; } +message QueryAllowedAmountExpirationRequest {} + +message QueryAllowedAmountExpirationResponse { + int64 expiration = 1; +} + // QueryNumOfSelectorsByReporterRequest is the request type for the // Query/NumOfSelectorsByReporter RPC method. message QueryNumOfSelectorsByReporterRequest { diff --git a/x/reporter/keeper/query.go b/x/reporter/keeper/query.go index d7869705c..a5e661bf1 100644 --- a/x/reporter/keeper/query.go +++ b/x/reporter/keeper/query.go @@ -96,6 +96,15 @@ func (k Querier) AllowedAmount(ctx context.Context, req *types.QueryAllowedAmoun }, nil } +func (k Querier) AllowedAmountExpiration(ctx context.Context, req *types.QueryAllowedAmountExpirationRequest) (*types.QueryAllowedAmountExpirationResponse, error) { + tracker, err := k.Keeper.Tracker.Get(ctx) + if err != nil { + return nil, err + } + timeMilli := tracker.Expiration.UnixMilli() + return &types.QueryAllowedAmountExpirationResponse{Expiration: timeMilli}, nil +} + // query for num of selectors in reporter func (k Querier) NumOfSelectorsByReporter(ctx context.Context, req *types.QueryNumOfSelectorsByReporterRequest) (*types.QueryNumOfSelectorsByReporterResponse, error) { if req == nil { diff --git a/x/reporter/types/query.pb.go b/x/reporter/types/query.pb.go index 182a00202..9052d5248 100644 --- a/x/reporter/types/query.pb.go +++ b/x/reporter/types/query.pb.go @@ -432,6 +432,86 @@ func (m *QueryAllowedAmountResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryAllowedAmountResponse proto.InternalMessageInfo +type QueryAllowedAmountExpirationRequest struct { +} + +func (m *QueryAllowedAmountExpirationRequest) Reset() { *m = QueryAllowedAmountExpirationRequest{} } +func (m *QueryAllowedAmountExpirationRequest) String() string { return proto.CompactTextString(m) } +func (*QueryAllowedAmountExpirationRequest) ProtoMessage() {} +func (*QueryAllowedAmountExpirationRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{9} +} +func (m *QueryAllowedAmountExpirationRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllowedAmountExpirationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllowedAmountExpirationRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAllowedAmountExpirationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllowedAmountExpirationRequest.Merge(m, src) +} +func (m *QueryAllowedAmountExpirationRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryAllowedAmountExpirationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllowedAmountExpirationRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllowedAmountExpirationRequest proto.InternalMessageInfo + +type QueryAllowedAmountExpirationResponse struct { + Expiration int64 `protobuf:"varint,1,opt,name=expiration,proto3" json:"expiration,omitempty"` +} + +func (m *QueryAllowedAmountExpirationResponse) Reset() { *m = QueryAllowedAmountExpirationResponse{} } +func (m *QueryAllowedAmountExpirationResponse) String() string { return proto.CompactTextString(m) } +func (*QueryAllowedAmountExpirationResponse) ProtoMessage() {} +func (*QueryAllowedAmountExpirationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_a043abc58a7b99a9, []int{10} +} +func (m *QueryAllowedAmountExpirationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryAllowedAmountExpirationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryAllowedAmountExpirationResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryAllowedAmountExpirationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryAllowedAmountExpirationResponse.Merge(m, src) +} +func (m *QueryAllowedAmountExpirationResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryAllowedAmountExpirationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryAllowedAmountExpirationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryAllowedAmountExpirationResponse proto.InternalMessageInfo + +func (m *QueryAllowedAmountExpirationResponse) GetExpiration() int64 { + if m != nil { + return m.Expiration + } + return 0 +} + // QueryNumOfSelectorsByReporterRequest is the request type for the // Query/NumOfSelectorsByReporter RPC method. type QueryNumOfSelectorsByReporterRequest struct { @@ -443,7 +523,7 @@ func (m *QueryNumOfSelectorsByReporterRequest) Reset() { *m = QueryNumOf func (m *QueryNumOfSelectorsByReporterRequest) String() string { return proto.CompactTextString(m) } func (*QueryNumOfSelectorsByReporterRequest) ProtoMessage() {} func (*QueryNumOfSelectorsByReporterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a043abc58a7b99a9, []int{9} + return fileDescriptor_a043abc58a7b99a9, []int{11} } func (m *QueryNumOfSelectorsByReporterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -483,7 +563,7 @@ func (m *QueryNumOfSelectorsByReporterResponse) Reset() { *m = QueryNumO func (m *QueryNumOfSelectorsByReporterResponse) String() string { return proto.CompactTextString(m) } func (*QueryNumOfSelectorsByReporterResponse) ProtoMessage() {} func (*QueryNumOfSelectorsByReporterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a043abc58a7b99a9, []int{10} + return fileDescriptor_a043abc58a7b99a9, []int{12} } func (m *QueryNumOfSelectorsByReporterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -530,7 +610,7 @@ func (m *QuerySpaceAvailableByReporterRequest) Reset() { *m = QuerySpace func (m *QuerySpaceAvailableByReporterRequest) String() string { return proto.CompactTextString(m) } func (*QuerySpaceAvailableByReporterRequest) ProtoMessage() {} func (*QuerySpaceAvailableByReporterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a043abc58a7b99a9, []int{11} + return fileDescriptor_a043abc58a7b99a9, []int{13} } func (m *QuerySpaceAvailableByReporterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -570,7 +650,7 @@ func (m *QuerySpaceAvailableByReporterResponse) Reset() { *m = QuerySpac func (m *QuerySpaceAvailableByReporterResponse) String() string { return proto.CompactTextString(m) } func (*QuerySpaceAvailableByReporterResponse) ProtoMessage() {} func (*QuerySpaceAvailableByReporterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a043abc58a7b99a9, []int{12} + return fileDescriptor_a043abc58a7b99a9, []int{14} } func (m *QuerySpaceAvailableByReporterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -616,6 +696,8 @@ func init() { proto.RegisterType((*QuerySelectorReporterResponse)(nil), "layer.reporter.QuerySelectorReporterResponse") proto.RegisterType((*QueryAllowedAmountRequest)(nil), "layer.reporter.QueryAllowedAmountRequest") proto.RegisterType((*QueryAllowedAmountResponse)(nil), "layer.reporter.QueryAllowedAmountResponse") + proto.RegisterType((*QueryAllowedAmountExpirationRequest)(nil), "layer.reporter.QueryAllowedAmountExpirationRequest") + proto.RegisterType((*QueryAllowedAmountExpirationResponse)(nil), "layer.reporter.QueryAllowedAmountExpirationResponse") proto.RegisterType((*QueryNumOfSelectorsByReporterRequest)(nil), "layer.reporter.QueryNumOfSelectorsByReporterRequest") proto.RegisterType((*QueryNumOfSelectorsByReporterResponse)(nil), "layer.reporter.QueryNumOfSelectorsByReporterResponse") proto.RegisterType((*QuerySpaceAvailableByReporterRequest)(nil), "layer.reporter.QuerySpaceAvailableByReporterRequest") @@ -625,65 +707,69 @@ func init() { func init() { proto.RegisterFile("layer/reporter/query.proto", fileDescriptor_a043abc58a7b99a9) } var fileDescriptor_a043abc58a7b99a9 = []byte{ - // 917 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcf, 0x8f, 0xdb, 0x44, - 0x14, 0x8e, 0x17, 0x75, 0x49, 0xa6, 0xea, 0x6e, 0x18, 0xb6, 0x55, 0xea, 0x16, 0xa7, 0x72, 0xbb, - 0x6d, 0xc8, 0x62, 0x9b, 0x86, 0x82, 0x44, 0x0f, 0x88, 0x04, 0x51, 0x58, 0x90, 0x68, 0xd6, 0x2b, - 0x38, 0x70, 0xb1, 0x26, 0xc9, 0xac, 0x6b, 0xd5, 0xf6, 0xb8, 0xf6, 0xb8, 0x10, 0xaa, 0x5e, 0xb8, - 0xc0, 0x11, 0x89, 0x0b, 0x48, 0x1c, 0x7a, 0xe4, 0xc8, 0xa1, 0x12, 0xff, 0xc2, 0x1e, 0xab, 0x72, - 0x81, 0x1e, 0x2a, 0xb4, 0x8b, 0x04, 0x7f, 0x06, 0xca, 0xfc, 0x70, 0x36, 0x5e, 0xbb, 0x4e, 0x0f, - 0xbd, 0x44, 0x9e, 0x79, 0xdf, 0x7b, 0xef, 0x7b, 0xdf, 0xcc, 0x7c, 0x0a, 0x50, 0x7d, 0x34, 0xc5, - 0xb1, 0x15, 0xe3, 0x88, 0xc4, 0x14, 0xc7, 0xd6, 0x9d, 0x14, 0xc7, 0x53, 0x33, 0x8a, 0x09, 0x25, - 0x70, 0x8d, 0xc5, 0x4c, 0x19, 0x53, 0x5f, 0x41, 0x81, 0x17, 0x12, 0x8b, 0xfd, 0x72, 0x88, 0xda, - 0x1d, 0x93, 0x24, 0x20, 0x89, 0x35, 0x42, 0x09, 0xe6, 0xb9, 0xd6, 0xdd, 0xab, 0x23, 0x4c, 0xd1, - 0x55, 0x2b, 0x42, 0xae, 0x17, 0x22, 0xea, 0x91, 0x50, 0x60, 0xb5, 0xa3, 0x58, 0x89, 0x1a, 0x13, - 0x4f, 0xc6, 0xcf, 0xf2, 0xb8, 0xc3, 0x56, 0x16, 0x5f, 0x88, 0xd0, 0x86, 0x4b, 0x5c, 0xc2, 0xf7, - 0x67, 0x5f, 0x62, 0xf7, 0xbc, 0x4b, 0x88, 0xeb, 0x63, 0x0b, 0x45, 0x9e, 0x85, 0xc2, 0x90, 0x50, - 0xd6, 0x4d, 0xe6, 0x5c, 0xca, 0x4d, 0x46, 0x62, 0x34, 0xf6, 0xb1, 0x23, 0xd7, 0x02, 0x75, 0x2e, - 0x87, 0x8a, 0x50, 0x8c, 0x02, 0x51, 0x42, 0xdf, 0x00, 0x70, 0x67, 0x36, 0xd3, 0x90, 0x6d, 0xda, - 0xf8, 0x4e, 0x8a, 0x13, 0xaa, 0x0f, 0xc1, 0xab, 0x0b, 0xbb, 0x49, 0x44, 0xc2, 0x04, 0xc3, 0x77, - 0xc1, 0x2a, 0x4f, 0x6e, 0x29, 0x17, 0x94, 0xce, 0xc9, 0xde, 0x19, 0x73, 0x51, 0x3e, 0x93, 0xe3, - 0x07, 0x8d, 0xfd, 0xa7, 0xed, 0xda, 0xaf, 0xff, 0xfe, 0xd6, 0x55, 0x6c, 0x91, 0xa0, 0x3b, 0xe0, - 0x34, 0xab, 0x68, 0x0b, 0xa8, 0x6c, 0x05, 0x6f, 0x00, 0x30, 0x97, 0x51, 0xd4, 0xbd, 0x6c, 0x0a, - 0x69, 0x66, 0x3a, 0x9a, 0xfc, 0xbc, 0x84, 0x9a, 0xe6, 0x10, 0xb9, 0x58, 0xe4, 0xda, 0x47, 0x32, - 0xf5, 0x6f, 0x40, 0x5d, 0xd2, 0x80, 0x3d, 0xf0, 0x32, 0x9a, 0x4c, 0x62, 0x9c, 0x70, 0xa2, 0x8d, - 0x41, 0xeb, 0xf1, 0x43, 0x63, 0x43, 0xd4, 0xec, 0xf3, 0xc8, 0x2e, 0x8d, 0xbd, 0xd0, 0xb5, 0x25, - 0x10, 0x5e, 0x07, 0xf5, 0x00, 0x53, 0x34, 0x41, 0x14, 0xb5, 0x56, 0x18, 0x0b, 0x2d, 0x3f, 0xdd, - 0x4d, 0x26, 0xaf, 0x9c, 0xc0, 0xce, 0xf0, 0xfa, 0xcf, 0x0a, 0x38, 0x93, 0x9f, 0x4e, 0x48, 0xf6, - 0x0e, 0x68, 0xc8, 0xfc, 0x19, 0x99, 0x97, 0x3a, 0x27, 0x7b, 0xad, 0x7c, 0x5d, 0xf9, 0x61, 0xcf, - 0xa1, 0xf0, 0xa3, 0x05, 0x59, 0x38, 0xa1, 0x2b, 0x95, 0xb2, 0xf0, 0xa6, 0x0b, 0xba, 0x04, 0xe0, - 0x3c, 0xa3, 0xb6, 0x8b, 0x7d, 0x3c, 0xa6, 0x24, 0xce, 0xe8, 0x0b, 0xfd, 0x3f, 0x00, 0xcd, 0x44, - 0x84, 0x9c, 0x65, 0x45, 0x5b, 0x97, 0x19, 0x62, 0xfb, 0x7a, 0xfd, 0xfb, 0x07, 0xed, 0xda, 0x7f, - 0x0f, 0xda, 0x35, 0xfd, 0x73, 0xf0, 0x5a, 0x49, 0x3b, 0x21, 0xc8, 0xb5, 0xf9, 0x39, 0x55, 0xf6, - 0xc9, 0x90, 0xfa, 0x39, 0x70, 0x96, 0x95, 0xed, 0xfb, 0x3e, 0xf9, 0x0a, 0x4f, 0xfa, 0x01, 0x49, - 0x43, 0x2a, 0x6f, 0xeb, 0xbe, 0x02, 0xd4, 0xa2, 0xa8, 0xe8, 0x68, 0x83, 0xb5, 0x84, 0xa2, 0xdb, - 0x5e, 0xe8, 0x3a, 0x88, 0x45, 0x44, 0xdf, 0xad, 0xd9, 0x2d, 0x7d, 0xf2, 0xb4, 0x7d, 0x9a, 0xf7, - 0x4e, 0x26, 0xb7, 0x4d, 0x8f, 0x58, 0x01, 0xa2, 0xb7, 0xcc, 0xed, 0x90, 0x3e, 0x7e, 0x68, 0x00, - 0x41, 0x6a, 0x3b, 0xa4, 0xf6, 0x29, 0x51, 0x82, 0xd7, 0x86, 0x5f, 0x80, 0x66, 0x1a, 0xe6, 0xaa, - 0xae, 0x3c, 0x7f, 0xd5, 0xf5, 0xac, 0x08, 0xaf, 0xab, 0xa7, 0xe0, 0x12, 0x9b, 0xe4, 0xb3, 0x34, - 0xb8, 0xb9, 0x27, 0x35, 0x4c, 0x06, 0xd3, 0x82, 0x53, 0x93, 0xda, 0x2c, 0x7f, 0x6a, 0x32, 0xe3, - 0xf8, 0xa9, 0xed, 0x80, 0xcd, 0x8a, 0xb6, 0x42, 0xcb, 0x0e, 0x68, 0x86, 0x69, 0xe0, 0x90, 0x3d, - 0x47, 0x5e, 0x01, 0xde, 0xf7, 0x84, 0xbd, 0x16, 0x2e, 0xe4, 0x66, 0x93, 0xec, 0x46, 0x68, 0x8c, - 0xfb, 0x77, 0x91, 0xe7, 0xa3, 0x91, 0x8f, 0x5f, 0xf8, 0x24, 0x43, 0x31, 0x49, 0x79, 0x5b, 0x31, - 0xc9, 0x15, 0xb0, 0x9e, 0xcc, 0x30, 0x0e, 0x92, 0x20, 0x39, 0x48, 0xb2, 0x90, 0xda, 0xfb, 0xa5, - 0x0e, 0x4e, 0xb0, 0x92, 0xf0, 0x1e, 0x58, 0xe5, 0x06, 0x07, 0xf5, 0xfc, 0x13, 0x3e, 0xee, 0xa1, - 0xea, 0xc5, 0x67, 0x62, 0x38, 0x0b, 0xbd, 0xf3, 0xed, 0x1f, 0xff, 0xfc, 0xb8, 0xa2, 0xc3, 0x0b, - 0x16, 0xc5, 0xbe, 0x4f, 0x62, 0xc3, 0x23, 0x56, 0xa1, 0x5d, 0xc3, 0xef, 0x14, 0xd0, 0xc8, 0xec, - 0x05, 0x6e, 0x16, 0x16, 0xcf, 0x9b, 0xab, 0x7a, 0xb9, 0x0a, 0x26, 0x68, 0x6c, 0x31, 0x1a, 0x9b, - 0xf0, 0x62, 0x39, 0x8d, 0xb9, 0x35, 0xfd, 0xae, 0x80, 0x66, 0xfe, 0x79, 0xc3, 0x37, 0x0a, 0x3b, - 0x95, 0x98, 0x8e, 0x6a, 0x2c, 0x89, 0x16, 0xf4, 0x6e, 0x30, 0x7a, 0xef, 0xc3, 0xf7, 0xca, 0xe9, - 0xc9, 0xeb, 0x68, 0x64, 0x3b, 0xf7, 0xf2, 0xb6, 0x76, 0x1f, 0xfe, 0xa4, 0x80, 0x53, 0x0b, 0x1e, - 0x01, 0x5f, 0x2f, 0x24, 0x52, 0xe4, 0x32, 0x6a, 0x77, 0x19, 0xa8, 0x20, 0xfc, 0x26, 0x23, 0xdc, - 0x85, 0x9d, 0x72, 0xc2, 0x88, 0x27, 0x1a, 0xdc, 0x3c, 0xe0, 0x13, 0x05, 0xb4, 0xca, 0x5e, 0x1f, - 0xbc, 0x56, 0xd8, 0xba, 0xc2, 0x23, 0xd4, 0xb7, 0x9f, 0x33, 0x4b, 0x70, 0xdf, 0x61, 0xdc, 0x3f, - 0x85, 0xdb, 0xe5, 0xdc, 0xc3, 0x34, 0x30, 0xc8, 0x9e, 0x91, 0x59, 0x80, 0x31, 0x9a, 0x1e, 0xd1, - 0x3d, 0xff, 0x9c, 0xef, 0xc3, 0xbf, 0x14, 0xd0, 0x2a, 0x7b, 0x90, 0x25, 0xc3, 0x55, 0xd8, 0x46, - 0xc9, 0x70, 0x55, 0xaf, 0x5e, 0x1f, 0xb2, 0xe1, 0x3e, 0x81, 0x1f, 0x3f, 0xe3, 0x26, 0xcd, 0x6a, - 0x18, 0x99, 0x2b, 0x54, 0xcc, 0x36, 0xf8, 0x70, 0xff, 0x40, 0x53, 0x1e, 0x1d, 0x68, 0xca, 0xdf, - 0x07, 0x9a, 0xf2, 0xc3, 0xa1, 0x56, 0x7b, 0x74, 0xa8, 0xd5, 0xfe, 0x3c, 0xd4, 0x6a, 0x5f, 0x6e, - 0xb9, 0x1e, 0xbd, 0x95, 0x8e, 0xcc, 0x31, 0x09, 0x8e, 0x75, 0xfb, 0x7a, 0xde, 0x8f, 0x4e, 0x23, - 0x9c, 0x8c, 0x56, 0xd9, 0xdf, 0xb1, 0xb7, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x8e, 0x41, - 0x76, 0xad, 0x0a, 0x00, 0x00, + // 978 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcf, 0x6f, 0xdc, 0x54, + 0x17, 0x1d, 0xa7, 0x6a, 0xbe, 0xcc, 0xad, 0x9a, 0xe4, 0x7b, 0xa4, 0x65, 0xea, 0x96, 0x49, 0xe5, + 0x34, 0xed, 0x90, 0x60, 0x9b, 0x26, 0x2d, 0x12, 0x45, 0x42, 0x24, 0xa8, 0x81, 0x80, 0x44, 0x27, + 0x8e, 0x60, 0xc1, 0x66, 0xf4, 0x66, 0xe6, 0xc5, 0xb5, 0x6a, 0xfb, 0xb9, 0xf6, 0x73, 0xe9, 0x50, + 0x75, 0xc3, 0x06, 0x96, 0x48, 0x6c, 0x60, 0xd7, 0x25, 0x4b, 0x16, 0x95, 0x58, 0xb3, 0xcb, 0xb2, + 0x2a, 0x1b, 0xe8, 0xa2, 0xaa, 0x12, 0x24, 0xf8, 0x33, 0xd0, 0xbc, 0x1f, 0x9e, 0x8c, 0x67, 0x1c, + 0x4f, 0x16, 0x6c, 0x22, 0xfb, 0xdd, 0x73, 0xef, 0x3d, 0xe7, 0xbe, 0xeb, 0x93, 0x01, 0xdd, 0xc7, + 0x3d, 0x12, 0xdb, 0x31, 0x89, 0x68, 0xcc, 0x48, 0x6c, 0xdf, 0x4f, 0x49, 0xdc, 0xb3, 0xa2, 0x98, + 0x32, 0x8a, 0x66, 0x79, 0xcc, 0x52, 0x31, 0xfd, 0xff, 0x38, 0xf0, 0x42, 0x6a, 0xf3, 0xbf, 0x02, + 0xa2, 0xaf, 0x74, 0x68, 0x12, 0xd0, 0xc4, 0x6e, 0xe3, 0x84, 0x88, 0x5c, 0xfb, 0xc1, 0xf5, 0x36, + 0x61, 0xf8, 0xba, 0x1d, 0x61, 0xd7, 0x0b, 0x31, 0xf3, 0x68, 0x28, 0xb1, 0xf5, 0xa3, 0x58, 0x85, + 0xea, 0x50, 0x4f, 0xc5, 0x2f, 0x88, 0x78, 0x8b, 0xbf, 0xd9, 0xe2, 0x45, 0x86, 0x16, 0x5c, 0xea, + 0x52, 0x71, 0xde, 0x7f, 0x92, 0xa7, 0x97, 0x5c, 0x4a, 0x5d, 0x9f, 0xd8, 0x38, 0xf2, 0x6c, 0x1c, + 0x86, 0x94, 0xf1, 0x6e, 0x2a, 0xe7, 0x4a, 0x4e, 0x19, 0x8d, 0x71, 0xc7, 0x27, 0x2d, 0xf5, 0x2e, + 0x51, 0x17, 0x73, 0xa8, 0x08, 0xc7, 0x38, 0x90, 0x25, 0x8c, 0x05, 0x40, 0x3b, 0x7d, 0x4d, 0x4d, + 0x7e, 0xe8, 0x90, 0xfb, 0x29, 0x49, 0x98, 0xd1, 0x84, 0xd7, 0x86, 0x4e, 0x93, 0x88, 0x86, 0x09, + 0x41, 0xef, 0xc2, 0xb4, 0x48, 0xae, 0x69, 0x97, 0xb5, 0xc6, 0x99, 0xb5, 0xf3, 0xd6, 0xf0, 0xf8, + 0x2c, 0x81, 0xdf, 0xac, 0xee, 0xbf, 0x5c, 0xac, 0xfc, 0xfc, 0xf7, 0x2f, 0x2b, 0x9a, 0x23, 0x13, + 0x8c, 0x16, 0x9c, 0xe3, 0x15, 0x1d, 0x09, 0x55, 0xad, 0xd0, 0x16, 0xc0, 0x60, 0x8c, 0xb2, 0xee, + 0x55, 0x4b, 0x8e, 0xa6, 0x3f, 0x47, 0x4b, 0xdc, 0x97, 0x9c, 0xa6, 0xd5, 0xc4, 0x2e, 0x91, 0xb9, + 0xce, 0x91, 0x4c, 0xe3, 0x6b, 0x98, 0x51, 0x34, 0xd0, 0x1a, 0xfc, 0x0f, 0x77, 0xbb, 0x31, 0x49, + 0x04, 0xd1, 0xea, 0x66, 0xed, 0xf9, 0x53, 0x73, 0x41, 0xd6, 0xdc, 0x10, 0x91, 0x5d, 0x16, 0x7b, + 0xa1, 0xeb, 0x28, 0x20, 0xba, 0x05, 0x33, 0x01, 0x61, 0xb8, 0x8b, 0x19, 0xae, 0x4d, 0x71, 0x16, + 0xf5, 0xbc, 0xba, 0x3b, 0x7c, 0xbc, 0x4a, 0x81, 0x93, 0xe1, 0x8d, 0x9f, 0x34, 0x38, 0x9f, 0x57, + 0x27, 0x47, 0xf6, 0x0e, 0x54, 0x55, 0x7e, 0x9f, 0xcc, 0xa9, 0xc6, 0x99, 0xb5, 0x5a, 0xbe, 0xae, + 0x7a, 0x70, 0x06, 0x50, 0xf4, 0xd1, 0xd0, 0x58, 0x04, 0xa1, 0x6b, 0xa5, 0x63, 0x11, 0x4d, 0x87, + 0xe6, 0x12, 0xc0, 0x25, 0x4e, 0x6d, 0x97, 0xf8, 0xa4, 0xc3, 0x68, 0x9c, 0xd1, 0x97, 0xf3, 0xff, + 0x10, 0xe6, 0x13, 0x19, 0x6a, 0x4d, 0x3a, 0xb4, 0x39, 0x95, 0x21, 0x8f, 0x6f, 0xcd, 0x7c, 0xf7, + 0x64, 0xb1, 0xf2, 0xcf, 0x93, 0xc5, 0x8a, 0xf1, 0x39, 0xbc, 0x51, 0xd0, 0x4e, 0x0e, 0xe4, 0xc6, + 0xe0, 0x9e, 0x4a, 0xfb, 0x64, 0x48, 0xe3, 0x22, 0x5c, 0xe0, 0x65, 0x37, 0x7c, 0x9f, 0x7e, 0x45, + 0xba, 0x1b, 0x01, 0x4d, 0x43, 0xa6, 0xb6, 0x75, 0x5f, 0x03, 0x7d, 0x5c, 0x54, 0x76, 0x74, 0x60, + 0x36, 0x61, 0xf8, 0x9e, 0x17, 0xba, 0x2d, 0xcc, 0x23, 0xb2, 0xef, 0x6a, 0x7f, 0x4b, 0x5f, 0xbc, + 0x5c, 0x3c, 0x27, 0x7a, 0x27, 0xdd, 0x7b, 0x96, 0x47, 0xed, 0x00, 0xb3, 0xbb, 0xd6, 0x76, 0xc8, + 0x9e, 0x3f, 0x35, 0x41, 0x92, 0xda, 0x0e, 0x99, 0x73, 0x56, 0x96, 0x10, 0xb5, 0xd1, 0x17, 0x30, + 0x9f, 0x86, 0xb9, 0xaa, 0x53, 0x27, 0xaf, 0x3a, 0x97, 0x15, 0x11, 0x75, 0x8d, 0x65, 0x58, 0x1a, + 0x55, 0x72, 0xfb, 0x61, 0xe4, 0xc5, 0xfc, 0x36, 0x95, 0xe2, 0x2d, 0xb8, 0x72, 0x3c, 0x4c, 0x4a, + 0xaf, 0x03, 0x90, 0xec, 0x94, 0xcb, 0x3e, 0xe5, 0x1c, 0x39, 0x31, 0x52, 0x59, 0xe7, 0xb3, 0x34, + 0xb8, 0xb3, 0xa7, 0xae, 0x2c, 0xd9, 0xec, 0x8d, 0x59, 0x12, 0x75, 0x15, 0x93, 0x2f, 0x89, 0xca, + 0x18, 0x5d, 0x92, 0x1d, 0x58, 0x2e, 0x69, 0x2b, 0xf9, 0x37, 0x60, 0x3e, 0x4c, 0x83, 0x16, 0xdd, + 0x6b, 0xa9, 0x8d, 0x13, 0x7d, 0x4f, 0x3b, 0xb3, 0xe1, 0x50, 0x6e, 0xa6, 0x64, 0x37, 0xc2, 0x1d, + 0xb2, 0xf1, 0x00, 0x7b, 0x3e, 0x6e, 0xfb, 0xe4, 0x3f, 0x57, 0xd2, 0x94, 0x4a, 0x8a, 0xdb, 0x4a, + 0x25, 0xd7, 0x60, 0x2e, 0xe9, 0x63, 0x5a, 0x58, 0x81, 0x94, 0x90, 0x64, 0x28, 0x75, 0xed, 0x55, + 0x15, 0x4e, 0xf3, 0x92, 0xe8, 0x11, 0x4c, 0x0b, 0x3f, 0x45, 0x46, 0xde, 0x31, 0x46, 0x2d, 0x5b, + 0x5f, 0x3a, 0x16, 0x23, 0x58, 0x18, 0x8d, 0x6f, 0x7e, 0xff, 0xeb, 0x87, 0x29, 0x03, 0x5d, 0xb6, + 0x19, 0xf1, 0x7d, 0x1a, 0x9b, 0x1e, 0xb5, 0xc7, 0xfe, 0x77, 0x40, 0xdf, 0x6a, 0x50, 0xcd, 0xdc, + 0x0c, 0x2d, 0x8f, 0x2d, 0x9e, 0xf7, 0x72, 0xfd, 0x6a, 0x19, 0x4c, 0xd2, 0x58, 0xe5, 0x34, 0x96, + 0xd1, 0x52, 0x31, 0x8d, 0x81, 0x13, 0xfe, 0xaa, 0xc1, 0x7c, 0xde, 0x4d, 0xd0, 0x5b, 0x63, 0x3b, + 0x15, 0x78, 0x9c, 0x6e, 0x4e, 0x88, 0x96, 0xf4, 0xb6, 0x38, 0xbd, 0x0f, 0xd0, 0xfb, 0xc5, 0xf4, + 0xd4, 0x3a, 0x9a, 0xd9, 0xc9, 0xa3, 0xbc, 0x8b, 0x3e, 0x46, 0x3f, 0x6a, 0x70, 0x76, 0xe8, 0x0b, + 0x45, 0x6f, 0x8e, 0x25, 0x32, 0xce, 0xd4, 0xf4, 0x95, 0x49, 0xa0, 0x92, 0xf0, 0xdb, 0x9c, 0xf0, + 0x0a, 0x6a, 0x14, 0x13, 0xc6, 0x22, 0xd1, 0x14, 0x5e, 0x85, 0x7e, 0xd3, 0xe0, 0xf5, 0x02, 0xf3, + 0x40, 0xeb, 0xe5, 0x9d, 0x47, 0x1c, 0x49, 0xbf, 0x71, 0xb2, 0x24, 0x49, 0xfc, 0x3d, 0x4e, 0xfc, + 0x26, 0x5a, 0x9f, 0x94, 0xb8, 0x39, 0x30, 0x2f, 0xf4, 0x42, 0x83, 0x5a, 0x91, 0x83, 0xa0, 0xf1, + 0x7c, 0x4a, 0x7c, 0x4e, 0xbf, 0x79, 0xc2, 0x2c, 0x29, 0x63, 0x87, 0xcb, 0xf8, 0x14, 0x6d, 0x17, + 0xcb, 0x08, 0xd3, 0xc0, 0xa4, 0x7b, 0x66, 0x66, 0x63, 0x66, 0xbb, 0x77, 0x64, 0x77, 0xf2, 0x96, + 0xf4, 0x18, 0xfd, 0xa9, 0x41, 0xad, 0xc8, 0x54, 0x0a, 0xc4, 0x95, 0x58, 0x5f, 0x81, 0xb8, 0x32, + 0xe7, 0x32, 0x9a, 0x5c, 0xdc, 0x27, 0xe8, 0xe3, 0x63, 0xbe, 0x86, 0x7e, 0x0d, 0x33, 0x73, 0xb6, + 0x12, 0x6d, 0x9b, 0xb7, 0xf7, 0x0f, 0xea, 0xda, 0xb3, 0x83, 0xba, 0xf6, 0xea, 0xa0, 0xae, 0x7d, + 0x7f, 0x58, 0xaf, 0x3c, 0x3b, 0xac, 0x57, 0xfe, 0x38, 0xac, 0x57, 0xbe, 0x5c, 0x75, 0x3d, 0x76, + 0x37, 0x6d, 0x5b, 0x1d, 0x1a, 0x8c, 0x74, 0x7b, 0x38, 0xe8, 0xc7, 0x7a, 0x11, 0x49, 0xda, 0xd3, + 0xfc, 0x17, 0xec, 0xfa, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xa1, 0xef, 0xc9, 0xe0, 0x0b, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -706,6 +792,7 @@ type QueryClient interface { SelectorReporter(ctx context.Context, in *QuerySelectorReporterRequest, opts ...grpc.CallOption) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(ctx context.Context, in *QueryAllowedAmountRequest, opts ...grpc.CallOption) (*QueryAllowedAmountResponse, error) + AllowedAmountExpiration(ctx context.Context, in *QueryAllowedAmountExpirationRequest, opts ...grpc.CallOption) (*QueryAllowedAmountExpirationResponse, error) // NumOfSelectorsByReporter queries the number of selectors by a reporter. NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) // SpaceAvailableByReporter queries the space available in a reporter. @@ -756,6 +843,15 @@ func (c *queryClient) AllowedAmount(ctx context.Context, in *QueryAllowedAmountR return out, nil } +func (c *queryClient) AllowedAmountExpiration(ctx context.Context, in *QueryAllowedAmountExpirationRequest, opts ...grpc.CallOption) (*QueryAllowedAmountExpirationResponse, error) { + out := new(QueryAllowedAmountExpirationResponse) + err := c.cc.Invoke(ctx, "/layer.reporter.Query/AllowedAmountExpiration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) NumOfSelectorsByReporter(ctx context.Context, in *QueryNumOfSelectorsByReporterRequest, opts ...grpc.CallOption) (*QueryNumOfSelectorsByReporterResponse, error) { out := new(QueryNumOfSelectorsByReporterResponse) err := c.cc.Invoke(ctx, "/layer.reporter.Query/NumOfSelectorsByReporter", in, out, opts...) @@ -784,6 +880,7 @@ type QueryServer interface { SelectorReporter(context.Context, *QuerySelectorReporterRequest) (*QuerySelectorReporterResponse, error) // AllowedAmount queries the currently allowed amount to stake or unstake. AllowedAmount(context.Context, *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) + AllowedAmountExpiration(context.Context, *QueryAllowedAmountExpirationRequest) (*QueryAllowedAmountExpirationResponse, error) // NumOfSelectorsByReporter queries the number of selectors by a reporter. NumOfSelectorsByReporter(context.Context, *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) // SpaceAvailableByReporter queries the space available in a reporter. @@ -806,6 +903,9 @@ func (*UnimplementedQueryServer) SelectorReporter(ctx context.Context, req *Quer func (*UnimplementedQueryServer) AllowedAmount(ctx context.Context, req *QueryAllowedAmountRequest) (*QueryAllowedAmountResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AllowedAmount not implemented") } +func (*UnimplementedQueryServer) AllowedAmountExpiration(ctx context.Context, req *QueryAllowedAmountExpirationRequest) (*QueryAllowedAmountExpirationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AllowedAmountExpiration not implemented") +} func (*UnimplementedQueryServer) NumOfSelectorsByReporter(ctx context.Context, req *QueryNumOfSelectorsByReporterRequest) (*QueryNumOfSelectorsByReporterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method NumOfSelectorsByReporter not implemented") } @@ -889,6 +989,24 @@ func _Query_AllowedAmount_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Query_AllowedAmountExpiration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryAllowedAmountExpirationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).AllowedAmountExpiration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/layer.reporter.Query/AllowedAmountExpiration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).AllowedAmountExpiration(ctx, req.(*QueryAllowedAmountExpirationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_NumOfSelectorsByReporter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryNumOfSelectorsByReporterRequest) if err := dec(in); err != nil { @@ -945,6 +1063,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "AllowedAmount", Handler: _Query_AllowedAmount_Handler, }, + { + MethodName: "AllowedAmountExpiration", + Handler: _Query_AllowedAmountExpiration_Handler, + }, { MethodName: "NumOfSelectorsByReporter", Handler: _Query_NumOfSelectorsByReporter_Handler, @@ -1266,6 +1388,57 @@ func (m *QueryAllowedAmountResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *QueryAllowedAmountExpirationRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAllowedAmountExpirationRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllowedAmountExpirationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryAllowedAmountExpirationResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryAllowedAmountExpirationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryAllowedAmountExpirationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Expiration != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Expiration)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *QueryNumOfSelectorsByReporterRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1510,6 +1683,27 @@ func (m *QueryAllowedAmountResponse) Size() (n int) { return n } +func (m *QueryAllowedAmountExpirationRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryAllowedAmountExpirationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Expiration != 0 { + n += 1 + sovQuery(uint64(m.Expiration)) + } + return n +} + func (m *QueryNumOfSelectorsByReporterRequest) Size() (n int) { if m == nil { return 0 @@ -2355,6 +2549,125 @@ func (m *QueryAllowedAmountResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryAllowedAmountExpirationRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryAllowedAmountExpirationRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllowedAmountExpirationRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryAllowedAmountExpirationResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryAllowedAmountExpirationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryAllowedAmountExpirationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + m.Expiration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Expiration |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QueryNumOfSelectorsByReporterRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/reporter/types/query.pb.gw.go b/x/reporter/types/query.pb.gw.go index 425631b7b..5f97cd5fa 100644 --- a/x/reporter/types/query.pb.gw.go +++ b/x/reporter/types/query.pb.gw.go @@ -159,6 +159,24 @@ func local_request_Query_AllowedAmount_0(ctx context.Context, marshaler runtime. } +func request_Query_AllowedAmountExpiration_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllowedAmountExpirationRequest + var metadata runtime.ServerMetadata + + msg, err := client.AllowedAmountExpiration(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_AllowedAmountExpiration_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllowedAmountExpirationRequest + var metadata runtime.ServerMetadata + + msg, err := server.AllowedAmountExpiration(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_NumOfSelectorsByReporter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryNumOfSelectorsByReporterRequest var metadata runtime.ServerMetadata @@ -365,6 +383,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_AllowedAmountExpiration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AllowedAmountExpiration_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AllowedAmountExpiration_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_NumOfSelectorsByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -532,6 +573,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_AllowedAmountExpiration_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_AllowedAmountExpiration_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AllowedAmountExpiration_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_NumOfSelectorsByReporter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -584,6 +645,8 @@ var ( pattern_Query_AllowedAmount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"tellor-io", "layer", "reporter", "allowed-amount"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_AllowedAmountExpiration_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"tellor-io", "layer", "reporter", "allowed-amount-expiration"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_NumOfSelectorsByReporter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"tellor-io", "layer", "reporter", "num-of-selectors-by-reporter", "reporter_address"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_SpaceAvailableByReporter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"tellor-io", "layer", "reporter", "space-available-by-reporter", "reporter_address"}, "", runtime.AssumeColonVerbOpt(false))) @@ -598,6 +661,8 @@ var ( forward_Query_AllowedAmount_0 = runtime.ForwardResponseMessage + forward_Query_AllowedAmountExpiration_0 = runtime.ForwardResponseMessage + forward_Query_NumOfSelectorsByReporter_0 = runtime.ForwardResponseMessage forward_Query_SpaceAvailableByReporter_0 = runtime.ForwardResponseMessage From 09f45c7baf429697579f9cc819e6b3b43a58fdac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:05:36 +0200 Subject: [PATCH 05/41] feat: Any rpc (#254) (#257) * change to any rpc url * remove test function * remove test file * remove space * change suggested stake size (cherry picked from commit 41bbd2c7717145ae1bf68cf531b2240e306c100b) Co-authored-by: spuddy <72078372+0xSpuddy@users.noreply.github.com> --- daemons/token_bridge_feed/client/client.go | 16 ++++++++-------- evm/README.md | 4 ++-- validator.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/daemons/token_bridge_feed/client/client.go b/daemons/token_bridge_feed/client/client.go index 69d95ed12..85237e57e 100644 --- a/daemons/token_bridge_feed/client/client.go +++ b/daemons/token_bridge_feed/client/client.go @@ -133,11 +133,11 @@ func (c *Client) QueryAPI(urlStr string) ([]byte, error) { } func (c *Client) InitializeDeposits() error { - ethApiKey, err := c.getEthApiKey() + ethRpcUrl, err := c.getEthRpcUrl() if err != nil { - return fmt.Errorf("failed to get ETH API key: %w", err) + return fmt.Errorf("failed to get ETH RPC url: %w", err) } - eclient, err := ethclient.Dial("wss://eth-sepolia.g.alchemy.com/v2/" + ethApiKey) + eclient, err := ethclient.Dial(ethRpcUrl) if err != nil { return fmt.Errorf("failed to connect to the Ethereum client: %w", err) } @@ -343,7 +343,7 @@ func (c *Client) EncodeReportValue(depositReceipt DepositReceipt) ([]byte, error return reportValueArgsEncoded, nil } -func (c *Client) getEthApiKey() (string, error) { +func (c *Client) getEthRpcUrl() (string, error) { viper.SetConfigName("secrets") viper.SetConfigType("yaml") viper.AddConfigPath(".") @@ -351,9 +351,9 @@ func (c *Client) getEthApiKey() (string, error) { if err != nil { panic(fmt.Errorf("fatal error config file: %w", err)) } - ethApiKey := viper.GetString("eth_api_key") - if ethApiKey == "" { - return "", fmt.Errorf("eth_api_key not set") + ethRpcUrl := viper.GetString("eth_rpc_url") + if ethRpcUrl == "" { + return "", fmt.Errorf("eth_rpc_url not set") } - return ethApiKey, nil + return ethRpcUrl, nil } diff --git a/evm/README.md b/evm/README.md index fa475c40b..6eef6bdf0 100644 --- a/evm/README.md +++ b/evm/README.md @@ -30,9 +30,9 @@ Create a `secrets.yaml` file in the root layer directory: ``` touch secrets.yaml ``` -And set your alchemy eth-mainnet key: +And set your eth-mainnet rpc url: ```yaml -eth_api_key: "your-alchemy-eth-mainnet-key" +eth_rpc_url: "your-eth-mainnet-rpc-url" ``` To run the start scripts for the layer chain, you need `jq` installed. For MacOS, you can install it with diff --git a/validator.json b/validator.json index 1046ffbf7..a077a3fe3 100644 --- a/validator.json +++ b/validator.json @@ -1,6 +1,6 @@ { "pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"c+EuycPpudgiyVl6guYG9oyPSImHHJz1z0Pg4ODKveo="}, - "amount": "100000000000loya", + "amount": "99000000loya", "moniker": "calebmoniker", "identity": "optional identity signature (ex. UPort or Keybase)", "website": "validator's (optional) website", From 48750f31113750c7d2751c2a6664e7761e5619dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:07:26 +0200 Subject: [PATCH 06/41] fix: marshal empty vote extensions (#256) (#258) * changed pipe command on start command to produce two output files. One filtered with just the failed tx info and the other one being all the logs * changed around pipe command to deal with syntax error * getting it work without outputting logs to terminal * created a pipe and a bash script combo that reads in lines of the log file as they come in and filters out to write only failed transactions to the second log file * successfully started a chain locally and captured filtered logs into a second file now going to try and run it on aws * better extend vote marshalling * more voteext error handling --------- Co-authored-by: Cjpotter10 (cherry picked from commit ee5533633d6f73a84161f4083a3d907862a6d4e2) Co-authored-by: tkernell --- app/extend_vote.go | 28 +++++++++++++++++++++++++--- app/proposal_handler.go | 6 ++---- log_filter_failed_tx.sh | 4 ++++ start_scripts/README.md | 12 ++++++++++++ start_scripts/start_one_node.sh | 14 ++++++-------- start_scripts/start_one_node_aws.sh | 3 ++- 6 files changed, 51 insertions(+), 16 deletions(-) create mode 100755 log_filter_failed_tx.sh diff --git a/app/extend_vote.go b/app/extend_vote.go index 9822bc274..be2dc125b 100644 --- a/app/extend_vote.go +++ b/app/extend_vote.go @@ -97,7 +97,12 @@ func (h *VoteExtHandler) ExtendVoteHandler(ctx sdk.Context, req *abci.RequestExt operatorAddress, err := h.GetOperatorAddress() if err != nil { h.logger.Error("ExtendVoteHandler: failed to get operator address", "error", err) - return &abci.ResponseExtendVote{}, nil + bz, err := json.Marshal(voteExt) + if err != nil { + h.logger.Error("ExtendVoteHandler: failed to marshal vote extension", "error", err) + return &abci.ResponseExtendVote{}, err + } + return &abci.ResponseExtendVote{VoteExtension: bz}, nil } _, err = h.bridgeKeeper.GetEVMAddressByOperator(ctx, operatorAddress) if err != nil { @@ -105,7 +110,12 @@ func (h *VoteExtHandler) ExtendVoteHandler(ctx sdk.Context, req *abci.RequestExt initialSigA, initialSigB, err := h.SignInitialMessage() if err != nil { h.logger.Info("ExtendVoteHandler: failed to sign initial message", "error", err) - return &abci.ResponseExtendVote{}, nil + bz, err := json.Marshal(voteExt) + if err != nil { + h.logger.Error("ExtendVoteHandler: failed to marshal vote extension", "error", err) + return &abci.ResponseExtendVote{}, err + } + return &abci.ResponseExtendVote{VoteExtension: bz}, nil } // include the initial sig in the vote extension initialSignature := InitialSignature{ @@ -179,6 +189,18 @@ func (h *VoteExtHandler) VerifyVoteExtensionHandler(ctx sdk.Context, req *abci.R err := json.Unmarshal(req.VoteExtension, &voteExt) if err != nil { h.logger.Error("VerifyVoteExtensionHandler: failed to unmarshal vote extension", "error", err) + // lookup whether validator has registered evm address + validatorAddress, err := sdk.Bech32ifyAddressBytes(sdk.GetConfig().GetBech32ValidatorAddrPrefix(), req.ValidatorAddress) + if err != nil { + h.logger.Error("VerifyVoteExtensionHandler: failed to convert validator address to Bech32", "error", err) + return &abci.ResponseVerifyVoteExtension{Status: abci.ResponseVerifyVoteExtension_REJECT}, nil + } + _, err = h.bridgeKeeper.GetEVMAddressByOperator(ctx, validatorAddress) + if err != nil { + h.logger.Info("VerifyVoteExtensionHandler: validator does not have evm address, accepting vote", "validatorAddress", validatorAddress) + return &abci.ResponseVerifyVoteExtension{Status: abci.ResponseVerifyVoteExtension_ACCEPT}, nil + } + h.logger.Info("VerifyVoteExtensionHandler: validator has evm address, rejecting vote", "validatorAddress", validatorAddress) return &abci.ResponseVerifyVoteExtension{Status: abci.ResponseVerifyVoteExtension_REJECT}, nil } // ensure oracle attestations length is less than or equal to the number of attestation requests @@ -186,7 +208,7 @@ func (h *VoteExtHandler) VerifyVoteExtensionHandler(ctx sdk.Context, req *abci.R if err != nil { if !errors.Is(err, collections.ErrNotFound) { h.logger.Error("VerifyVoteExtensionHandler: failed to get attestation requests", "error", err) - return nil, err + return &abci.ResponseVerifyVoteExtension{Status: abci.ResponseVerifyVoteExtension_REJECT}, nil } else if len(voteExt.OracleAttestations) > 0 { h.logger.Error("VerifyVoteExtensionHandler: oracle attestations length is greater than 0, should be 0", "voteExt", voteExt) return &abci.ResponseVerifyVoteExtension{Status: abci.ResponseVerifyVoteExtension_REJECT}, nil diff --git a/app/proposal_handler.go b/app/proposal_handler.go index 42ca99606..7e444b417 100644 --- a/app/proposal_handler.go +++ b/app/proposal_handler.go @@ -150,7 +150,8 @@ func (h *ProposalHandler) ProcessProposalHandler(ctx sdk.Context, req *abci.Requ } err := baseapp.ValidateVoteExtensions(ctx, h.valStore, req.Height, ctx.ChainID(), injectedVoteExtTx.ExtendedCommitInfo) if err != nil { - return nil, err + h.logger.Error("ProcessProposalHandler: rejecting proposal, failed to validate vote extension", "error", err) + return &abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_REJECT}, nil } operatorAddresses, evmAddresses, err := h.CheckInitialSignaturesFromLastCommit(ctx, injectedVoteExtTx.ExtendedCommitInfo) @@ -242,7 +243,6 @@ func (h *ProposalHandler) PreBlocker(ctx sdk.Context, req *abci.RequestFinalizeB err := h.bridgeKeeper.SetBridgeValsetSignature(ctx, operatorAddress, uint64(timestamp), sigHexString) if err != nil { h.logger.Error("PreBlocker: failed to set valset signature", "error", err) - return nil, err } } } @@ -254,7 +254,6 @@ func (h *ProposalHandler) PreBlocker(ctx sdk.Context, req *abci.RequestFinalizeB err := h.bridgeKeeper.SetOracleAttestation(ctx, operatorAddress, snapshot, attestation) if err != nil { h.logger.Error("PreBlocker: failed to set oracle attestation", "error", err) - return nil, err } } } @@ -346,7 +345,6 @@ func (h *ProposalHandler) SetEVMAddresses(ctx sdk.Context, operatorAddresses, ev err := h.bridgeKeeper.SetEVMAddressByOperator(ctx, operatorAddress, bzAddress.Bytes()) if err != nil { h.logger.Error("SetEVMAddresses: failed to set evm address by operator", "error", err) - return err } } return nil diff --git a/log_filter_failed_tx.sh b/log_filter_failed_tx.sh new file mode 100755 index 000000000..203c5a50b --- /dev/null +++ b/log_filter_failed_tx.sh @@ -0,0 +1,4 @@ +while read line +do + echo "$line" | grep 'failed to execute message' >> ./filtered_first_node_logs.txt +done < mypipe \ No newline at end of file diff --git a/start_scripts/README.md b/start_scripts/README.md index 1cc57024a..55b81c5e4 100644 --- a/start_scripts/README.md +++ b/start_scripts/README.md @@ -15,3 +15,15 @@ start_one_node_aws.sh (has been run solely on ubuntu ec2 instances) - Unless you want to change the name of the folder used all you have to do to run this script is "sh ./start_scripts/start_one_node_aws.sh and it will spin it up with the config being set up at ~/.layer/alice and the name of your keys/node is alice +Logging: + +If you want to record only the failed transactions into a different log file do the following stops + +1. create a new terminal or screen instance and call mkfifo mypipe inside of the layer directory + +2. Then from that terminal call "./log_filter_failed_tx.sh". This will just start a script and not log anything (it will block you from doing anything else in this terminal instance going forward until you are done). + +3. Create another terminal instance and run the following command: tail -f fulldata_first_node_logs.txt >> mypipe & + + This command will read in lines from the full log file as they are written and will send them to our pipe script running in the other terminal instance where it will filter all logs coming in for the failed transaction string. It will output something like ([1] 53386) and nothing else but don't worry the pipe is still going and collecting logs + diff --git a/start_scripts/start_one_node.sh b/start_scripts/start_one_node.sh index 73f590133..792d05ae5 100755 --- a/start_scripts/start_one_node.sh +++ b/start_scripts/start_one_node.sh @@ -30,11 +30,9 @@ echo "Initializing chain node for alice..." # Add a validator account for alice echo "Adding validator account for alice..." ./layerd keys add alice --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice -echo "charlie user..." -./layerd keys add charlie --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice -# echo "creating account for faucet..." -# ./layerd keys add faucet --recover=true +echo "creating account for faucet..." +./layerd keys add faucet --recover=true --keyring-backend test # Update vote_extensions_enable_height in genesis.json for alice echo "Updating vote_extensions_enable_height in genesis.json for alice..." @@ -50,15 +48,15 @@ sleep 10 echo "Adding genesis account for alice..." ./layerd genesis add-genesis-account $(./layerd keys show alice -a --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice) 10000000000000loya --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice echo "charlie..." -./layerd genesis add-genesis-account $(./layerd keys show charlie -a --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice) 10000000000000loya --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice - +echo "Adding genesis account for faucet..." +./layerd genesis add-genesis-account tellor19d90wqftqx34khmln36zjdswm9p2aqawq2t3vp 1000000000000000000000000000loya --home ~/.layer/alice # echo "Faucet..." # ./layerd genesis add-genesis-account tellor19d90wqftqx34khmln36zjdswm9p2aqawq2t3vp 10000000000000loya --home ~/.layer/alice # Create a tx to stake some loyas for alice echo "Creating gentx for alice..." -./layerd genesis gentx alice 1000000loya --chain-id layer --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice --keyring-dir ~/.layer/alice +./layerd genesis gentx alice 1000000000loya --chain-id layer --keyring-backend $KEYRING_BACKEND --home ~/.layer/alice --keyring-dir ~/.layer/alice # Add the transactions to the genesis block echo "Collecting gentxs..." @@ -83,4 +81,4 @@ sed -i '' 's/keyring-backend = "os"/keyring-backend = "test"/' ~/.layer/config/c echo "Starting chain for alice..." -./layerd start --home $LAYERD_NODE_HOME --api.enable --api.swagger \ No newline at end of file +./layerd start --home ~/.layer/alice --key-name alice --api.enable --api.swagger | tee ./fulldata_first_node_logs.txt diff --git a/start_scripts/start_one_node_aws.sh b/start_scripts/start_one_node_aws.sh index 8ea456352..3413105a7 100644 --- a/start_scripts/start_one_node_aws.sh +++ b/start_scripts/start_one_node_aws.sh @@ -132,4 +132,5 @@ sed -i 's/^keyring-backend = "os"/keyring-backend = "test"/g' ~/.layer/alice/con sed -i 's/keyring-backend = "os"/keyring-backend = "test"/g' ~/.layer/config/client.toml echo "Starting chain for alice..." -#./layerd start --home ~/.layer/alice --key-name alice --api.enable --api.swagger | tee ./first_node_logs.txt \ No newline at end of file +#./layerd start --home ~/.layer/alice --key-name alice --api.enable --api.swagger | tee ./first_node_logs.txt +./layerd start --home ~/.layer/alice --key-name alice --api.enable --api.swagger | tee ./fulldata_first_node_logs.txt | grep 'failed to execute message' >> "filtered_first_node_logs.txt" \ No newline at end of file From 31bd6d96ac13516771396b88a0870f9e2ac0aeb8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:09:54 +0200 Subject: [PATCH 07/41] chore: add upgrade handler v2 + reenable ante for MsgCreateValidator (#255) (#259) * chore: add upgrade handler v2 + reenable ante for MsgCreateValidator * small lint (cherry picked from commit a24c3524932efea1b5ed7f15016ead5cca210640) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- app/app.go | 27 +++++++++++++++++++++++++++ x/reporter/ante/ante.go | 4 ++-- x/reporter/ante/ante_test.go | 28 ++++++++++++++-------------- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/app.go b/app/app.go index 08ff8ef86..a7a32c7c1 100644 --- a/app/app.go +++ b/app/app.go @@ -898,6 +898,10 @@ func New( panic(err) } + // RegisterUpgradeHandlers is used for registering any on-chain upgrades. + // Make sure it's called after `app.ModuleManager` and `app.configurator` are set. + app.RegisterUpgradeHandlers() + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules)) reflectionSvc, err := runtimeservices.NewReflectionService() if err != nil { @@ -956,6 +960,29 @@ func (app *App) setAnteHandler(txConfig client.TxConfig) { app.SetAnteHandler(anteHandler) } +func (app *App) RegisterUpgradeHandlers() { + const UpgradeName = "v0.2.0" + + app.UpgradeKeeper.SetUpgradeHandler( + UpgradeName, + func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) + }, + ) + + upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(err) + } + + if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + storeUpgrades := storetypes.StoreUpgrades{} + + // configure store loader that checks if version == upgradeHeight and applies store upgrades + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + } +} + // Name returns the name of the App func (app *App) Name() string { return app.BaseApp.Name() } diff --git a/x/reporter/ante/ante.go b/x/reporter/ante/ante.go index 11316d561..99e89e551 100644 --- a/x/reporter/ante/ante.go +++ b/x/reporter/ante/ante.go @@ -31,8 +31,8 @@ func (t TrackStakeChangesDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul var msgAmount math.Int for _, msg := range tx.GetMsgs() { switch msg := msg.(type) { - // case *stakingtypes.MsgCreateValidator: - // msgAmount = msg.Value.Amount + case *stakingtypes.MsgCreateValidator: + msgAmount = msg.Value.Amount case *stakingtypes.MsgDelegate: msgAmount = msg.Amount.Amount case *stakingtypes.MsgBeginRedelegate: diff --git a/x/reporter/ante/ante_test.go b/x/reporter/ante/ante_test.go index 52f921ffd..b28c409f0 100644 --- a/x/reporter/ante/ante_test.go +++ b/x/reporter/ante/ante_test.go @@ -31,20 +31,20 @@ func TestNewTrackStakeChangesDecorator(t *testing.T) { msg sdk.Msg err error }{ - // { - // name: "CreateValidator", - // msg: &stakingtypes.MsgCreateValidator{ - // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, - // }, - // err: nil, - // }, - // { - // name: "CreateValidator", - // msg: &stakingtypes.MsgCreateValidator{ - // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, - // }, - // err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), - // }, + { + name: "CreateValidator", + msg: &stakingtypes.MsgCreateValidator{ + Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, + }, + err: nil, + }, + { + name: "CreateValidator", + msg: &stakingtypes.MsgCreateValidator{ + Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, + }, + err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), + }, { name: "Delegate", msg: &stakingtypes.MsgDelegate{ From 7d297fad4ea6335e0e8aac2efbc7f096f18470fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 18:40:16 +0200 Subject: [PATCH 08/41] chore: modify team address during v0.2.0 upgrade (#261) (#262) (cherry picked from commit bebb87d2cb6d64387431281dba56ca0ad91e87e0) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- app/app.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/app.go b/app/app.go index a7a32c7c1..abac994fe 100644 --- a/app/app.go +++ b/app/app.go @@ -966,6 +966,25 @@ func (app *App) RegisterUpgradeHandlers() { app.UpgradeKeeper.SetUpgradeHandler( UpgradeName, func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + // one time thing, changing the team address + currentParams, err := app.DisputeKeeper.Params.Get(ctx) + if err != nil { + return nil, err + } + + addrCdc := address.Bech32Codec{ + Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(), + } + + currentParams.TeamAddress, err = addrCdc.StringToBytes("tellor18wjwgr0j8pv4ektdaxvzsykpntdylftwz8ml97") + if err != nil { + return nil, err + } + + if err = app.DisputeKeeper.Params.Set(ctx, currentParams); err != nil { + return nil, err + } + return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) }, ) From 3fc02dd6deac23a97810c2f120aebee0e7531254 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 18:50:32 +0200 Subject: [PATCH 09/41] fix: correct preblocker (#264) (#266) * fix: correct preblocker * fix: correct preblocker * fix: correct preblocker (cherry picked from commit fa437426c79bd23da4f612568c29362e8beca4d0) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- app/app.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/app.go b/app/app.go index abac994fe..56f769235 100644 --- a/app/app.go +++ b/app/app.go @@ -731,7 +731,7 @@ func New( prepareProposalHandler := NewProposalHandler(app.Logger(), app.StakingKeeper, app.AppCodec(), app.OracleKeeper, app.BridgeKeeper, app.StakingKeeper) app.BaseApp.SetPrepareProposal(prepareProposalHandler.PrepareProposalHandler) app.BaseApp.SetProcessProposal(prepareProposalHandler.ProcessProposalHandler) - app.BaseApp.SetPreBlocker(prepareProposalHandler.PreBlocker) + app.BaseApp.SetPreBlocker(app.preBlocker(prepareProposalHandler)) app.RegistryKeeper.SetHooks( registrymoduletypes.NewMultiRegistryHooks( app.OracleKeeper.Hooks(), @@ -960,6 +960,24 @@ func (app *App) setAnteHandler(txConfig client.TxConfig) { app.SetAnteHandler(anteHandler) } +func (app *App) preBlocker(ph *ProposalHandler) func(sdk.Context, *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) { + return func(ctx sdk.Context, req *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) { + res, err := app.ModuleManager().PreBlock(ctx) + if err != nil { + return nil, err + } + + changed := res.ConsensusParamsChanged + + res, err = ph.PreBlocker(ctx, req) + if changed != res.ConsensusParamsChanged { + res.ConsensusParamsChanged = true + } + + return res, err + } +} + func (app *App) RegisterUpgradeHandlers() { const UpgradeName = "v0.2.0" From dc33f398c4acc88de899f4a0f1a9759d812a72b5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 19:27:45 +0200 Subject: [PATCH 10/41] fix: Rollback upgrade to relaunch (#267) (#268) (cherry picked from commit 7bc0783d972afee257b9306c7412390804f82b9a) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- app/app.go | 74 ++++++++++++++++++------------------ x/reporter/ante/ante.go | 4 +- x/reporter/ante/ante_test.go | 28 +++++++------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/app/app.go b/app/app.go index 56f769235..256e88744 100644 --- a/app/app.go +++ b/app/app.go @@ -979,45 +979,45 @@ func (app *App) preBlocker(ph *ProposalHandler) func(sdk.Context, *abci.RequestF } func (app *App) RegisterUpgradeHandlers() { - const UpgradeName = "v0.2.0" - - app.UpgradeKeeper.SetUpgradeHandler( - UpgradeName, - func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - // one time thing, changing the team address - currentParams, err := app.DisputeKeeper.Params.Get(ctx) - if err != nil { - return nil, err - } - - addrCdc := address.Bech32Codec{ - Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(), - } - - currentParams.TeamAddress, err = addrCdc.StringToBytes("tellor18wjwgr0j8pv4ektdaxvzsykpntdylftwz8ml97") - if err != nil { - return nil, err - } - - if err = app.DisputeKeeper.Params.Set(ctx, currentParams); err != nil { - return nil, err - } - - return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) - }, - ) - - upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() - if err != nil { - panic(err) - } + // const UpgradeName = "v0.2.0" + + // app.UpgradeKeeper.SetUpgradeHandler( + // UpgradeName, + // func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + // // one time thing, changing the team address + // currentParams, err := app.DisputeKeeper.Params.Get(ctx) + // if err != nil { + // return nil, err + // } + + // addrCdc := address.Bech32Codec{ + // Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(), + // } + + // currentParams.TeamAddress, err = addrCdc.StringToBytes("tellor18wjwgr0j8pv4ektdaxvzsykpntdylftwz8ml97") + // if err != nil { + // return nil, err + // } + + // if err = app.DisputeKeeper.Params.Set(ctx, currentParams); err != nil { + // return nil, err + // } + + // return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) + // }, + // ) + + // upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + // if err != nil { + // panic(err) + // } - if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - storeUpgrades := storetypes.StoreUpgrades{} + // if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + // storeUpgrades := storetypes.StoreUpgrades{} - // configure store loader that checks if version == upgradeHeight and applies store upgrades - app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) - } + // // configure store loader that checks if version == upgradeHeight and applies store upgrades + // app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + // } } // Name returns the name of the App diff --git a/x/reporter/ante/ante.go b/x/reporter/ante/ante.go index 99e89e551..11316d561 100644 --- a/x/reporter/ante/ante.go +++ b/x/reporter/ante/ante.go @@ -31,8 +31,8 @@ func (t TrackStakeChangesDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul var msgAmount math.Int for _, msg := range tx.GetMsgs() { switch msg := msg.(type) { - case *stakingtypes.MsgCreateValidator: - msgAmount = msg.Value.Amount + // case *stakingtypes.MsgCreateValidator: + // msgAmount = msg.Value.Amount case *stakingtypes.MsgDelegate: msgAmount = msg.Amount.Amount case *stakingtypes.MsgBeginRedelegate: diff --git a/x/reporter/ante/ante_test.go b/x/reporter/ante/ante_test.go index b28c409f0..52f921ffd 100644 --- a/x/reporter/ante/ante_test.go +++ b/x/reporter/ante/ante_test.go @@ -31,20 +31,20 @@ func TestNewTrackStakeChangesDecorator(t *testing.T) { msg sdk.Msg err error }{ - { - name: "CreateValidator", - msg: &stakingtypes.MsgCreateValidator{ - Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, - }, - err: nil, - }, - { - name: "CreateValidator", - msg: &stakingtypes.MsgCreateValidator{ - Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, - }, - err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), - }, + // { + // name: "CreateValidator", + // msg: &stakingtypes.MsgCreateValidator{ + // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, + // }, + // err: nil, + // }, + // { + // name: "CreateValidator", + // msg: &stakingtypes.MsgCreateValidator{ + // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, + // }, + // err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), + // }, { name: "Delegate", msg: &stakingtypes.MsgDelegate{ From 901b63c7ca7c90d35c895b12961c52f5ad87b1fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:34:18 -0400 Subject: [PATCH 11/41] new token bridge contract (#269) (#270) (cherry picked from commit 547d611270e9b0e208c986245f7b6e6e5845d158) Co-authored-by: tkernell --- daemons/token_bridge_feed/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemons/token_bridge_feed/client/client.go b/daemons/token_bridge_feed/client/client.go index 85237e57e..277e8cce5 100644 --- a/daemons/token_bridge_feed/client/client.go +++ b/daemons/token_bridge_feed/client/client.go @@ -144,7 +144,7 @@ func (c *Client) InitializeDeposits() error { c.ethClient = eclient - contractAddress := common.HexToAddress("0x33ECe02327a3f90C0B2C84Cd8Ce3c380c04aB6D6") + contractAddress := common.HexToAddress("0x1AaF421491171930e71fb032B765DF252CE3F97e") bridgeContract, err := tokenbridge.NewTokenBridge(contractAddress, c.ethClient) if err != nil { From b63623bd25854b0c7c0753e757a50336d63f3b93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:22:43 -0400 Subject: [PATCH 12/41] fix: Reporter daemon dynamic chainid (#272) (#274) * new token bridge contract * dynamic reporter daemon chain id (cherry picked from commit 483d46f738ddee7958893c8a0498df509ed67058) Co-authored-by: tkernell --- daemons/reporter/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemons/reporter/client/client.go b/daemons/reporter/client/client.go index fc5012791..d7187464a 100644 --- a/daemons/reporter/client/client.go +++ b/daemons/reporter/client/client.go @@ -102,7 +102,7 @@ func (c *Client) Start( panic("account name is empty, please use --key-name flag") } accountName := c.AccountName - c.cosmosCtx = c.cosmosCtx.WithChainID("layer") + c.cosmosCtx = c.cosmosCtx.WithChainID(sdk.KeyringServiceName()) homeDir := viper.GetString("home") if homeDir != "" { c.cosmosCtx = c.cosmosCtx.WithHomeDir(homeDir) From f412a11c88a966f7c0727b8fa47a3a6f02b7d2cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:35:04 -0400 Subject: [PATCH 13/41] hardcoded chain id (#275) (#276) (cherry picked from commit 2da00fa0c931506f39c264edc846f744ca5f2824) Co-authored-by: CJPotter10 <91627020+CJPotter10@users.noreply.github.com> --- daemons/reporter/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemons/reporter/client/client.go b/daemons/reporter/client/client.go index d7187464a..7e7f7d255 100644 --- a/daemons/reporter/client/client.go +++ b/daemons/reporter/client/client.go @@ -102,7 +102,7 @@ func (c *Client) Start( panic("account name is empty, please use --key-name flag") } accountName := c.AccountName - c.cosmosCtx = c.cosmosCtx.WithChainID(sdk.KeyringServiceName()) + c.cosmosCtx = c.cosmosCtx.WithChainID("layertest-1") homeDir := viper.GetString("home") if homeDir != "" { c.cosmosCtx = c.cosmosCtx.WithHomeDir(homeDir) From b53fe10e30a0347f6be99b7f0ae421812d1f6749 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 13:12:36 -0400 Subject: [PATCH 14/41] feat: re add MsgCreateValidator check in ante (#271) (#277) (cherry picked from commit 7e8e42014c5abcded1ac7f2dd82e88099eaeb130) Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com> --- app/app.go | 55 ++++++++++++------------------------ x/reporter/ante/ante.go | 4 +-- x/reporter/ante/ante_test.go | 28 +++++++++--------- 3 files changed, 34 insertions(+), 53 deletions(-) diff --git a/app/app.go b/app/app.go index 256e88744..9f4b2fa78 100644 --- a/app/app.go +++ b/app/app.go @@ -979,45 +979,26 @@ func (app *App) preBlocker(ph *ProposalHandler) func(sdk.Context, *abci.RequestF } func (app *App) RegisterUpgradeHandlers() { - // const UpgradeName = "v0.2.0" - - // app.UpgradeKeeper.SetUpgradeHandler( - // UpgradeName, - // func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - // // one time thing, changing the team address - // currentParams, err := app.DisputeKeeper.Params.Get(ctx) - // if err != nil { - // return nil, err - // } - - // addrCdc := address.Bech32Codec{ - // Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(), - // } - - // currentParams.TeamAddress, err = addrCdc.StringToBytes("tellor18wjwgr0j8pv4ektdaxvzsykpntdylftwz8ml97") - // if err != nil { - // return nil, err - // } - - // if err = app.DisputeKeeper.Params.Set(ctx, currentParams); err != nil { - // return nil, err - // } - - // return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) - // }, - // ) - - // upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() - // if err != nil { - // panic(err) - // } + const UpgradeName = "v0.3.0" - // if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - // storeUpgrades := storetypes.StoreUpgrades{} + app.UpgradeKeeper.SetUpgradeHandler( + UpgradeName, + func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.ModuleManager().RunMigrations(ctx, app.Configurator(), fromVM) + }, + ) - // // configure store loader that checks if version == upgradeHeight and applies store upgrades - // app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) - // } + upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(err) + } + + if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + storeUpgrades := storetypes.StoreUpgrades{} + + // configure store loader that checks if version == upgradeHeight and applies store upgrades + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + } } // Name returns the name of the App diff --git a/x/reporter/ante/ante.go b/x/reporter/ante/ante.go index 11316d561..99e89e551 100644 --- a/x/reporter/ante/ante.go +++ b/x/reporter/ante/ante.go @@ -31,8 +31,8 @@ func (t TrackStakeChangesDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simul var msgAmount math.Int for _, msg := range tx.GetMsgs() { switch msg := msg.(type) { - // case *stakingtypes.MsgCreateValidator: - // msgAmount = msg.Value.Amount + case *stakingtypes.MsgCreateValidator: + msgAmount = msg.Value.Amount case *stakingtypes.MsgDelegate: msgAmount = msg.Amount.Amount case *stakingtypes.MsgBeginRedelegate: diff --git a/x/reporter/ante/ante_test.go b/x/reporter/ante/ante_test.go index 52f921ffd..b28c409f0 100644 --- a/x/reporter/ante/ante_test.go +++ b/x/reporter/ante/ante_test.go @@ -31,20 +31,20 @@ func TestNewTrackStakeChangesDecorator(t *testing.T) { msg sdk.Msg err error }{ - // { - // name: "CreateValidator", - // msg: &stakingtypes.MsgCreateValidator{ - // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, - // }, - // err: nil, - // }, - // { - // name: "CreateValidator", - // msg: &stakingtypes.MsgCreateValidator{ - // Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, - // }, - // err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), - // }, + { + name: "CreateValidator", + msg: &stakingtypes.MsgCreateValidator{ + Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(1)}, + }, + err: nil, + }, + { + name: "CreateValidator", + msg: &stakingtypes.MsgCreateValidator{ + Value: sdk.Coin{Denom: "loya", Amount: math.NewInt(100)}, + }, + err: errors.New("amount increases total stake by more than the allowed 5% in a twelve hour period"), + }, { name: "Delegate", msg: &stakingtypes.MsgDelegate{ From f387e9828f08bf9e534e245b8bf4824be39fd82e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:01:02 -0400 Subject: [PATCH 15/41] chore: ADRs and white paper updates (#278) (#279) * adrs and wp update * link fix * added some graphics to adrs (cherry picked from commit a32d3c84aa6150ddb55d149201346609786806fc) Co-authored-by: brendaloya <35778124+brendaloya@users.noreply.github.com> --- TellorLayer - tech.pdf | Bin 161433 -> 160211 bytes adr/adr000- how are adrs organized.md | 2 +- adr/adr001 - chain size limitations.md | 26 ++++++--- adr/adr002 - queryId time frame structure.md | 43 +++++++------- adr/adr1001 - distribution of base rewards.md | 14 ++--- adr/adr1002 - dual delegation.md | 23 +++++--- ...dr1003 - time based rewards eligibility.md | 31 +++++----- adr/adr1004 - fees on tips.md | 1 + ...adr1005 - handling of tips after report.md | 14 +++-- adr/adr1006 - dispute levels.md | 27 +++++---- ...7 - usage of staked tokens for disputes.md | 14 +++-- adr/adr1008 - voting power by group.md | 42 +++++++------- ...dr1009-handling of reporter delegations.md | 27 +++++---- adr/adr2001 - trb bridge structure.md | 33 ++++++----- adr/adr2002 - nonces for bridging.md | 37 ------------ ...for user data and validator set updates.md | 54 ++++++++++++++++++ ...03 - vote extensions vs txns for bridge.md | 34 ----------- ...d vote extensions for bridge signatures.md | 33 +++++++++++ adr/adr2004 - validator set size.md | 4 +- adr/adr2005 - Validator set updates.md | 1 + adr/adr2006 - data bridge architecture.md | 35 ++++++++---- ...2007 - initialization and tbr on bridge.md | 50 +++++++++------- ...3001 - TellorMaster to bridge structure.md | 20 +++---- adr/graphics/adr0001.png | Bin 0 -> 53110 bytes adr/graphics/adr1001.png | Bin 0 -> 40662 bytes adr/graphics/adr1002.png | Bin 0 -> 48371 bytes adr/graphics/adr1003.png | Bin 0 -> 39991 bytes adr/graphics/adr1004.png | Bin 0 -> 39846 bytes adr/graphics/adr1005.png | Bin 0 -> 29040 bytes adr/graphics/adr1006.png | Bin 0 -> 32928 bytes adr/graphics/adr1007.png | Bin 0 -> 39026 bytes adr/graphics/adr1008.png | Bin 0 -> 48796 bytes adr/graphics/adr1009.png | Bin 0 -> 73932 bytes adr/graphics/adr2001.png | Bin 0 -> 60569 bytes adr/graphics/adr2002.png | Bin 0 -> 49718 bytes adr/graphics/adr2003.png | Bin 0 -> 49645 bytes adr/graphics/adr2004.png | Bin 0 -> 61147 bytes adr/graphics/adr2005.png | Bin 0 -> 46615 bytes adr/graphics/adr2006.png | Bin 0 -> 55561 bytes adr/graphics/adr2006validatorsset.png | Bin 0 -> 57483 bytes 40 files changed, 320 insertions(+), 245 deletions(-) delete mode 100644 adr/adr2002 - nonces for bridging.md create mode 100644 adr/adr2002 - ordering properties for user data and validator set updates.md delete mode 100644 adr/adr2003 - vote extensions vs txns for bridge.md create mode 100644 adr/adr2003 - why we used vote extensions for bridge signatures.md create mode 100644 adr/graphics/adr0001.png create mode 100644 adr/graphics/adr1001.png create mode 100644 adr/graphics/adr1002.png create mode 100644 adr/graphics/adr1003.png create mode 100644 adr/graphics/adr1004.png create mode 100644 adr/graphics/adr1005.png create mode 100644 adr/graphics/adr1006.png create mode 100644 adr/graphics/adr1007.png create mode 100644 adr/graphics/adr1008.png create mode 100644 adr/graphics/adr1009.png create mode 100644 adr/graphics/adr2001.png create mode 100644 adr/graphics/adr2002.png create mode 100644 adr/graphics/adr2003.png create mode 100644 adr/graphics/adr2004.png create mode 100644 adr/graphics/adr2005.png create mode 100644 adr/graphics/adr2006.png create mode 100644 adr/graphics/adr2006validatorsset.png diff --git a/TellorLayer - tech.pdf b/TellorLayer - tech.pdf index 4791d53777117ee96ecb71f1e1d337b430e39260..1f143db919860121e875f5ded98d683da6e04a43 100644 GIT binary patch delta 85826 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 z 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�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 S+i)LSUjQnotZZzJ75q0R0W2W^ delta 87017 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 percent of tokens are staked is more likely, and starting a major dispute could become infeasible. Consensus assumes that up to 1/3 could be compromised. If we assume that 1/3 of staked tokens is malicious, we need to have that amount of tokens available to dispute in the case of an attack. If those tokens are all locked on CEXs or not just free floating and ready to be used for disputes, there could be a costly delay. By allowing staked parties to initiate the dispute, there will always have enough tokens as long as the consensus 50% is not breached. +Old tellor does not allow staked tokens to be used for disputes. This option works well in the scenario when the percentage of staked tokens is less than 50% of the circulating supply, which is the case in the current system. It also incentivizes users to hold free floating tokens to initiate and vote on disputes and token holders to keep tokens off CEXs for the possibility of earning a profit from successful disputes. Currently, being a profitable reporter on Tellor requires high technical skills. +However, in Tellor Layer delegation will make it easier for token holders to earn a profit without technical skills. Assuming a scenario where a high (>50%) percent of tokens are staked, starting a major dispute with only free floating tokens could become infeasible. Consensus assumes that up to 1/3 could be compromised. If we assume that 1/3 of staked tokens is malicious, we need to have that amount of tokens available to dispute in the case of an attack. If those tokens are all locked on CEXs or not free floating and ready to be used for disputes, there could be a costly delay. By allowing parties to initiate a dispute with staked tokens, there will always be enough tokens for disputes on Layer as long as the consensus 50% is not breached. ## Issues / Notes on Implementation + diff --git a/adr/adr1008 - voting power by group.md b/adr/adr1008 - voting power by group.md index f87bb7b25..9cd86974f 100644 --- a/adr/adr1008 - voting power by group.md +++ b/adr/adr1008 - voting power by group.md @@ -1,4 +1,4 @@ -# ADR 1008: voting power by group +# ADR 1008: Voting power by group ## Authors @@ -10,57 +10,57 @@ - 2024-02-27: initial version - 2024-04-01: clarified language - 2024-04-02: added option on decreasing user vote power +- 2024-08-03: clean up ## Context -For voting on disputes, who gets to say what a good value is? The current split: +For voting on disputes and determining if a value is correct, these groups are weighted evenly: -25% reporters +25% reporters (based on reporter weight) 25% users (based on tips) 25% team 25% token holders -Most notable in the split is the absence of validators and relayers. The rationale for not including validators is the treatment of delegated tokens. Currently delegated tokens are already counted twice (token holders and reporters they are delegated to). If the validator was also able to use tokens delegated to themselves, you could essentially delegate tokens to yourself as a reporter and a validator and then triple your voting power. We could choose between giving the power to reporters or validators in this case and we went with reporters for the same reason disputes can be started with delegated tokens from reporters and not validators; data reporting and quality is done by the reporters, chain operations are done by the validators. +Most notable in the split is the absence of validators and relayers. The rationale for not including validators is the treatment of delegated tokens. Currently delegated tokens are already counted twice (token holders and reporters they are delegated to). If the validator was also able to use tokens delegated to themselves, you could essentially delegate tokens to yourself as a reporter and a validator and then triple your voting power. We had to choose between giving the power to reporters or validators in this case and we chose reporters for the same reason disputes can be started with delegated tokens from reporters and not validators; data reporting and quality is done by the reporters, chain operations are done by the validators. Also, in old tellor, reporters could earn voting weight per report count, however that has been removed in Layer in favor of reporter weight. Additionally, we give delegated reporters multiple powers (token weight and reporter weight). If A and B each have 100 tokens and A and B both delegate to B for reporting -For voting - reporter weights go to B and the token weight portion also goes to B for 200, unless A votes. If A votes, he gets his 100 and B gets 100. (note this is standard for validator delegation and votes in the cosmos sdk) +For voting - reporter weights go to B and the token weight portion also goes to B for 200, unless A votes. If A votes, he gets his 100 and B gets 100 (note that this is standard for validator delegation and votes in the cosmos sdk). ## Alternative Approaches -### add in validators +### Add in validators -Adding in validators (or having validators rather than reporters) could introduce a new stake holder set that could help to decentralize the voting set further. Additionally, it might be said that reporters are biased due to their obvious conflict of interest and that disputes should be resolved by neutral third parties. +Adding in validators as an additional weighted group for settling disputes (or having validators rather than reporters) could introduce a new stake holder set that could help to decentralize the voting set further. Additionally, it might be said that reporters are biased due to their obvious conflict of interest and that disputes should be resolved by neutral third parties. -This is valid, however the attack method of tripling tokens by dual self delegation could undermine chain security. We feel that the current split (reporters over validators) gives them a say in the accuracy of the vote and gives weight to their long term interest in the validity of the data. It is also an unknown how different validator and reporter sets will be. There is a substantial chance that they will overlap significantly and the two sets will not require double counting. +This is valid argument, however the attack method of tripling tokens by dual self delegation could undermine chain security. We feel that the current split (reporters over validators) gives them a say in the accuracy of the vote and gives weight to their long term interest in the validity of the data. It is also an unknown how different validator and reporter sets will be. There is a substantial chance that they will overlap significantly and the two sets will not require double counting. -### remove team +### Remove team -A long term plan is to further decentralize the protocol by removing the team's voting weight on disputes and exploring other governance structures. In the short term, as the protocol matures to team acts as a tie breaker. +The long term plan is to further decentralize the protocol by removing the team's voting weight on disputes and exploring other governance structures. In the short term, as the protocol matures to team acts as a tie breaker. -### different reporter voting weight calculation +### Different reporter voting weight calculation -Instead of just using reporter weight as the percentage of total reporter stake, we could use a counting methodology similar to current tellor (each report counts as one vote, regardless of weight). This has benefits of supporting smaller reporters as much as larger ones, as well as hardening over time as the voting power is non-transferrable. +Instead of using reporter weight as the percentage of total reporter stake, we could use a counting methodology similar to current tellor (each report counts as one vote, regardless of weight). This has benefits of supporting smaller reporters as much as larger ones, as well as hardening over time as the voting power is non-transferrable. -The downside here is that votes are still sellable, you just need to sell your private key. This actually becomes dangerous as reporters who want to exit are incentivized to sell their voting power to attackers once they are unstaked. You could fix this by also requiring them to be staked, but it only changes the attack cost, not the fact it exists as an exit strategy. +The downside here is that votes are still sellable, since reporters could sell their private key. This actually becomes dangerous as reporters who want to exit are incentivized to sell their voting power to attackers once they are unstaked. You could fix this by also requiring them to be staked, but it only changes the attack cost, not the fact it exists as an exit strategy. This is the case for users as well. Users do not have to stake and they earn voting weight by the amount of tips the provide. However, users are disincentivized from selling their private keys because doing so could trigger an attack to their own protocol (there is no guarantee an attacker that is willing to buy their keys will not attack them too). +### Decrease user voting power over time -### decrease user voting power over time +One option is to reduce user voting power over time. The risk is that a user will be big, gain a lot of power and then want to sell it once they no longer need it. By reducing their power over time, this could remove this risk and give more credence to currently tipping parties. -One option is to reduce user voting power as the system matures. So the risk is that a user will be big, gain a lot of power and then want to sell it once they no longer need it. By reducing their power over time, this could remove this risk and give more credence to currently tipping parties. +The downside here is that the risk is still alive (the user just has to sell it sooner) and it fails to recognize longevity. The rate of attrition/aging would have to take into account both, length of time and amount of tips. Otherwise, if a user tips faithfully once a day for 2 years could end up with less power than a user who tips 10 times a day for a week. Obviously for voting, we'd prefer the long term users and implementing a proper attrition rate could be tricky. -The downside here is that the risk is still alive (you just have to sell it sooner) and it fails to recognize longevity. If a user tips faithfully once a day for 2 years, should they have more or less power than a user who tips 10 times a day for a week? Obviously for voting, we'd prefer the former as they've been around tellor for a long time. The good users here are ones that stay around. +Another way to fix the attack of buying vote power via tips is to have others recognize the attack and also tip on subsequent vote rounds, so the system would always be safe if >50% of the power is honest; and as last resort a social fork could be done. -Another way to fix the attack (buying vote power via tips) is to just have others also tip on subsequent vote rounds, so the system would always be safe if >50% of the power is honest; not to even mention a risk of a social fork. - -### move to different governance structure - -In the long run, it is definitely on the table to move to a different governance system. Whether it's liquid staking, delegations, or other market forces that could drive centralization and alter crypto economic incentives, tellor remains committed to having an active community with a robust censorship resistant core that comes to consensus on any data. Whether this looks like a traditional one citizen one vote system, a reputation system, or just further refinement in the split of voting powers, tellor is open to exploring these options as the crypto ecosystem does. As of now, DAO governance is nascent and fragile. We're currently governance minimalists that want to push the boundaries in areas other than decentralized governance. That said, tellor has a social layer that is the ultimate fallback and this alone was a huge reason for becoming a standalone chain. +### Move to different governance structure +In the long run, we are open to move to a different governance system. Whether it's liquid staking, delegations, or other market forces that could drive centralization and alter crypto economic incentives, tellor remains committed to having an active community with a robust censorship resistant core that comes to consensus on any data. Whether this looks like a traditional one citizen one vote system, a reputation system, or just further refinement in the split of voting powers, tellor is open to exploring these options as the crypto ecosystem does. As of now, DAO governance is nascent and fragile. We're currently governance minimalists that want to push the boundaries in areas other than decentralized governance. That said, tellor has a social Layer that is the ultimate fallback and this alone was a big part of the reason for becoming a standalone chain. ## Issues / Notes on Implementation + diff --git a/adr/adr1009-handling of reporter delegations.md b/adr/adr1009-handling of reporter delegations.md index cbba156f6..9bfb29c1c 100644 --- a/adr/adr1009-handling of reporter delegations.md +++ b/adr/adr1009-handling of reporter delegations.md @@ -7,19 +7,20 @@ ## Changelog - 2024-06-25: initial version -- 2024-07-30: Clarifications added +- 2024-07-30: clarifications added +- 2024-08-03: clean up ## Context -In layer, people can delegate their stakes to validators. To distinguish between delegation to validators and delegations to reporters, delegations to reporters are called selections and those making those selections, selectors. +In Layer, people can delegate their stakes to validators. To distinguish between delegation to validators and delegations to reporters, delegations to reporters are called selections and those making those selections, selectors. -Part of the layer design is that when a reporter submits a price, the system loops through its "selectors" (all parties who have delegated (or selected to give) reporting duties to this reporter) and checks whether or not they are bonded. The reason for the bonding check is that only "bonded" tokens, ones delegated to one of the top 100 validators, are considered valid for reporting. One negative of this approach is that the list of selectors could become so large that looping through this list would cause the transactions to fail. To prevent this, we limited the number of selectors to 100 per reporter. +Part of the Layer design is that when a reporter submits a price, the system loops through its "selectors" (all parties who have delegated (or selected to give) reporting duties to this reporter) and checks whether or not they are bonded. The reason for the bonding check is that only "bonded" tokens, ones delegated to one of the top 100 validators, are considered valid for reporting. One negative of this approach is that the list of selectors could become so large that looping through this list would cause the transactions to fail. To prevent this, we limited the number of selectors to 100 per reporter. However, the cap on selectors and how we handle re-selections can lead to some UX and attack vectors, namely: -- If we allowed instant re-selections you can re-select to another reporter to increase your vote power. To carry out the attack the first reporter would reports early in the report time frame(the user defines the report collection time frame for each queryID), and the second selected reporter goes later. This could be done multiple times to get extra rewards or manipulate the median. +- If we allowed instant re-selections you can re-select to another reporter to increase your vote power. To carry out the attack the first reporter would reports early in the report time frame(the user defines the report collection time frame for each queryID), and the second selected reporter goes later. This could be done multiple times to get extra rewards or manipulate the median. -- Additionaly, since all reporter tokens have to be bonded (being part of the top 100 validators), there is a scenario where your selected reporter falls out of being bonded. This means you would effectively lose out on reporting rewards until you reselect. +- Additionally, since all reporter tokens have to be bonded (being part of the top 100 validators), there is a scenario where your selected reporter falls out of being bonded. This means you would effectively lose out on reporting rewards until you reselect. - Another issue is that a party can spam the 100 selector limit with tiny amounts to effectively censor the reporter from getting additional selectors and force them to spin up new addresses and pay more gas for reporting multiple times. @@ -27,28 +28,30 @@ The current solution is to: - To ensure that any reporter only reports once during the time frame window (which has a maximum of 21 days) and can't reselect to exploit this, re-selection will only be allowed after a lock period of 21 days (meaning that tokens are not counted in any reporters total for that time period). -- The reporter can set a minimum stake amount that they allow to be selected with. This prevents cheap spam attacks for larger reporters. +- The reporter can set a minimum stake amount that they allow to be selected with. This prevents cheap spam attacks for larger reporters. ## Alternative Approaches ### Can never re-select -- This would work, but it makes for poor UX for selectors. In this case if your reporter goes down or you want to switch to yourself, you must unstake both your reporter AND validator, which will lead to a loss in rewards. With the current method, selectors will only lose out on reporting rewards and the validator delegation can remain untouched. +- Not allowing re-selections could be an option but it makes for poor UX for selectors. In this case if your reporter goes down or you want to switch to yourself, you must unstake both your reporter AND validator, which will lead to a loss in rewards. With the current method, selectors will only lose out on reporting rewards and the validator delegation can remain untouched. -### Selectors are just locked at first 100 with no minimum +### Selectors are locked at first 100 with no minimum -- This was the base approach for just capping. The issue here is that you have censoring by simply selecting a reporter with a tiny amount in a bunch of addresses in order to fill them up to 100. The reporter can always start a new address, but this increases their costs as they now must submit twice to report for a given query. Another option for them would be to get all of their honest selectors to move to a new address, but this coordination is not ideal as it would impose an extra burden on honest actors and require off-chain communication, thus potentially doxing certain parties. +- The issue with capping/locking the reporter with the first 100 selectors is that censoring can be done by simply selecting a reporter with a bunch of addresses with a tiny amount in order to fill them up to 100. The reporter can always start a new address, but this increases their costs as they now must submit twice to report for a given query. Another option for them would be to get all of their honest selectors to move to a new address, but this coordination is not ideal as it would impose an extra burden on honest actors and require off-chain communication, thus potentially doxing certain parties. ### Reporters can kick out selectors -- The obvious issue here is censorship (e.g. no selectors from the US). The goal is to make Tellor as permisionless as possible, so giving the ability to self censor any aspect of the system is best to avoid if possible. One potential solution was to only let them remove if full, but this too can be censored and attacked by the reporter themselves if they wish to censor. +- Allowing reporters to kick out selectors can lead to censorship (e.g. no selectors from the US). The goal is to make Tellor as permissionless as possible, so giving the ability to self censor any aspect of the system is best to avoid if possible. One potential solution was to only let them remove if full, but this too can be censored and attacked by the reporter themselves if they wish to censor. ### The reporter gets the top 100 selectors by token weight and the bottom are kicked out -- The problem here is that there is an attack vector of selecting a reporter with a large amount, kicking out all of his selectors and then unselecting that reporter yourself, thus leaving him with no selectors. This additionaly adds monitoring costs for honest selectors who have to monitor whether they are kicked out of a set. +- The problem with following a similar structure as validators, where only the top 100 selectors by token weight are kept and the rest kicked out is that it creates an attack vector by selecting a reporter with a large amount, kicking out all of his selectors and then unselecting that reporter, thus leaving him with no selectors. This also adds monitoring costs for honest selectors who have to monitor whether they are kicked out of a set. ## Issues / Notes on Implementation ### Cost to attack / prevention method -If censoring is still an issue (filling up the 100 slots), the reporter can always get other redelegators to move and then submit a bad value, thus slashing the attackers tokens. Therefore the cost of spam is 100 slots * min stake amount, and you'll likely lose it. We see this being a valid solution as the only reason to attack is to prevent repelators from choosing a specific reporter to increase rewards for your own reporter for a specific period of time. If the rewards for any time period are much greater than the attack to censor (very likely not the case with a non-zero minimum), censoring could happen for a short period of time. For this reason, we expect reporters, especially validator/reporters with high reputation, to have larger minimums for selection. +If censoring is still an issue (filling up the 100 slots), the reporter can always get other redelegators to move and then submit a bad value, thus slashing the attackers tokens. Therefore the cost of spam is 100 slots * min stake amount, and the attacker would likely lose it. We see this being a valid solution as the only reason to attack is to prevent selectors from choosing a specific reporter to increase rewards for your own reporter for a specific period of time. If the rewards for any time period are much greater than the attack to censor (very likely not the case with a non-zero minimum), censoring could happen for a short period of time. For this reason, we expect reporters, especially validator/reporters with high reputation, to have larger minimums for selection. + + diff --git a/adr/adr2001 - trb bridge structure.md b/adr/adr2001 - trb bridge structure.md index 279fcee88..cb5070d3d 100644 --- a/adr/adr2001 - trb bridge structure.md +++ b/adr/adr2001 - trb bridge structure.md @@ -1,4 +1,4 @@ -# ADR 2001: trb bridge structure +# ADR 2001: TRB bridge structure ## Authors @themandalore @@ -8,37 +8,42 @@ - 2024-03-28: initial version - 2024-04-01: revised for more discussion and align with data spec +- 2024-08-12: spelling ## Context -Tellor Tributes (TRB) is the tellor token. It exists on Ethereum and cannot be changed. It mints ~4k to the team each month and ~4k to the oracle contract for time based rewards. When starting Layer we will launch a bridging contract where parties can deposit TRB to Layer. Layer will utilize reporters then to report deposit events to itself. When the deposit is made it will be assigned a deposit ID and an event will be kicked off. All reporters will report for that event for a 1 hour window (this is allowed so that reporters are able to wait a certain amount of blocks before reporting so that the state of Ethereum has reached a high level of finality) and then we will optimistically use the report in our system, ensuring that the report is at least 12 hours old before the tokens are minted on Layer. Once the value is 12 hours old anyone can mint the tokens on Layer for the specified deposit ID. +Tellor Tributes (TRB) is the tellor token. It exists on Ethereum and cannot be changed. It mints ~4k to the team each month and ~4k to the oracle contract for time based inflationary rewards (tbr). When starting Layer we will launch a bridging contract where parties can deposit TRB to Layer. Layer will utilize reporters then to report deposit events to itself. When the deposit is made it will be assigned a deposit ID and an event will be kicked off. All reporters will report for that event for a 1 hour window (this is allowed so that reporters are able to wait a certain amount of blocks before reporting so that the state of Ethereum has reached a high level of finality) and then we will optimistically use the report in our system, ensuring that the report is at least 12 hours old before the tokens are minted on Layer. Once the value is 12 hours old anyone can mint the tokens on Layer for the specified deposit ID. -As an additional security measure, the bridge contract will not allow more than 20% of the total supply on Layer to be bridged within a 12 hour period (the function will be locked). This will be to ensure that someone does not bridge over a very large amount to stake/grief the network, manipulate votes, or grief the system via disputes without proper time to analyze the situation. For the reverse direction, parties will burn TRB on Layer, the reporters will then report that it happened and then the bridge contract on Ethereum can use the tellor data as any other user, but this time reading burn events. A 20% withdraw limit is also used in this direction and the bridge contract will also use the data optimistically (12 hours old) to further reduce attack vectors. + ![ ADR2001](./graphics/adr2001.png) -The cycle list helps keep the network alive by providing a list of data requests that reporters can support to receive time-based rewards(inflationary rewards) when there are no tips available to claim. Each data request on the cycle list rotates over time so that each request gets pushed on chain on a regular basis. The bridge deposit data request will not appear in the "next request" of the cycle list, however reporters will be allowed to report for it and claim time based rewards for it. Time based rewards will be split between the data request on the cycle list and the bridged deposit request. Parties can also use the tip functionality to incentivize faster updates for deposits. +As an additional security measure, the bridge contract will not allow more than 20% of the total supply on Layer to be bridged within a 12 hour period (the function will be locked). This will be to ensure that someone does not bridge over a very large amount to stake/grief the network, manipulate votes, or grief the system via disputes without proper time to analyze the situation. For the reverse direction, parties will burn TRB on Layer, the validators will then attest that it happened and then the bridge contract on Ethereum can use the tellor data as any other user, but this time reading burn events. A 20% withdraw limit is also used in this direction and the bridge contract will also use the data optimistically (12 hours old) to further reduce attack vectors. + +The cycle list helps keep the network alive by providing a list of data requests that reporters can support to receive time-based rewards(inflationary rewards) when there are no tips available to claim. Each data request on the cycle list rotates over time so that each request gets pushed on chain on a regular basis. The bridge deposit data request will not appear in the "next request" of the cycle list, however reporters will be allowed to report for it and claim time based rewards for it. Time based rewards will be split between the data request on the cycle list and the bridged deposit request. Parties can also use the tip functionality to incentivize faster updates for deposits. + + ![ ADR1003](./graphics/adr1003.png) ## Alternative Approaches -### validators run the bridge +### Validators run the bridge -Rather than reporters, we could simply have validators natively run the bridge. This option would work fine and projects like Celer/gravity bridge already have implementations written. The reason we're going against it is twofold: a) finality issues with Ethereum make this inherently risky for any bridge and b) we should be dogfooding our own product. There's no reason you can't use tellor as a bridge, so we should do so. Having validators the run bridge and submit would also require us to write a different bridge structure for the return trip. +Rather than reporters, we could simply have validators natively run the bridge. This option would work fine and projects like Celer/gravity bridge already have implementations written. The reason we're going against it is twofold: a) finality issues with Ethereum make this inherently risky for any bridge and b) we should be dogfooding our own product. There's no reason you can't use tellor as a bridge, so we should do so. Having validators the run bridge and submit would also require us to write a different bridge structure for the return trip. -### don't add as part of the cycle list +### Don't add bridge deposits as part of the cycle list -Forcing parties to report for the bridge might not be feasible when there are no deposit events, finality is not always constant, and could force unnecessary updates. For this reason we went with a longer time frame for submission (1 hour per event). This can still work with the cycle, but represents using the cycle list in a unique way. +Forcing parties to report for the bridge might not be feasible when there are no deposit events, finality is not always constant, and could force unnecessary updates. For this reason we went with a longer time frame for submission (1 hour per event). This can still work with the cycle, but represents using the cycle list in a unique way. -### don't use optimistically, just use if consensus hit +### Don't use optimistically, just use if consensus hit -The reason we want to use it optimistically here is for chain rollbacks. Although it's unlikely to happen and validator set changes are limited by percent, you could still pretend to deposit a bunch, roll back the chain, and then double spend or dispute on our chain with unlocked tokens. Since there is no immediacy need for trb to be bridged, we will simply make it take 12 hours and then even limit the amount bridged over. +The reason we want to use it optimistically here is for chain rollbacks. Although it's unlikely to happen and validator set changes are limited by percent, you could still pretend to deposit a bunch, roll back the chain, and then double spend or dispute on our chain with unlocked tokens. Since there is no immediate need for trb to be bridged, we will simply make it take 12 hours and then even limit the amount bridged over. -### allow a tip to be included along with the deposit on Ethereum +### Allow a tip to be included along with the deposit on Ethereum It was considered to allow depositors to include a tip to incentivize reporters to bridge over the data faster to Layer. However, the process for verifying the data was reported to Layer and reporting back the reporters to Ethereum to claim the tip would be inefficient, make the process more complex, and require more storage to track the tips than tipping and distributing tips on Layer. - ## Issues / Notes on Implementation -Note that governance can change the queryId time frame and it should be monitored to make sure that commit times are enough notice on a given tip. +Note that governance can change the queryId *time frame* and it should be monitored to make sure that commit times are enough notice on a given tip. + +In the case of a broken validator set (a completely compromised layer chain (>2/3 malicious)), a social fork will be necessary to save layer. Users will be aware of this and will be able to handle a failure, however in this case the bridge is the "user" of layer with regards to releasing tokens. We had looked into adding some sort of pause or schelling game to fork the bridge contract, however these solutions seem more like attack vectors than options. Ultimately, the TRB token will be used on layer. The only reason it will be on Ethereum is for legacy trading and CEX integrations (once legacy users are moved to layer). This is fine (these users and CEX contracts should never be forced to upgrade to cosmos if possible), however there is no real "break" of the system. Ultimately if you take over our validator set, you will get forked out and lose the tokens. The trading venues and exchanges will need to monitor and freeze the trading should this occur. Although extreme, this is preferable to introducing an attack or censorship vector (e.g. a multisig to freeze the contracts) that would require a fork anyway, but would also not require the attacker to actually buy up tokens to hit 2/3 of the layer validator set. Ultimately, limiting the token withdrawals to a certain percentage per day is the best option to give trading venues time to halt in the case of an attack. -In the case of a broken validator set (a completely compromised layer chain (>2/3 malicious)), a social fork will be necessary to save layer. Users will be aware of this and will be able to handle a failure, however in this case the bridge is the "user" of layer with regards to releasing tokens. We had looked into adding some sort of pause or schelling game to fork the bridge contract, however these solutions seem more like attack vectors than actual options. Ultimately, the TRB token will be used on layer. The only reason it will be on Ethereum is for legacy trading and CEX integrations (once legacy users are moved to layer). This is fine (these users and CEX contracts should never be forced to upgrade to cosmos if possible), however there is no real "break" of the system. Ultimately if you take over our validator set, you will get forked out and lose the tokens. The trading venues and exchanges will need to monitor and freeze the trading should this occur. Although extreme, this is preferable to introducing an attack or censorship vector (e.g. a multisig to freeze the contracts) that would require a fork anyway, but would also not require the attacker to actually buy up tokens to hit 2/3 of the layer validator set. Ultimately, limiting the token withdrawals to a certain percentage per day is the best option to give trading venues time to halt in the case of an attack. diff --git a/adr/adr2002 - nonces for bridging.md b/adr/adr2002 - nonces for bridging.md deleted file mode 100644 index 2b4c72aab..000000000 --- a/adr/adr2002 - nonces for bridging.md +++ /dev/null @@ -1,37 +0,0 @@ -# ADR 2002: Nonces for Bridging - -## Authors - -@themandalore -@tkernell - -## Changelog - -- 2024-02-21: initial version -- 2024-02-26: unbonding period -- 2024-04-04: clarity in background - - -## Context - -There is a need for nonces to keep track of when data is created on layer. The problem is: should you allow older signed data to be pushed after newer signed data? If you do, you can give optionality to bridge users for going back in time (e.g. a price feed). - -For layer include a timestamp as one of the parameters used in bridge validator set updates in place of a nonce. This is different than the original blobstream which also had a universal nonce. Each time the bridge validator set changes, all validators sign a hash of multiple parameters, including the new validator set timestamp. The bridge contract enforces that this timestamp is greater than the previous one. The bridge contract also uses this timestamp to determine whether a given validator set record is stale by comparing the timestamp to the Layer unbonding period. We use the strictly increasing timestamp rule to prevent the bridge from accepting old validator set attestations, and it also allows the bridge to save gas costs by skipping blocks. In addition, we use the age of a validator set attestation to determine whether that validator set's tokens are still locked as stakes and thus eligible for slashing. - -We do not include a nonce for oracle data attestations. We use attestation timestamps and report timestamps instead to determine the ages of these, respectively. We do not necessarily need every single oracle attestation to be bridged to every single user chain, and they do not have to be bridged in the order in which they were created. We include `nextTimestamp` and `previousTimestamp` in each oracle attestation to determine ordering properties of oracle reports. - - -## Alternative Approaches - -### require a universal nonce - -A universal nonce would mean that every time data is signed on layer, you would need to push it across to the bridge. This is beneficial for DA systems (like Celestia's blobstream) as you want blocks to be processed in order. If not, you could have a situation where some data can front run other data and prevent it from being pushed. For our purposes, we only require that timestamps move forward in terms of the block signed. This does mean that some updates on layer can be skipped over (e.g. if we report prices 100, 101, and 102, a user on ETH could just bridge the 102 update and skip the other two). If a user wants to preserve the order of data pushed to Tellor, they can implement a nonce in the query and force increase it per request. - - -## Issues / Notes on Implementation - -We had originally wanted to just say that a validator is staked until unbonded (e.g. 21 day unbonding period), but a validator set can change significantly very quickly due to disputes and slashing events, so comparing a validator set's age to the unbonding period does not ensure that a given validator still has tokens at stake. For this reason, we use the validator nonce and don't allow you to keep reporting if the validator set changes quickly. - -## Links - -https://github.com/celestiaorg/blobstream-contracts \ No newline at end of file diff --git a/adr/adr2002 - ordering properties for user data and validator set updates.md b/adr/adr2002 - ordering properties for user data and validator set updates.md new file mode 100644 index 000000000..c8c5fbec8 --- /dev/null +++ b/adr/adr2002 - ordering properties for user data and validator set updates.md @@ -0,0 +1,54 @@ +# ADR 2002: Ordering properties for user data and validator set updates + +## Authors + +@themandalore +@tkernell +@brendaloya + +## Changelog + +- 2024-02-21: initial version +- 2024-02-26: unbonding period +- 2024-04-04: clarity in background +- 2024-08-05: clean up + +## Context + +Nonces generally help keep track of the order that data is added and the validator updates happen on cosmos chains. +While blobstream has used nonces to track the order of these important pieces, in Layer we have opted to use timestamps, as described below, for oracle data attestations and validator set changes. Strict rules are applied for for the validator set updates (ADR 2005) but the user can determine what data to use for their use case based on the timestamps provided. + +User data attestations - Each piece of data has 4 timestamps assoicated with it: 1) `attestationTimestamp`, 2)`reportTimestamp`, 3)`nextTimestamp`, 4)`previousTimestamp`. + +Valicator updates - Each time the validator set is updated there is a new `validatorSetTimestamp`. This prevents the valiator set from being updated to an old set by requiring that the timstamp always increases with each update. + + ![ ADR2002](./graphics/adr2002.png) +### Data attestations + +Keeping track of the order of user data is important for Layer because allowing users to request old data can create optionality in the data used in their protocols (e.g. allowing users to request old price data for their benefit instead of the latest available). When users request a an attestaton for data the `attestationTimestamp`,`reportTimestamp`,`nextTimestamp` (where this should be zero if it is the latest) and `previousTimestamp` are provided to determine ordering properties of bridged user data. The attestation timestamp is used to verify there is not a stale attestation in place. This ensures that there have been no disputes and no significant validator changes. + +Since users may not need every single oracle data point, providing the four different timestamps allows them to skip entries when needed (e.g. if we report prices 100, 101, and 102, a user on ETH could just bridge the 102 update and skip the other two). + + +### Validator set changes + +The order of the validator set updates is also very important because it helps maintain a list of validators that are still bonded and active. + +However, instead of a nonce, Layer includes a timestamp as one of the parameters used in bridge validator set updates. This is different than the original blobstream which also had a universal nonce. Each time the bridge validator set changes, all validators sign a hash of multiple parameters, including the new `validatorSetTimestamp`. The bridge contract enforces that this timestamp is greater than the previous one. The bridge contract also uses this timestamp to determine whether a given validator set record is stale by comparing the timestamp to the Layer unbonding period. We use the strictly increasing timestamp rule to prevent the bridge from accepting old validator set attestations, and it also allows the bridge to save gas costs by skipping blocks. + +In addition, we use the age of a validator set attestation to determine whether that validator set is the latest. This gives a higher confidence that the validators tokens are still locked as stakes and thus eligible for slashing. However, the amount of tokens available for slashing can change drastically due to disputes. This is why it is best practice for the user to request an attestation closer to the usage of the data. + +## Alternative Approaches + +### Require a universal nonce for validator updates + +We considered implementing a universal nonce but because that would mean that every time data is signed on layer it would need to be pushed across the bridge. This is beneficial for DA systems (like Celestia's blobstream) since these need blocks to be processed in order. If not, a situation could emerge where some data can front run other data and prevent it from being pushed. For our purposes, we only require that timestamps move forward in terms of the block signed. This means that some updates on layer can be skipped over (e.g. if we report prices 100, 101, and 102, a user on ETH could just bridge the 102 update and skip the other two). If a user wants to preserve the order of data pushed to Tellor, they can implement a nonce in the query and force it to increase per request. + +## Issues / Notes on Implementation + +We considered using the unbonding period to determine if validator tokens are available for slashing (be staked until unbonded). Because the validator set can change significantly very quickly due to disputes and slashing events, comparing a validator set's age to the unbonding period does not ensure that a given validator still has tokens at stake. If a bad value can make it though within that 21 day period then it is likely that the chain is compromised and a fork would be needed so instead we opted to provide the user with best practices for using the data. + +## Links + +https://github.com/celestiaorg/blobstream-contracts + diff --git a/adr/adr2003 - vote extensions vs txns for bridge.md b/adr/adr2003 - vote extensions vs txns for bridge.md deleted file mode 100644 index f39d0511a..000000000 --- a/adr/adr2003 - vote extensions vs txns for bridge.md +++ /dev/null @@ -1,34 +0,0 @@ -# ADR 2003: vote extensions vs transactions for bridge signatures - -## Authors - -@themandalore -@brendaloya - -## Changelog - -- 2024-02-27: initial version -- 2024-04-01: expanded on discussion - -## Context - -In order to parse validator signatures on EVM chains, tellor validators need to sign oracle data with ecsda keys (not the normal edd keys used in tendermint). There are two places where we can place these signatures, either as transactions on the chain, or as vote extensions. Vote extensions in the cosmos sdk, are simply data that is appended to validator signatures on a given block. Since it is required that validators commit this data, adding them as vote extensions makes sense as it will force validators to mantain the bridge. The limit to vote extensions is that the data must be very limited in size of about 4MB. Too many signatures could result in the chain slowing down or bridge information being ommitted. Additionally, vote extensions are a relatively newer feature of the sdk. - - -## Alternative Approaches - -### place as txns - -The original idea was to just have validators submit a transaction in each block after finalized oracle data. The issue with this approach is that the proposer for any given block has control over what transactions get included. This means that they could censor signatures from certain validators and it would be impossible to tell whether they were censored or failed to submit the transaction and would require off-chain monitoring. Additionally, size issues still exist with transactions even as block size is generally much bigger than 4MB, and storing each signature as a transaction is much larger on aggregate (when considering chain state size growth). The transaction method would force validators to pay gas on signature transactions and compete for space in each block with non-bridge signature transactions (e.g. data submissions). This problem can be addressed by implementing lanes from Skip Protocol. However, at this moment, we have tentatively decided on using vote extensions and will be testing the size limitations and experimenting with data compression techniques. - - -### use zk method, no signatures - -A future option (that celestia is also taking) is to completely abandon external signatures and opt for zk methods. I would say that this is the long term plan, however current zk methods are so novel that relying on them would be more akin to experimentation than actual robust usage. Additionally, proving times for most of these methods is still prohibitively slow for many oracle use cases and may also add a centralization vector if advanced hardware is required. - - -## Issues / Notes on Implementation - -The main concern on this approach is the limited size for vote extensions since this has a direct effect on how much data can be 'packaged' (attested to) to be bridged. - - diff --git a/adr/adr2003 - why we used vote extensions for bridge signatures.md b/adr/adr2003 - why we used vote extensions for bridge signatures.md new file mode 100644 index 000000000..3d5b711d7 --- /dev/null +++ b/adr/adr2003 - why we used vote extensions for bridge signatures.md @@ -0,0 +1,33 @@ +# ADR 2003: Why we used vote extensions for bridge signatures + +## Authors + +@themandalore +@brendaloya + +## Changelog + +- 2024-02-27: initial version +- 2024-04-01: expanded on discussion +- 2024-08-12: spelling and title update + +## Context + +In order to parse validator signatures on EVM chains, Tellor validators need to sign oracle data with ecsda keys (not the normal edd keys used in tendermint). There are two places where we can place these signatures, either as transactions on the chain, or as vote extensions. Vote extensions in the cosmos sdk, are simply data that is appended to validator signatures on a given block. Since it is required that validators commit this data, adding them as vote extensions is preferred as it will force validators to maintain the bridge. The limit to vote extensions is that the data must be very limited in size of about 4MB. Too many signatures could result in the chain slowing down or bridge information being omitted. Additionally, vote extensions are a relatively newer feature of the sdk. + +## Alternative Approaches + +### place as txns + +The original idea was to have validators submit a transaction in each block after finalized oracle data. The issue with this approach is that the proposer for any given block has control over what transactions get included. This means that they could censor signatures from certain validators and it would be impossible to tell whether they were censored or failed to submit the transaction and would require off-chain monitoring. Additionally, size issues still exist with transactions even as block size is generally much bigger than 4MB, and storing each signature as a transaction is much larger on aggregate (when considering chain state size growth). The transaction method would force validators to pay gas on signature transactions and compete for space in each block with non-bridge signature transactions (e.g. data submissions). This problem can be addressed by implementing lanes from Skip Protocol. However, at this moment, we have decided on using vote extensions and will be testing the size limitations and experimenting with data compression techniques. + +### use zk method, no signatures + +A future option (that celestia is also taking) is to completely abandon external signatures and opt for zk methods. This is the long term plan, however current zk methods are so novel that relying on them would be more akin to experimentation than actual robust usage. Additionally, proving times for most of these methods is still prohibitively slow for many oracle use cases and may also add a centralization vector if advanced hardware is required. + +## Issues / Notes on Implementation + +The main concern on this approach is the limited size for vote extensions since this has a direct effect on how much data can be 'packaged' (attested to) to be bridged. + + + diff --git a/adr/adr2004 - validator set size.md b/adr/adr2004 - validator set size.md index a49847835..f53bdafbc 100644 --- a/adr/adr2004 - validator set size.md +++ b/adr/adr2004 - validator set size.md @@ -15,14 +15,14 @@ The number of validators has direct effect on bridging. We have chosen 100 validator cap because it seems reasonable based on what we have observed in the current cosmos/tendermint ecosystem. Vote extension are relatively new to the cosmos sdk so the exact number to cap validators will be a function of the number of signatures we can fit in the vote extension(to maximize data bridging and decentralization), what we see currently in the cosmos/tendermint ecosystem, and how well that number of validators can be incentivized with the 25% validator rewards split (75% to reporters, 25% to validators). -Market conditions will take care of the economic incentives over time and reach equilibrium. However, maximizing the amount of data bridged with a sufficiently decentralized validator set may just be arbitrary initially and be adjusted via governance later. The current plan is to work with the technology to increase the validator set size and reduce concentration where we can. As bridge contracts get cheaper, zk methods become more readily available, and the cosmos sdk can handle more validators doing faster blocks, we plan to increase this number and decentralize as much as we can. +Market conditions will take care of the economic incentives over time and reach equilibrium. However, maximizing the amount of data bridged with a sufficiently decentralized validator set may just be arbitrary initially and be adjusted via governance later. The current plan is to work with the technology to increase the validator set size and reduce concentration where we can. As bridge contracts get cheaper, zk methods become more readily available, and the cosmos sdk can handle more validators doing faster blocks, we plan to increase this number and decentralize as much as we can. ## Alternative Approaches ### More validators -More validators, more decentralization, but the problem with more validators is that data needs to be shared across a larger set and can lead to slower blocks. Additionally, each signature from validators must be parsed in an EVM smart contract for bridging. A validator set of 100 can be parsed but is still rather expensive (~2M gas from initial estimates). We can reduce this a little by only validating the largest ones (up to 2/3 power), however there is a direct tradeoff between validator decentralization and cost to verify. +More validators, more decentralization, but the problem with more validators is that data needs to be shared across a larger set and can lead to slower blocks. Additionally, each signature from validators must be parsed in an EVM smart contract for bridging. A validator set of 100 can be parsed but is still rather expensive (~2M gas from initial estimates). We can reduce this a little by only validating the largest ones (up to 2/3 power), however there is a direct tradeoff between validator decentralization and cost to verify. ### Less validators diff --git a/adr/adr2005 - Validator set updates.md b/adr/adr2005 - Validator set updates.md index 49ca803a5..d7b60d70f 100644 --- a/adr/adr2005 - Validator set updates.md +++ b/adr/adr2005 - Validator set updates.md @@ -15,6 +15,7 @@ The validator set will be allowed to change up to 5% of total staked every 12 hours. Setting the cap at 5% allows for 6, 12 hour periods(3 days) to pass before the validator set changes by 30%. Although, it may not deter all attacks, having to wait 3.5 days to take over the network for an attack can be enough deterrent. Based on talks with others that have used the cosmos sdk, changes larger than 5-10% are rarely observed once the new chain novelty passes and validators settle. + ![ ADR2005](./graphics/adr2005.png) ## Alternative Approaches diff --git a/adr/adr2006 - data bridge architecture.md b/adr/adr2006 - data bridge architecture.md index 65c02db27..2015ecdee 100644 --- a/adr/adr2006 - data bridge architecture.md +++ b/adr/adr2006 - data bridge architecture.md @@ -1,30 +1,41 @@ -# ADR 2006: Layer Data Bridge Architecture +# ADR 2006: Layer data bridge architecture ## Authors -@heavychain +@heavychain @brendaloya ## Changelog - 2024-04-25: initial version +- 2024-08-07: clean up ## Context +The Layer data bridge is used for relaying data from Tellor Layer to user chains. Layer validators attest to all oracle data, and these attestations are relayed to a bridge contract on any user chain. The bridge contract verifies that at least 2/3 of the current validator set's power has signed a given report. Note that Tellor users are free to access Tellor data in any way they choose, and this is just one of many possible implementations. This document communicates the way in which Layer facilitates user data attestations, as well as signing updates to the validator set over time. -The Layer data bridge is used for relaying data from Tellor Layer to user chains. Layer validators attest to all oracle data, and these attestations are relayed to a bridge contract on any user chain. The bridge contract verifies that at least 2/3 of the current validator set's power has signed a given report. Note that tellor users are free to access tellor data in any way they choose, and this is just one of many possible implementations. This document communicates the way in which layer facilitates these oracle attestations, as well as signing updates to the validator set over time. -## Bridge Validator Set +## Bridge validator set checkpoints and updates -The security of the bridge depends on the bridge contract being aware of the layer validator set at any given time. The contract is deployed with an initial validator set, and then updates to the validator set are signed by the validators and relayed to the bridge contract in a similar way to the bridge data itself. The way this is achieved is outlined below. +The security of the bridge depends on the bridge contract being aware of the Layer validator set at any given time. The contract is deployed with an initial validator set, and then updates to the validator set are signed by the validators and relayed to the bridge contract in a similar way to the bridge data itself. The way this is achieved is outlined below. -At the end of each layer block, the bridge module checks for changes to the validator set. If the layer validator set has changed by 5% since the last saved bridge validator set, the bridge validator set is updated. The hash of this new validator set, plus the new 2/3 power threshold and the current block time (also used in the bridge contract to ensure validator set updates always have a greater timestamp), are hashed together to created the latest bridge validator set checkpoint. This checkpoint is what all validators sign in order to update the validator set in the bridge contract. Then, in the vote extension where each validator votes on the latest proposed block, the validators check whether they have signed the latest bridge validator set checkpoint, and if not, they sign and include the signatures with their votes. Finally, the block proposer for the next block updates the layer state to save these checkpoint signatures. +At the end of each Layer block, the bridge module checks for changes to the validator set. If the Layer validator set has changed by 5% since the last saved bridge validator set, the bridge validator set is updated. The hash of this new validator set, plus the new 2/3 power threshold and the current block time (also used in the bridge contract to ensure validator set updates always have a greater timestamp), are hashed together to create the latest bridge validator set checkpoint. This checkpoint is what all validators sign in order to update the validator set in the bridge contract. Then, in the vote extension where each validator votes on the latest proposed block, the validators check whether they have signed the latest bridge validator set checkpoint, and if not, they sign and include the signatures with their votes. Finally, the block proposer for the next block updates the Layer state to save these checkpoint signatures. -### Oracle Attestions -The bridge contract depends on validator signatures to verify what data has been aggregated on layer. All validators automatically sign all new aggregate reports, and new attestations of past data can be requested via a transaction. + ![ ADR2006 Validator set update ](./graphics/adr2006validatorsset.png) -#### New Reports +### New reports attestations +The bridge contract depends on validator signatures to verify what data has been aggregated on Layer. All validators automatically sign all new aggregate reports. + +#### New reports snapshots and updates At the end of each block, the bridge module also checks for new aggregate reports created in the current block. For any new aggregate reports, the bridge module begins preparing a new attestation request. This first depends on retrieving all parameters which will be relayed to the bridge contract, including the report queryId, aggregate value, report timestamp, aggregate power, previous report timestamp, next report timestamp, current bridge validator set checkpoint, and the attestation timestamp, which is the current block timestamp. All of these parameters are encoded together and hashed to create a snapshot. -This snapshot is used for organizing each set of attestations, and it is also the message which will be signed to create the oracle attestation. While some of these parameters are fixed and already saved with the aggregate report, a few of them may change over time, and therefore they are saved separately as snapshot data, which includes the validator checkpoint, attestation timestamp, previous report timestamp, and next report timestamp. We also include the queryId and report timestamp in this snapshot data for purposes of maximizing the amount of space available in the vote extensions. The snapshot data will be needed by bridge relayers when relaying attestations from layer to user chains. The snapshot data is saved to layer state, the new snapshot is added to a list of snapshots for the particular aggregate report (mapped by queryId and timestamp), and then this snapshot is added to a list of attestation requests by the current block height. Then, in the vote extension, all validators check for attestation requests from the previous block. They sign any snapshots and include these signatures (and snapshots) with their block vote. Finally, the block proposer for the next block saves the attestations to state in a mapping from snapshot to attestations. +This snapshot is used for organizing each set of attestations, and it is also the message which will be signed to create the oracle attestation. While some of these parameters are fixed and already saved with the aggregate report, a few of them may change over time, and therefore they are saved separately as snapshot data, which includes the validator checkpoint, attestation timestamp, previous report timestamp, and next report timestamp. We also include the queryId and report timestamp in this snapshot data for purposes of maximizing the amount of space available in the vote extensions. The snapshot data will be needed by bridge relayers when relaying attestations from Layer to user chains. The snapshot data is saved to Layer state, the new snapshot is added to a list of snapshots for the particular aggregate report (mapped by queryId and timestamp), and then this snapshot is added to a list of attestation requests by the current block height. Then, in the vote extension, all validators check for attestation requests from the previous block. They sign any snapshots and include these signatures (and snapshots) with their block vote. Finally, the block proposer for the next block saves the attestations to state in a mapping from snapshot to attestations. + + ![ ADR2006](./graphics/adr2006.png) + +#### Past Reports attestations +In order to request new attestations for a past aggregate report, anyone can create a `requestAttestations` transaction in the bridge module for a given queryId and timestamp. This works the same way as automated current attestation requests in that a snapshot is created, with snapshot data, and this snapshot is added to the current block's list of attestation requests. + +## Alternative Approaches + +## Issues / Notes on Implementation + -#### Past Reports -In order to request new attestations for a past aggregate report, anyone can create a `requestAttestations` transaction in the bridge module for a given queryId and timestamp. This works the same way as automated current attestation requests in that a snapshot is created, with snapshot data, and this snapshot is added to the current block's list of attestation requests. \ No newline at end of file diff --git a/adr/adr2007 - initialization and tbr on bridge.md b/adr/adr2007 - initialization and tbr on bridge.md index da542a8e8..989d08de3 100644 --- a/adr/adr2007 - initialization and tbr on bridge.md +++ b/adr/adr2007 - initialization and tbr on bridge.md @@ -8,43 +8,53 @@ - 2024-07-03: initial version - 2024-07-03: expanded on some scenarios +- 2024-08-12: clean up ## Context -When starting layer, there will need to be an initial token supply in order for us to have an initial validator set. Additionally, we need a way to start time base rewards (inflation) on layer without creating tokens out of thin air. As per other ADR's, all tokens on layer will be tokens from mainnet Ethereum locked into the bridge contract, so there is a challenge in launching layer and the timing in switching inflationary rewards from the Ethereum mainnet contract to layer. +When starting Layer, there will need to be an initial token supply in order for us to have an initial validator set. Additionally, we need a way to start time base rewards (inflation) on Layer without creating tokens out of thin air. As per other ADR's, all tokens on Layer will be tokens from mainnet Ethereum locked into the bridge contract, so there is a challenge in launching Layer and the timing in switching inflationary rewards from the Ethereum mainnet contract to Layer. + +The solution to this is to properly order and time the launch of the bridge contract/Layer as well as the switch of inflationary rewards. -The solution to this is to properly order and time the launch of the bridge contract/ layer as well as the switch of inflationary rewards. The order expected + a) Launch bridge contract on Ethereum - b) Transfer tokens of initial supply on layer to the bridge contract - * note, not a deposit, but just tokens transferred to the contract. All tokens just transferred to the bridge contract will be considered inflationary rewards on layer, while tokens deposited through the "deposit" function will be eligible for claiming on layer. - c) Next, layer will launch with an initial validator and token balance transferred in (b) - d) The bridge smart contract is initialized with the initial layer validator set and block height - e) Layer mainnet will commence with no inflationary rewards. Parties can still bridge to layer, but the rewars will still be on Ethereum. - f) Once layer is deemed ready for users, "updateOracleAddress" will be run on Ethereum and inflationary rewards will be switched from the mainnet Ethereum oracle contract to the token bridge. Now all newly minted tokens will be transferred to the bridge. - g) Once this happens, layer governance will pass a vote to start inflationary rewards on layer. - - Minted rewards can be claimed on mainnet via a withdrawal process due to the TBR on mainnet going to the bridge contract - - there will likely be a slight time mismatch (just different systems not synced up) between inflation stopping on mainnet and initiating on layer. This delay will ensure that the tokens minted on layer will always be less than are available in the bridge contract. - h) parties looking to exit layer will use the token supply in the bridge, and it will automatically call "mintToOracle" if the contract needs to refresh its inflationary rewards. + b) Transfer tokens of initial supply on Layer to the bridge contract + * note: not a deposit, but just tokens transferred to the contract. All tokens just transferred to the bridge contract will be considered inflationary rewards on Layer, while tokens deposited through the "deposit" function will be eligible for claiming on Layer. -## Alternative Approaches + c) Next, Layer will launch with an initial validator and token balance transferred in (b) + + d) The bridge smart contract is initialized with the initial Layer validator set and block height + + e) Layer mainnet will commence with no inflationary rewards. Parties can still bridge to Layer, but the rewards will still be on Ethereum. -### deposit and withdraw tbr on layer method + f) Once Layer is deemed ready for users, "updateOracleAddress" will be run on Ethereum and inflationary rewards will be switched from the mainnet Ethereum oracle contract to the token bridge. Now all newly minted tokens will be transferred to the bridge. -The original plan was to use a method of minting to the bridge contract, then having to bridge it over to layer and have a method for distributing it as rewards. The problem here is that if we forget to bridge the rewards over, there is a possibility of not having any rewards to distribute on the chain. This could cause validators and/or reporters to halt while the rewards are being bridged because it takes 12 hours to bridge tokens. We want to avoid the chain coming to a halt for possibly 12 hours as this could have an adverse effect on our users. + g) Once this happens, Layer governance will pass a vote to start inflationary rewards on Layer. + - minted rewards can be claimed on mainnet via a withdrawal process due to the TBR on mainnet going to the bridge contract + - there will likely be a slight time mismatch (just different systems not synced up) between inflation stopping on mainnet and initiating on Layer. This delay will ensure that the tokens minted on Layer will always be less than are available in the bridge contract. + + h) parties looking to exit Layer will use the token supply in the bridge, and it will automatically call "mintToOracle" if the contract needs to refresh its inflationary rewards. -### extra tokens minted on creation that can't be withdrawn -We had another idea to handle the launch portion that would mint a certain number of tokens on layer to the team initially and those would be in a locked state and not be eligible for withdrawing. However, the security of the system relies on disputes and not being able to 'lose' tokens can lead to bad incentives. If the tokens were to be used to incentivize other validators (outside the team), it would create a scenario where they are incetivized to provide bad data so that they can 'unlock' the tokens via the dispute mechanism. Additionaly, the idea of "new" tokens even if slightly different and locked has a bad image. We didn't go with this option because all of these scenarios seemed like threat to our security. +## Alternative Approaches + +### Deposit and withdraw tbr on Layer method + +The original plan was to use a method of minting to the bridge contract, then having to bridge it over to Layer and have a method for distributing it as rewards. The problem here is that if we forget to bridge the rewards over, there is a possibility of not having any rewards to distribute on the chain. This could cause validators and/or reporters to halt while the rewards are being bridged because it takes 12 hours to bridge tokens. We want to avoid the chain coming to a halt for possibly 12 hours as this could have an adverse effect on our users. +### Extra tokens minted on creation that can't be withdrawn -### launch layer and mint from start +We had another idea to handle the launch portion that would mint a certain number of tokens on Layer to the team initially and those would be in a locked state and not be eligible for withdrawing. However, the security of the system relies on disputes and not being able to 'lose' tokens can lead to bad incentives. If the tokens were to be used to incentivize other validators (outside the team), it would create a scenario where they are incentivized to provide bad data so that they can 'unlock' the tokens via the dispute mechanism. Additionally, the idea of "new" tokens even if slightly different and locked has a bad image. We didn't go with this option because all of these scenarios seemed like threat to our security. -This idea would be to just launch layer and start minting. We would then switch over the oracle contract on mainnet at somepoint, but there would be minting on both chains for that time being. Assuming the mismatch amount and that withdrawal are never more than what is in the bridge contract (~4k per month mismatched), it could work, but that is a huge assumption. There would be extra tokens, but anly as long as not everyone withdraws from layer. +### Launch Layer and mint from start -This was obviously not a good option since it creates a non-liquid position and image wise it's printing unbacked tokens on layer would not be acceptable. It also would be just handing extra tokens to the team since we would likely be the initial validator set (the team should run the chain without rewards to kick start it). It could also lead to race conditions on the bridge to get rewards faster than other reporters on layer. By not going with this method, we allow for mainnet testing of layer in an opt-in fashion and allow time for reporters to switch over. +This idea would be to just launch Layer and start minting. We would then switch over the oracle contract on mainnet at some point, but there would be minting on both chains for that time being. Assuming the mismatch amount and that withdrawal are never more than what is in the bridge contract (~4k per month mismatched), it could work, but that is a huge assumption. There would be extra tokens, but only as long as not everyone withdraws from Layer. + +This was not a good option since it creates a non-liquid position and makes it seem like it's printing unbacked tokens on Layer, which would not be acceptable. It also would be handing extra tokens to the team since we would likely be the initial validator set (the team will run the chain without rewards to kick start it). It could also lead to race conditions on the bridge to get rewards faster than other reporters on Layer. By not going with this method, we allow for mainnet testing of Layer in an opt-in fashion and allow time for reporters to switch over. ## Issues / Notes on Implementation + diff --git a/adr/adr3001 - TellorMaster to bridge structure.md b/adr/adr3001 - TellorMaster to bridge structure.md index 158ffed5d..7585fdb83 100644 --- a/adr/adr3001 - TellorMaster to bridge structure.md +++ b/adr/adr3001 - TellorMaster to bridge structure.md @@ -15,30 +15,30 @@ TellorMaster (oracle mints) => Token Bridge => OracleLightClient(proxy) => Oracl
TellorMaster (team mints) => VotingContract => Team's Safe +The tellor master contract is the tellor token contract on mainnet Ethereum. It is non-upgradeable, however the addresses where new tokens to both the team and the oracle contract are minted can be changed via the oracle itself. The current plan is to push the oracle time based rewards to the bridge contract and allow distribution to be handled by Layer. -The tellor master contract is the tellor token contract on mainnet Ethereum. It is non-upgradeable, however the addresses where new tokens to both the team and the oracle contract are minted can be changed via the oracle itself. The current plan is to push the oracle time based rewards to the bridge contract and allow distribution to be handled by Layer. +Voting Contract - we will deploy a separate contract that will be a pass through for team minting. The reason we need this is to ensure that we can still vote in governance disputes on Ethereum mainnet. -Voting Contract - we will deploy a separate contract that will be a pass through for team minting. The reason we need this is to ensure that we can still vote in governance disputes on Ethereum mainnet. +Token Bridge Contract - the token bridge contract will be non-upgradeable. This is a one-time gotta get it right scenario (or we'll have to hard fork). Tokens will be sent to the bridge and Layer will read token balances and mint them on Layer for reporting/validation purposes. Parties can unlock tokens from the bridge, but that will be done through the standard tellor light client bridge, that the bridge will read. The bridge contract will also pass through reports to the current oracle contract on mainnet (for all current users (Liquity)). The only difference is that reports to the "oracle contract" address will be disabled, thus locking the minting address from ever changing again. -Token Bridge Contract - the token bridge contract will be non-upgradeable. This is a one-time gotta get it right scenario (or we'll have to hard fork). Tokens will be sent to the bridge and layer will read token balances and mint them on layer for reporting/validation purposes. Parties can unlock tokens from the bridge, but that will be done through the standard tellor light client bridge, that the bridge will read. The bridge contract will also pass through reports to the current oracle contract on mainnet (for all current users (Liquity)). The only difference is that reports to the "oracle contract" address will be disabled, thus locking the minting address from ever changing again. +OracleLightClient - all light clients on each chain will be proxies. The reason for this is that they are upgradeable through Layer itself (governance votes can update in the case of a breaking hard fork). Additionally, we have mechanisms in place to fork the implementation contract in the case of a hard fork (e.g. push it to a chain multisig, social Layer, or worst-case voting contract to determine validity of the chain). This is so that even if the Layer breaks, we can still fork users to the better version (a huge benefit of being an L1). -OracleLightClient - all light clients on each chain will be proxies. The reason for this is that they are upgradeable through layer itself (governance votes can update in the case of a breaking hard fork). Additionally, we have mechanisms in place to fork the implementation contract in the case of a hard fork (e.g. push it to a chain multisig, social layer, or worst case voting contract to determine validity of the chain). This is so that even if the layer breaks, we can still fork users to the better version (a huge benefit of being an L1). - -OracleLightClient (implementaton) - This will actually house the logic for parsing the validator set and oracle data from layer. This will not be upgradeable. New contracts can be deployed with different logic (e.g. drop an attacker from the validator set) and forks will be handled at the layer governance or hard fork fallback (on Eth/the user chain) levels. +OracleLightClient (implementaton) - This will actually house the logic for parsing the validator set and oracle data from Layer. This will not be upgradeable. New contracts can be deployed with different logic (e.g. drop an attacker from the validator set) and forks will be handled at the Layer governance or hard fork fallback (on Eth/the user chain) levels. ## Alternative Approaches ### No proxy contract -One option was to not have a proxy for the oracle. This would work and was initially the plan, but maintaining the ability for Tellor to fork is important for security and it's important that users can still work with tellor in this case even if the network they are on does not have a social layer to choose forks (ie Eth). +One option was to not have a proxy for the oracle. This would work and was initially the plan, but maintaining the ability for Tellor to fork is important for security and it's important that users can still work with tellor in this case even if the network they are on does not have a social Layer to choose forks (i.e. Eth). -### upgradeability in bridge contract +### Upgradeability in bridge contract -We had thought to have upgradeability in the bridge contract in case we'd want to change this for some reason. We do plan on keeping the token bridge contract very minimal and passing most logic over to just reading the oracle contract (which is upgradeable). Additionally for sake of decentralization, the upgradeability of the bridge contract (whcih will likely hold a large amount of TRB) is a huge security risk. +We had thought to have upgradeability in the bridge contract in case we'd want to change this for some reason. We do plan on keeping the token bridge contract very minimal and passing most logic over to just reading the oracle contract (which is upgradeable). Additionally for sake of decentralization, the upgradeability of the bridge contract (which will likely hold a large amount of TRB) is a huge security risk. ### Keep ability to change minting destination -For the minting of tellor tokens, we are passing all new time based rewards mints over to the bridge so that layer can handle distribution. Like the upgradeability of the bridge, if we'd want to upgrade where the distributions went, we could keep it from reports either from Layer or from the current mainnet oracle. Both options pose different security risks though. For the current oracle, it is likely to be deprecated should users move off of it in time. Additionally the layer model is still new and switching right at the beginning could lead to security risks in the token contract itself (the one piece that needs a major hardfork to change). +For the minting of tellor tokens, we are passing all new time based rewards mints over to the bridge so that Layer can handle distribution. Like the upgradeability of the bridge, if we'd want to upgrade where the distributions went, we could keep it from reports either from Layer or from the current mainnet oracle. Both options pose different security risks though. For the current oracle, it is likely to be deprecated should users move off of it in time. Additionally, the Layer model is still new and switching right at the beginning could lead to security risks in the token contract itself (the one piece that needs a major hardfork to change). ## Issues / Notes on Implementation + diff --git a/adr/graphics/adr0001.png b/adr/graphics/adr0001.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb75890a922f31c438de07f1969a9757b1e650e GIT binary patch literal 53110 zcmdpeRa9Kd7A?{^ghqmf(73z1YjA=F*T&r~xCCt^xI=;m3l2eoy9Rd&uEF6o=bm%! zec$iz!C=&;*tNTMtyNWP&bf+66(t!AR3cOu7#IvWSxGe*7&tQ+7+7s&L}<;U*xEI; zfOS!m5r?T9ee)aoONhC)oQ0wy3_bK383q9s8wUR67U(w&ED;RCU)L}&^037JUaP^< z{(TP|3{1Ec4B+p3bfM+Tmn`%L+WPMjJ{R`CPt1k;=WaN&T=;*kVYOeHx&JcQgcc}{ zvN|p>Flab0Kd>+H>d#E{SuRr@%VT4Mcst1&TkxVjlV5d( zC&MwR<>E3;!bzdxerd#sqSOuw0bp-r+s-a`+-8l;FA1(J`nBkcp)ctPTxYsGUmpuR z3vgIc7aK?^puI0Ll0Dv{(-DRBLZWy z@;|k(6lQ;35x|9gBr`((s~8`EwmjHEG8!TNpIW1k;g$dUQwgChvmRi|z5cf^(ed*F ze?RB1LX?KWD5N}*^dpzUf1duIKVq@_ApP%4?3n?gYt#tn($-jdEeQItZ7OVK|0OpT$p8p*Yct+Pcx@J%kG?N%?G?nO;3x~K(jIK5S!O55korxZaJLj!i9Fwqg+A43a(|C) za@ie}!q?wQcTm(9{G?NBQUCq^d|F+303K6teE;A`{2x2!3XnrPehBT&=iO`{CHwZ< z9q9*p1_lx_{+(3Qt$2x73CRpvg9biFRLUZcbqt$hq&|n$=ZQHFlBlStW^?);$@%%@ zC8ed1fkc`i=({ki`dw!Uyt0aN%|v}Z4HxN8)-w1#_$J`ttWxAn4x4G%crV{>CPj|l zAHr~MV8o^v5(y=#?`dGB*G`)Aq#VtF;q#r=?c+(n$>2z~(Be#Wr<0%X zHa0fJBaShda?IcKba!C>^l)1}{`*_^tHknhM!uuEDYNTkkI%JZ!XIJ< zjvIR~!ryv-6$sc$kl`O0%;a-1yV{>o)6}E}f7#gBFdGxPPNK>2Rg;b(dj03dYd34R z&dQs@1`xtyEpT&n8%-+ z$?A;WCt_j`_26^~<@g*oLDJIbY-Y<7qM}f5H%Xsq zIV?w$KC!g_y7GY<48>_|@w3lgI5&hJ#tl(f35dhYfrP1VY}Ay~gMm}Cb#9l|^(0*G?yhNs}n07s$A_gSb zYV&=5ytXIZU^DswGw*+YgiwJi3C|vu%O|0Z_nQ}h42QISwoUg*&+lr+d4y|D*4epc z5%Y2PVoU^Iwt&VobJeMjB#V25)CX#@H)3LFt~cx90!(ixZ95+SxY%X;o)5%2PRc}( z0$v*v=ilW#Kgj%9_Avb7<+B;Xv&8p|dF3>gYDZ=kUu8rBRN#z8)|KTncz(L>&~HoC z?!<%;$OXAMRmC&Q{@R-;An}qaLvDYDx+?KVG?0@s-RGpOp)94n;4I1&I#6JwnkZ3G zHjNyoUP5-e1m`n0vy0&$vpxST&wHYvlJ{U1o6qEcSBC83Rvb%gwwKt1 zF$P8o-u5MlXL>*-^H{~gn|m@f^rw|W8NU53ZS}s1`1No+#uNAS z+wgYZv!D3HN$ETe1_ieXIN5vE7-tfR!ODvW_xG7K{`@w}01`l~zn2TW&B7XqXprAoqf#nsC)V8MrK=@(`+jMeuiN*3H|=IlxGd>@ zR-yd)pdXC-&C^!SpjUYo@A@bENCOTn*i5>*4)N$y+s2>EDz?bAG!YVg|dB*%VYr$EX zG-~s*eQehzmEF@rewc4~$F0VLwkJ%){;;-rcV?nZbdsWBU?&2DYWXL`#ScNY#0*we zRxw+RB|fiGF6_?r!Z3(;I6uDefsQ6Zj8TXGqi+If1smq`Z{+}pO;wwwf!~#e%ygUd zkxb~(zgzftC~%Kc9PzB{0gqC9Sgl8FB@tFZqs{vYvih*YWB&^p@a^cMJ{#C-(X>G!hnlFAuwN#P0iiZyJmfWw@v)0c*_0mrzH= zJvXrXslbO;&uR`5@qI_pYjZ!Zj+1+=W=z{1aPg|Hf1LB!L7ov30_G8u;x33c;zc z5=dLJeNC_Xad#?bk!#^6q`8U+(Pq&OQ?)-VW>T8)u9*eeG7X7D?vwK@_i zpptUIuP{39iH;P>jr=F_87BemRfm)de01>R{GTuf2EadJW_9}SCihot!wGr`-vIy2 zqL=uF|NqbMt%n$(PaJr6=Uq~QUovICFTd~FVccfFN@Ch#Fvj)f(}ZdDopSVjl`-)S zNkQL|ZX8c0e&j9z&Hsedxl=%B_}DwHMaw{6Re|3yYu8a}_95=`++5SewtRVMlBmXk z6SCG7|AxlF+~5z8aRiOBtgB4Trq%}SH8g`CXQ_98k%O{U&X=gltVFC$UNa=nSC%AV&(^y&>$8M5Gfx)bLh55}#lF2MQHA7ZN}8A)xT$vG6x=c3Er&_| z+~e*e{!TnQPTqmpWW96@YV<-|%J^n~WPsX0vKf1Sapi__?~R6CuvjiN=XT|-M_Aak zg-p%M8&pheg(@9ZS-W9ErJiOGRypOGV|qvfm-4UQeM6!6CWph`NNdJms3Qsc&Mj+e zpTDYDGb+hd?EAO@6|GlPoH|@Spv>TNbE9|Uj2mO2JpT7!fDMj+4v_VY_hx)I2R``ME`ixmqH#24H+o`? z&dIhFGv;m@73CUT$%f0KjjrXN0sWeKSroc#@l4AeAwv~D`voWb*P(w#u(+wf^#>6j z%I!Zb#$oxHS-*WPGkiy{N}P*Xp2O^iZCVs3`~xuc%`Ge3N{H=0^9cMJPADwiSa(>p zt6o~>M5DQU++0y3SdL9KQX><);?8r%>^FAV;-N&V!r5f$b+H6X(6>A%i2}_J1&htG z6_IZD8qHO$3U{=s#O0XYDkiO$bMWx4#5p|w*EYt4LKu6_KyPF2Wgf#gb0tq@m`af7 z8YQmRYTXRdZ|)H|H!my`XpJDAlBu(<=ZfdziriPLGOMW3_4}3Nc&%l^t?)VT&KX@U z%0<|Qcq&ET<{yAnhXkje9iMlrTT*D_Bo)J`0{1|99s31;|`)5p54uxHfaB+Ogljk<~ex>MY=|3S!E)8gW z8<}vOEQR(qU90j_<;C=2YHF?-L*6LUS?tFvz~0eYet1}Ff@xZ|vI;flV#*4&26eaZ zyI?8{Q}vDH!k-y<6&!D)>#bfo`-3`G^a~C``)R4bbn?Ic>mq+7bJdXv+1hqe zX8PyMHEI+Fv^V(SQsSqL{5j!fv*VWb?O(wvkDJhM7OF)Ok?~T~^JT=RtWl$JdbDNz zixqXFM8mPzH+)AJOCT)o%8FDPa3Isq@9}pp>f$j(5C;}5(Umqy5Dg$M@Nn6m*G)v~$<-GlCi zfK*%+ExcU|hvUpN%9h_IiLlKl7j@ZxZ5ZPd$hMqh!4ZC{@2S*L8T7QH8tZhqx=d#@5;46Y?RY@|| zN~_~am9Huhz-4g40rD%DCs1JcQPvv$OKQ@3c{u)_rmO&QEHE2chN>Q&!&gm4VF|w; zwP95eT$M#0Ko^-xK@(RQDvsGu5`eEGTJ8UrkBpZfOL9FPyq<|BB(%xdt=pSo**bIaC&PKQVEBjk#5V0}pZI*~gxMvg z&3VR+{jp?sp=kY~Xo%8dV#B>;k=~9duyESDM6n_TNi#(j!ov^saT+ zNm}}iKz*E5@4}{?PK#0ADE zpWBhp8s}M$^WO!}3Flqn^ZVa|%{Q>Z8=2euF6`J{Ga}C)1=P1r52{ke-umm|Dc!%v zo|-bNLJMGqr?EXAbn>6Iaj=#RL%lt&@Yo6wuuqsiv`xEPqkwQY1lqa`W7XU~-OJkA zz87p0TKi?TACjaoJv~@RW?1Msl#VZl*w*tH3I#!p=y> zoTr^SvCGbI0!5slTCsA@%KK{SF+V8uuY9cPcv?t)fxBB(YmMVvEnWmWCE z%pDKsv^F&+&^TjU6PZ)4KSg6!zFvB{p-#pQ;X3X>?qpGh`N=Hmjo(zgTBCFQlHcjX z`E+Q9x-*w%4HBkvkJV+Rz)&luh+{uhtbL*M(}(%IlMLQ0*p3eWC7u!DzC)asm*ZE!|1<@!KB zWR!g6D~4$+7jiqDHhTw#SUMOzmYifZ&psP?%Vqoh(UDV(DOW5jFHd@5NuV6kyr=#L zhfKFwotkC$#d^2;u0BI2C#UxS`t;rxnn~8ms-*DC7oHCf9v$~tDl0f^K|yeQYaija zt~;LF7`4BNrZDT%;~V-`Q+U4DeE)tc8=(jMGwSuL6Vq6}-en1w7_s!mY|9y4op#?Q zn;b4U)xuGJlX6MAPXCa0o&uS;lnnc3x%T_x7FwIyzeW@fnbWF9PcP57k87_??w$;0 zA}Z!nVnv+r5)*^PD5T?9P$yPp%2Y+(<${VzpzKV=y2_SLCu6aZlz5f($Sp8kVD({$ zsph`PQr_93Sen-ERF$Yo@-Q;zQT(moZ&w{IpV+&yEUM(67z@ESg_I>Fr73yxJCoj) zJhN8BM{%N=JDyop_OSOucXDrZbab3gJCV>Rqs2V>3a8e{wHP#)w`5_moXuldF!Y!N#BbRp7S0YW!@T>LAo#fP-y>D zkP)=k24$t#owsCfpD$ZUwIA?bziIUfsnQg44ae>V?h-nQGWR}wYKGzXxr z&BC+lTWdXPy7fW?_}(8i#P*0PfMU>h8dm*V-Z=M@vAgZRFR7?VMq_DJ;a;@m2<(42 zFnq?27<(mf2m?~!qZXgWVJV;a)J6{Od%BzJ;6H*gpF&jN(H9^)dZyfX zzqJ6xoO%$qNu|8zw|dS4R59E0jmOOgOHGcc_A0F35)%^EBRun)1x4vaZntpwHXS(nm_Fck$Z+XCF(>CF79qV}5emS- zrhxS6_}8<0_*#in3ynM(Ms5t2ek@~8JJ@t1LmnPEE#OGXk`sK3pORdBc%?h2gzeq# z`}lv-l6H2Q9@AJls43i+R_u_T)1J0!YgVN?Qi3aQL^fqiSM2cl zj`Hr!#?VHSqn{q98TlpeqKU|SvIAl%EenU{_!p-NH-Qn66`vssqym39BJ#P!)x+eD zmOWOJUpU(zf$-Zmn{l5RDjU13q+j^Sc_^q4fyD_5ey^b+XJC*`{PB9l$Dz{~sdFCc zE>uZ{tf!{l65Z!_2USB*_NYj@zKo8J?i^}D-6tp;))Gjt5sFxxpWjuVkeIkRNaA-n zF}ft<)sNsO0ipr&DOklfwH!AO&GcPCr&AS$RWKq3*uz~NH)bE+H&ql}HjJGee7IWhoTpo)7i1S8OoWIFZmQB)X zwp=F`=HA(%^(^dw#*A>vB0gHGS$XvtN{BaG@4;&ay}pjyp~o(6Umm}LdJqW8_U0Tg zEPAZ^HMFqEQjNuXgjv25iR0g=m5B|0MD}y=OnITZPTts^MT6{^*doLJO#FfFTDe|; z^uiDI)|E-R^<}Ab#BhoJ-VpS8Z-yrKu0Q8}SU9d>+f>dQ%MJWU&vtPly2T~kkB@y> z^c3z327gp0T`vmTw$j;fic0GgUbSv)Ts=<0;>_Pht8c{|*h7dLR`uI`HnVy!{ASRr zU3=%w_h;sYI6B(3D_3muDSW;N`R25G{?>5ro^9!8(9&mUd44$TwXrRD#QIvMo{v*Z z_z+D%Kn4WTBi`gZY|%iVWO-HFpY%*9aj0b4z1HG+W^xN%BWPX(hBA~RB4O1e({IZr zpO`XJDwK1C&!NPqW$^5HHdRR&E_s+VI(v8+23*kW{^gXiM-Q4EL67-lpCEs|XLGT&YiZP3@1+CB!+M+A!Nq z{d#XGboL;w_D`|ka6?u5UFiizaH`KxmOau7~HPc@r(CB{t_Z@?RN<8xti>@@vV^;i$wcD&Xc@HNgI z^Z|^(b|n7e6eU9>pj{!8cfzU#lnlhI^NbgjMcP82j7*7sgz~*Q;~`>tZ0m}tta;UR zoS#w|+2+(}dMuzKkJ~QA@~-gx;gqKkajHU9(+-iPe2+pz(`%G)xMA3O1<9}uf=muPsCgCA_L!^2Nh#D_Xwx6_rE2g7`6xY%fjV_Xm4Ef+Nwp67T4!; zy2W)mCwxajCs^wz9lZ%g!gM!_uCdyOgJJ7_NH2Lx2EQRQ1UG_ME{P|d7p%TC)ntY{ zitVvp=TX5^uo(KDg?8tlz#?C7QKjGad_h|RlX6gvCHixP)9qqegqoZ$X$L+atP<}_ z9H7P`Tj={v3U<069lZ!8U>86-m6;8MzNnQ}i9k@HnFY@DdPSl#`#xFkbkOCz1#=aW zBXp6<|7ht7eZY>8jF+kb0n3A*6m}Q4C^@hn7B1~$E*q~&dWh$`NZpL)hbEUBr^nN7 zOeJF1wLqjn=;kaVQ*-*IOBuaZLj|M@P5{ZJ(y-;QeL62KtHh>;6}g7al1N`uR=0zRywpONh`JJ-7uQa;$uRYT9r~4CuRr&}*&xiBR z9j<-1UrO#TLr+b+w+38{*#ToXQHBWieBiPA`Y<4Ixv*yJ z5_ReIvPZw1UWSb*kXoIlE$IWb^2`>ROH{8$k({-|h;h@pgW**Dq7L*HmtdW2P=Ubz*XbzlGx&;DzEJ1Y(nnH;_|j=)%5FR zv{CDX6tTjrf|Vfk%P!rrMl|9V zc3}FB4MR)DCRXV2a*CNV?Al|qiHOh!1L7V-HqH*npNy|i6%V_tQb?-a{tbcBNS!7h z!fKPb0ZV-fI%2I`J(>fD)7a+n{6=%V-*qJ{;)(u~6>#|mpj#Mhkoca8$|#mo3-RRrOQ@GeB0r;YjjT1=njqUoAp>Qb6lgkd@p=Zd&Zy2KtrI^; z^hU(KMNdIZ={Y!e>g1NP6}ZSok@wk2v*eyfFiB2`Dy<0hEi8nXSkWiRfLlJ{F+rf4 z<}UGTk!WpuGcZUH^_HL1b1iV(g8LWEH&(i0T?)W)7Kf#h4f9dW9B`qh&xwMCmJFKS z5h(k@q+BGM^k!D}99~?)>FBG{AlM|O{;u=)xfT@vemsB-mV_yxjZ7AQ1ktG&J`zU$ zJeSjK-&$vw1=f`QY*3c;+R#G?EnFFXb0{Ys5&+kO7NO5*l-o>I?|=(;#?N1#rW?scXo+Y(kLm;)hWf=o^aImr^m{bOi;iUCdijC zfN?l2E5uI=QM@H8EA^W2t;}*P9=e;c%|dYQ*n~OnrFvq>ojAobC)8Lyv6Z7(E*Yv? zC*2~As-QUAeKU98MIWkXcTthcz)QB$A?j{;Vr?Zm5`x3~Ymo=YqMlx4F}QHZUBr)C zWV!&T3M_{&I!iJhAe(RrjeJ|iaV}#hSCP|+IhlG0e4vW4zCb(%c2NOrP&C%p z%~vv#5hejp;L`{y+DfFv{i$P_wS6a%g}$@IA~!8psHndLPs9*Zp+Wd4BzB+EbP?C|QR?b%75W$A46+Z8$s9af-bBr#w+eivEIZ%Id zdxxAo^oafOGv)8~5dV*KSAiS}R|C0g7pnPbDB&!yh7wg5SBbh&(@KQ~-n&^Idem^T z?0qOPV%8nn+Bd*vid*!;Jq{lLPSXb%T%YV#*#o;mpzv?URW!yD&*Qgi`Z*| zb^SF$by6|N0DRO(4&6;C_-9~#g1@;1OzQ-h&FRtAhc>gYfYg$VS!+|t7K$8{3 z{S}c3i8RlX#61&aZ^Bwe^>d%&ZL`bK*5qQh?es&xSbXg+3GNIqj#>z%=OE5qsmqbKi0a~i5OuT|)lfsc2WJCrLy<5SUj6Cba zTJU&c?rKwS_n%!~peaB&!T((b3I+hF?Yo<7H39Ey#aR5|G<0Sl8$c1+@F_J#JMkDUqVWQU;N^>0ZrlWG=fj2<*@xq+A(<2`-BaMNQ659w68Ikd0 z(ZVov!i_q3aK(811heWLne>)o&k3@#s4f*8#QR*@4~WJ29{nRA3IV^46}=g({sWou zMP&cH(0}hOrb4hb@rq4*(qTbz2(J3$UaqP{aBv)M@Wsv9=Jvd0j@z|#Ddk<~4^+Cd zl8^@>HKd-Tdl?Yefa0~{q8`qx53xRCi{W@-yOAlt{NSqBTUZqZ_;;OtqRbN(2_4hd zq3j8#7#>+wIEB^EJmP-U&9Gh5$xD^Z+uC>GoDD`U?1u6 z{%U3aaW>Q5#`ngBndiFfoa#VsPV+6#(1<*et>uqzf)I$sGBND3h$(h(}QX(k2=cjW+H5@m+Dxwxk;xHIw+PHXYx8bU?C=JD!$|3`2oKmyo zbjnXt)=TJ{vEryEuF!-WPVPRf@7Jp2ogU*_;jpn{fv}iUZ-QS8y9y#G#5sr8GYxHq zZ941vv4H~W84&4uzx7v2MV&Ac4Ps@x>&!v*OY%e}yGC!4>@SPlL9h7s%wD ztgHO^6iglGL;Vi+YEny<{FbV7nC2H^hDu;_4uqzO1G<=i~hBUg0$Q%}83clcs z@wZt4Pq*z69};(vnXq&T6z0JpLD(p(j&ol5IIZnmi=7?}H^N*R_&Rv;MqZ9#5of-h znnrlTWpblhD+t3?z5sqk#J=2Dgc6`?15YH@yaZ6Tuqd`fVr+OfPx^r`ah{DrHyD>kI%q7f z#M?8+OH+_k7?m{uae#{y1&rv0G*KwF^57z66TwObZwK1hHd>`m3Q zTaiJ)k z*fV2O8gxxC&C4n)8c&ewv=Nv~*Hsvdf*FIoKnrzcRTVJBFQvvuv0y|#b#i!o zN)$yMl~b_{9*1lSxz0^66RQ-v=*9(nb*?|BVm$kuH&j(PU%{9>X`k?)Qa<-@2U6wHlYB8!Faipzq!fIyab z$A@)-%ORWsn;Ss3b789vA43{P7+q=43Q2TkJRxg6Fj!FeU6>b zaKK&5IA-Jb-3SNub`l`mK)mf5^tQ%=Kc>@e)QXQ|?5>0=8GFN7yr+~@Uk4DLYdx=| zrnrig9!GfQd$2?cbhXMlb!?`$v@4v>tWBhv+NSrA}V++k;c~mjhr0MyDf{+)42cJ*S`l`=Q!ExADA{G53DN*fPG7TWH zf+U!oAS5`Q$x!4vy0;%kq0TM@@3eM)ykE?^3cmvu=fF>Dbb+nh2cM{sA@)*l3 zvIxVB>v2)#oxE?Xsj$mw{wi|$h&&fYvRH?;hqt1e8g(jSszZlixEC@jtFc=9p33Tx z9$W7_Oi4_Fr<<7U$5cAGPch+zzw`S{nnRc!r~Ky^?vBX}_zg;XaVtu!eOv=WO13}b zc(lEzz11y+*WJ@Dur(>}Tw9UB585<_PRcZ+(eo>lpxH!B{Q(cO_?y0}X5~ifyNQ``_|U28v=W z)kHPL`^SU3<3V|6DA){~Krn~+i0Z@&l7()+q6>h2;m%vPDduOxmv!T7Q)E}Jzxrc6 z?%GP7h4U`({ZN$K0%v8MR*Y^9gfrzmm+@7pe7qTz16y+y&TpbF$6UGKZ_vaMB0RYH zN<*1tGzJ1HxOgUoPi}X%OGI5o@7j(FZcArF+4IK=Z-OckK4oH6Gq@4>0C>!8tU;<)gTS*MWa83 zzp&{X7-Qme^C28{Hj(k%RJJ;9XAm{gGD#(!G;DzEhfM3q4Y$Cr#@JOTnTwj=Q_+^pp3=mB8~t-; z?JH;7{ZG;=SO&mNC_alDmfFy2p*X#Ytb^waTgYU9@*xOM$>=DBAj>wFZ91uuN^E6+ zGs%-P9;+Xvc$~K)gNs^SW}%MUQb`@VYe88&Vq(*_<C4D&fAJrz>kw*`yGPnW(VePo)p5_PUIj&WBD4iWF` z@tEUOvC9vvskCO~>q@UO7iax=)BjCrGD4>9V+H0*h~9>~pw10=)0eJ9iYF!VV&i|o ze+H{^W0&>0tt3(I^Bc^aB~5Xe^X)#Fw#6Qn7g)f$*W1^g`GzQ2tr9mWZ%TJd>9z^T z!A$ep$u=eHVkE1GWx7`B#%Wb7di2fs?v35MjWk~z5J!$<3M`QWoSmKZwwyNX)*XHx ziWOfs)C1209kE0FkWnYD)4ci_dy7NrOP~Vj z7-!h%dFuBvg=wV|(}X3@!|c5>W6IQ#@0pjJo}Q3vh9y7e0;}Slu#p>zCKo)ua1q4A z26NiT?35e}8kkTjqPkia6^ksn=1^rDMf zU}C?Eq&?iSTp}O?GoEGoDv4U~V!!81if8+fAXdyrcIU-vr{=O9y!*kK$?uf~&FK{@ zD87a5JpqBNU(fI;m{Lz@!U)EgI*jOSIv-11JzglV|IS}6ILC_6m)mF)K0{jF!7_=g z5V1*GPVX)K`YAfo)WYMM3yKL|IVQQp9&XJW*5H&>zxZm|F$QhRZ`rbofK4hed!h=m z%CKbeERg-_N!AOG9&j9b_&qGXe(Qw(m;F1oHC^YS^K9(Z7?_b=Fg?T5A5c0ViCUAy z*iIo`26}qtf1O%5=VQTjv4g83{17M}1^a%DF>P3Kb&mPEwEs1~bPkgMD}To5)! z_Bc)<$3|ajJRY(bC!y;ej+jt4-)eYEN|kNU0;Kya<%7MG>YbmF?j1brxnwU_;WMLd zUH?_$d^)C$F9)Z!k?0Z!L~@FTyxixUu;i_wArSsfLVqjjk{8P`DoGlhSCIHSU-eO3JQ%gkt1vKJCo2l#0725KGwy!61@wRLX21N6(%__db_(A)3!#Ubx=ut7DGT z%_M%1<(!^NjL%6hA#2zA0h^IxycvsN@BycwV&U~G3{o}(GBaUMmTMR+>HyjvA&A9f zgRza99Xs%ahCLuVg^JW@6URb?1>q0B5(?8yB|q=>kvhZDtsmf$-ExX#f(`%7w1%f* z1z82KUSpk+oJ;q3u=s|$pmW5<(JPV4=EeZQ$#0S*qr&4utqVax=meCkmZ#LQ1aO48 zBIvm2{00oWN|pCCll8)r{D8Q?C_h=sVEUa8h}3s)IFlh-iG-QxVd(LIyimPdyRCQG z_cSG(@bA>GZk`a>a{VHT`yydK!G`a4eMAT(FUE)GmAh?Od)qC$K2Sn0`L&-))-?ALEz- zHK>FI0YI7l^aM5}#oFi8uyUP#PJ1voo@mdH+n`^nKO!5iaB zXG#!GAzCBl)dbnGB02@~Hqyef4X=%GM7lKzP^P4JPH^9Zbr2QyU2E6O@3>H5n}AHN z9#U+;`ZgiijjoBX)cCgv>V-0JHf#V36gv}Gc)>9vAt>@K@IHG)&*C1D^#@E`&Tr_8TS_`~u z5rQKNrVRBLbYdp*od9zrAj$*`Pb;>0fZsogKO!IHlU$!DcdOnv&;e$joq03{UzAYM zaPl88pS(~x&_v3=KC`qOvRir^8%f`H3d6rP>|w(4KV>VDWI#tuHFkUmPZbLrZ$=0W zd~HaG46loc{gDD32co@Eg`U3(A(97>>l2rYG{(4Nl1Jg8+V0^5Nh3UyaK65oUUz`! z6O(}RFVxN_<#j7)i+Hd6tpfa=P;vssIS2fX6{SE<^t436CeVwEC~{~1hMT~%iIlU% z=q-K1afY)&+2DnE!JO{8{^?G+tmoZRSU2V5ec&x-m%OuEHbt>&wi|CGV(pq+=k9C4 zl}Wn=DUQV?&MWkwxm%Ca4lhnsAoU%}dXTGnTn=ydq0KNPHIYvkn(MPpa6(#aF46?R zMzDVfd&!II+|f%bJ}tt0Xj4P%io4k*IBt``899lkDY~4$AGaI-cElM84LYdTs}sXS zcR?_D#_>NzqDaLN-7J{B49R>sPOCe$5M^vxd}9zhWF@ZY!aE2pzUFFDdn$tUQ*qgd z+14iCiZrK=v^p}SqelQm2Eiw+U&w&ch)n)HO>e*W?_W$#*C(MI;on22y}K?yc0%px z=9p6*Up)JQ!#M2zUwmv69hj%vGBh5P3$IEgf(F_m93yU z%ZNA$tzpcG1qd_jEUWG*-SsleVL0j>#WKUeKxM~s>_aUeN5D#z5MJkb9yF$z{k*H~ zxcC{R@~pmlIAWGpyMv{BRZe~E$7fR^sEXPd-7f>*9tsvAGiQXJ$II~fa?5IB0!u0* z=o5i`b#Zuxx#`VmIsEJLF;B1%9f!U>!T`DgR|P+?k%e?n2(xP6EJj_foCV^z2L4DI zkwnkVlermbCm^GQLHFuNcpnBgapx#%g7xxMYzHQ*tev3oIKP=;V{OOAl+1aMQ$Mg6cQFu z0&QtkmoCSDH41Qxe|Nf>p9%XRO=c8gTd;=a!`6eYDDjn=(biZ1{F2))iZAw~%fK}O z$#@xhHaYOS*pIP0n~a5WJgC|XJ$-`+Jv>bkTwDK=9Q~K7>B|-p?1ZA6L$kENzlQ-_nE)W2vOxxOFP);wGBX{iqOJFu@8s&004n6v{30Og*nqlK z`5*i9l&T-GIo6*S!rX$eYokMWe}7H_NkDMSRpcS)a*B|^=CIZ@TfvvC^!;QfmfQQ_ znww)J1hrWWDr#XRwZ3SG@oqMAaDaDE54GE{ZGB}__|?$ghX#BoRJ1iHE~19aG>y}S zC)}!!-0~X$J_5Z>QXjM(2B|O+yGgN0NS{+Ngom-`U zJ)||b_s*ZHdf>ox+4bt_!}DL+->d*`I{>nN&DTQl_FWv>ZVjYMFxXN zKjk${Tno#-*C}jFl80ESPHL9f1{Se51^(Ff`K3{mqOHN=GAO^bnW-kHTMkg{zO-Fs z(EomrOjaOQhpYjUnHzZr9Zv@I$@s@)`}50Bk3XAS?;nZWE%qRG0s z#SADurf%(9Wz>u`>V-zy<UZV>Ia-^ zzE`F5Y506^{i-6I{(-h_gOlw3he1sNc3lr|1}!kkA_Kdo=-E@U)a8O343A@!SseJ4 z87#~FMljMFclT}-s8Hrczft)x`Me|8sL^s5Zz;$h}c1R?Vm)ijr9au3(8u(=~#BFcq=N3Ph3~yrQwn{){@$>vA zk5rA;vn`*QBWaA!ET6BD-wD4%*~nq2m%6a#g<-HeqoUlXMZm*j+%dgr847>m*<4JY z@g~)(|7znZA@P6&;=p*VvYqd3M4IO1wnE7q3(kKJQWXG=dbc>KjJ5pRL=6~O;!k8s zG|L0-=bO-_U9};`Pk~(MB}RGWHq^S6b4Yymogjj?5e(tYb!)YR_AMOGa&Nh{ z5#RbW`q0@74HfyWW0&Z)6?3$hK~q=$va_u?a{2U+iaEa)?WZ<+nRYFi$8Gpc&SA+# zo1cP(<`?+#KOyGiow=1glv71(iN8lj`aj#9a9ua~ik1&g+&?wwmQ+5vCzPuQa&uYX zh-+42);lL-6PVX4q#e2ZFbk*9EpCpA!g%w4X!^>4xEW~KQYcoO7K%HR;_mM5?y$JK zv!%E@6nD3>xEE(}cPZ{J3yVFzd++<7{77kGL{-JNj0V`k7+!1PN}ZVHDjKc z$rZ(<8%Qu=?FYFV%p6n+DCxy*Mn?d5KqGAV3?kY!2zuYnZe^8jtIU;`jx$WIg2YO2 z{8rh8f}i!yknHupzzLavy`;%e2(AGGk7GxBU_G!_z|*?F*|d)J7K8TTLCs{)%(kec zNFBK^zN6&W#X1>!Z+%N37NXbMVP@1{0<}E&zYgs~{Lz-KVs|AyYImT(FTHRdyj{hK zmzW8MJo*KP;b4@A`WDVYt^rUiL?55ExVbKzKLZ%B_rfClyR%pDF>Dflz*;Sy)A_ho zx3y$?U+xFFg{5%AzP?ZO-v*>M-u>gZq^)lLA)d?9SYq0`2&C8|js2?mOKc65Vul~- z0#cg%uT`0-%aHh&;x`k77EARSdj{YwZDUB{Th}lD_TpB z_Zn4C{#X+rQkyTjopk=hR# z(Ucn4i~Y7xapW8`D0$-hcZ2ocp;%^xA%|yOj5j@5e88Yp67DjXQ{=-(jTEhl094ts z$Yf>Oo{Gg{O|YgxdLm^@!?RP4>7`srhybik4qh*lY6?WHn*S26; zc7lIrw)?XEIB1=f`LGKYp)_wiK#PPm$}1pa%9ccBh`mD%I7-Z>j_91F*UUivnX0Gp0vrFWefb6QC(;W_!) zkd4c%%ta?@We&8~@9n9Q(tOTo`87o9c~8iYEe`<%{~-9*l1F5X`q3R-U5QQxUp_JdsHNRgFH;Fo=-q>c_O+IhH64A5>D zUgDCF+P1q4{%_iHF&{b;IeU{)&HuHl#!!_6C^!2xtEXBl$SH2d&PIBlBKgI7phyL9 zS)BYH;>3j7UVqMp6MR1>8f;X3B?~ceBVBv;}t(4U)YS%p-SVGf} zv77#tv}ZYLnO+!HJo=0ldzER-+otbN^$RhWoiG%q?H2?`Z^@-Torker^{krzlaU&2 z$VPK2Pc%(p|6C!{PNAHxM{fSvm7PE|7K&Yyg1kOCqmBm~dYb@~!B{xif;poH3u8fd z6mjzN@83EoY*JNGELEkFWIe>Frij7OJ#ZKEx5{FrpblkJno^n#mAkdrlk|)B5|6)vM#&$0eA?v}{iIK188&A}4%%DU)y(&8n+t zY*p>#oE&eXeATWd-qE*HEzpfl%r=LSkcb#WF?ibl(kPytH^jT>^QS4!W(4clP4n3F z@orzt9N;4>)wk?$)(DnPoN8_c9fhVve=~gdp<5K22niX$)8b_~kKx6CFgDB+dGi&vabjc5j-k zTYej)fuMP?(Id`(uvq=NUU#f_cB4}3vrkoOWgR10T%F5b&C+yY6{BRtMR?CmsH2fdZDP(*N$$Z%Y zYn=O%v^jlk_q(lVw|Fd68jS=BF$5{`D0)0ze$7tMp=aSOWK(=u$VhS5oU<6!36z8z zN!^w0ne$d<_iaTXTu|~@^GJ^7wNh2rEgO_=n})}4QrQV>3vpPiK;OL%soV>5OdIxu z07>s6oD=JIz8?u#H@u?W(!2X``N%J5h~>$VGHcP`ud_L}j*;L~e5K768=MMeQA|Bv zipGf+K6eMq2ZocK44#K(hx#9Y3g2y~i4V#jhLI#U9alTbR1MA6L`uZ=u%rHtV8lx(M_BjC?m5Swo{EFG< zbf@0;F=pctCdOEG-w=w&Xn@oOxozsfNObuo*psW98cz>3p$oyj_;={gAF7M=6pr_z zIS=_c8%?Y8TS#5Ojy9W1m|KhNj;QbS@THe9F<+b>(ea;tXCg?Kh|NZBv`BQw^SQPC zBUxd4imb~4dUcvFP@Am#5GDik-r8ke=F=q2yn4FQIU+W{)sr|Ax;33#EDZ5SOiH5* z-p6bVwgO9=bDWPCwW-V!EW9}vG0GFK1)l-_b?zkSC+NYOk!mM)#ge#;M{wOgF9mE~ zt^5tDPy}t!A$G^MZoLvZjg(*1W$F&?B=6k68|jcr)ThdY@NQDzVZ+OHcXD~|xBSRP zYP}Z9mCj(DDvaF}3$-sJrOn5`(5?WKc3z2tW~u8dNt-g#Wo_5^~o^H)%W2lzKvjl8XXm! z$!MWOP2I^8=}bJe9rIq5GC|PFbzUf;hSgm7=lxGc9Cj;+yOYa*-3e&KgY}aWf@@*f zt@0Hk%A9V59>fu=1D(1W`x#YN4UV`?$P*E&AnuWsHE9j1GlnnP#fnw6+dP$k9{=Mh z@40*YB#Y2f;O+!yzQ~!#Mb1&*vp#ym9~ZBA(vWDzP>&-q&*ItuvZ>j$?%vS>okIYf z_MiiX(|r$vlP285?JJ+^eg5MC_&<)7biDYw|09|6wiq#c5wz;NUO*EEf-YmvW!E~c6K`Y zUMc+I?53l{USk6E(sQRq28=p!{IuLxg*-RE;ui6#tmZ#`dR6Y{xTAj=>XS_tboX!= z)?RsFVcoBYGO+mBJK3Eq(fmfSeV0!&HG#>_DMkaw9vJ|W%%DwAm+O;14T#|N2x5&1 z;p&Xx<`A=R3}6&`+1p|@w%SC4HQfj!kxMPvPIQnQ<`<@gHhMfSBaG-x z`qM|{Jcx&8b+rqb+x}M*CWy(j5v{1KCDV}68Q^o^Dqb@Ic5Yq*;y$-a$Tp?>snvY4 zLQST6YFbr9v$J8EVQ0tGjaw!I} zE)uouR;IRA9-Z%<|0IF`kDXy#ONj_Aqj+y(v$mK^J=^F9-zk5W7+71)pWZNu;;sEe z5Ij#B_A(Tc@WS}o==V7GIdP-5*3Nr4@O!z$2v`U67pT24|Rah>$Gv zqB}10isvb&xwxQAdVx`!(v0SUw$LMePCbdh{rsnyN0M)?ujDDTiKGHO{YDE}=1L2i&!kCxU~?s|^5ze<+f zT00Ai!whvFEJ8!f0PYKGbHd|67u=^Fj(J{xj9DnFfxz{Le9=+Wq46Bop~iJ&(ck{q zywj;w-0Ni<$PCv4 zX-Ia$b8xeZ_`n<^Ua;c`z z`4PyUarb=Um~ve_N`b?mc5~IcdLHA|RgUeR!eI~^Jv~{<_+0&k-iXXM%QMyQ?Y^CL zuc=$EL-F2gXC-sZUf9E^6Y3)~8&4mX?V4W&b%>SczgG6X3Dw(;qRH_vPnCaD&4CU` zsFoT9=>(~NUX1;f?saGZTkPi@z}IA|@s9X~Ey*r#w>emqD$Lz!;QZ~+bFiUz3AYj0 z?9{ue3Um*3p92$$Qp3nBv&jn?+myk}sfua~zLN&#YeqH6nBC9muB&9GJ&Elk>LCO4 zN5FoO3J!v!Dvj~R#q@*4+u7x`45Y1ciAuhDf@&MSzYe(4!lDo^?&WKu(mLItg7vgu$y+J0raILMHeHbC`t&Do$Z56ziU0D^cw)pY$MmvIX0zlQfSs1DNW!uc$8tm_xhYw z8obl1cb=Mf5fC5g4ycm0oTKl2+nh*uO%6r=k2s-!eS(bzP*((5+QKclYGQx@cD9U; zH?|%^5PIAXE&7eW{3Tg78&9lSMY%N7M=0WSG>O2P7*q!?n{t7^axy|#Fy<;K=>Rcx6%R3|0;@+#-vYi)VDavjmBX1^iH`<31B|( zHfxvcEcz%S(|aWYElit&LAfSFx%g-;CH+F;u=+nugA{JW#N_92)r{; zF8GZuR8H>ZUs?Yx^%X%j+Bw7@F5u&=>Yx`2dg}DpE^6lOf+sJ}d1N%}T>*Q>)0%{;?`_gm_3-Cf*1-xRT<1jy!|5!y200mS3 zb!rDR|I*xATk!l(UR8@13ha7tYT~_dWb{XH?*iM85J9A4_NCVMmnf(dX;S8npMpc} zO4XF!(>#1tT@5uy6@>(3esI8}_ww}mqpUj+$b1eqi9ntHEg2^{Dy!&y#0EA>XR_xT zYBBf!GxOh_zen8FR3Gh&a@$S{Z9Y6)OJ-;#sM3zc)!?x;=nq&B-=~qbgQjN6HCeQh zRif>K6LnnITBwfubDIXZ@w~QG)@=$1CQW)U6r^id$ivD>95;7EWq=Glm24wTv}8N* ziD4*-5pQi`sg)J=R!}a+aNC`j>L-_<(R+%I%4ZAXV@=U9YWDL@qJr{}`TWHsp2+L$5f{6VG0RzKkQUGXEeTHSt$ zk>K>*(ynfHH8(CfqKUq?Pc25@p)>A;FBKz?=$w8O!zP;qfA6{XcwEjvJL_vR<@3lP z=ofG12MvcA+C@yPX}=-3x=ZbR`sRI_qqY0b%rog~)qY{=Aa>)sy22v*1@QagSSBqV zEEL>5$z40`=&)F?l+=#K-D{1-1U)1IPsP(Oi-k#(ppO1>Tt0{sqB44ed|iI+-{CD< zP2rWhyR#Hb{8|B~(60JVxb|+pJHCZ|Be_W%1qrgKrVu(sUlcU|&I??r_gq#Hnk#LQ zu>;hREpw|p*}8$BHq|vKcR8Y0ZN5fKPRuQD(X=~vMs29}J7`#QR}}NMZj;<-4)5v3 z#xKQudm`tY8Khasik}uLxG@WgrR2s4=veO>hf0h52+j6v(-S@EoeQsUKgqs85|}UW zZ&1MCJFf70)xf>2`8RvS`Y^Yn&sdA2furlS{#lryDDwf@@RyY#@OqKr*{ERE#VDd>r}hksdEelcYMI-8uwTfGvJCcS0JrXJ)`gCck) zu5))Ab#BP{v~ywpcRFl@t2FCk#;hpDRvBaC~K(tg0{o5x6{ef>;6g*$;d(H$-&p;C8$ciXORmotHLHov~iN($)c0bi~o-s?@ zrIf?})_lEPtR-V^9gzh!4k9s_(mz9P+7jZJZ@iwLTV}mmucdN5m}Y(MCjva)7&VxD z)=YVSCT^S`9c#yusP5)frz%gluec&2V)1B?%W~`Pa8w^2wNUFs?_f8mh_%kN_pUW! ztdlQ&iJZnv5{r8l3pIS$mpy2*=;xFb<)SM0#=m;Igb#+F9%B_!_h8Ue-x&nZHp}N! zfYUg@<5r*rBdmEG>JIB9G%R^{t16F|T?G?(fF;t4&SU=#D+GO!?;v2iTE69kDUroF z%A!44S%*ocO&t4Mlj67)s#-Kb1?qa-+;3m;*7BQ=b0@I%PmIzL(+1L%(MamUlsP#4IpS{b?jl9&K2Pk>qmyaqunQ4+fll#=^TL-}n-+3lo{ znW-B2YH0>!8tXt()=aH-+M2!|qsRXtYfeey7@O|e+(zyFvQ2G!(Z$8sPmbN1H1&H{ z!5>*q;)k$2bGDf*D>kq7QIE?Z1r4OOGxw~}8Kbx1iZ4~Ae0D?DoY~{J3*fI6R0LB4 z^7^V&rDQVfid#4`l*frLgVA)Yo?jgjFV^3b9=<`cUK@>z z*$h1P90XZ5wlpt zqmT$lhsF|lYg4ZmTYk86pTA6#i=raPI5@FLVm%FZe4Y-+|fEL!vqJqId8!3KXMQzs3-@6`es zH3q)U=vi8#&3u1@g)d)r5N^6%5Q-i%JUY&qx|@5!sO5jz8GuV~=QYx_nYo;AOU6x+ zTlr@vgJ1lpM-!7=M{`!RCEhlKl5>75sAGg0SQ9CnGQscX1IE`Ws{hem>G*Z2Abfbq zrlSq*-9!K;+>jmixoC~L6_9pSIXS%}rr;f<$Nxq*NpDbS!pur3Gu~jJ;)AhW9oFo! zhmZOXs@TVFFCp5&dpIJ^D&>X5$*NCs(Bw9FEYoJ0(cZ-m> zpZTcTRWgj(I5+m?ons|i?wqA!V^f%6bKkFIEXSiwtOC&RaDc7X65WnjV@s;P5}whG z&=squMS^5$nW~djskEsiidFU1sY5;$tNzxar+TCkU7ia_uK-QPKfIXspb4a!w~XqRXh6g~RhLmkzvF_G4@5C3uyaQKTd=Z>GfN-6lMY+|C6zrHeM-4 z!V99qyqGrrIFt^*l3I%fqz(J`{C1)q zR&`{vsE=#;F8(4}WS z+#Su30_R&F4I<+?Hk^jxCuvoXFytCkOPx=TD{Tx$D9Sai8)JWpEMz^ZZNf^;Y`dXa z&xZK_@2r;-K2S@e9i;h^;PmB!rGNwk2*>l8D95h@x;1n5aYE$199oxIu1BsLU5?A{ z719>ZL>_iMza@iN=6FYVe6Q3+}O$}FmP&QwDqxL zu%yUpN~iwaaB!8Ac%dPOApS8~og+!J68Wu< zz)}bZ z@SI%8>rf02X~fSsHnSE)9{##{UyhIkOO4L~IFUN{uvOJZfksH)X#F~vY{kBh`@eX}O3X54 z;G8v&L?TM zEX?DsiK5OId;#UWcT{wWaVh0c{q{sRZ&bXxj)EAR=%dMWf<@~A)1B@4!0xmRdIAew z>f7@@7tdCNJaf}IbZ`=-X~G`xw!CVp=&)}>z`igW+CC%J)b)Q#u?FHmF3r8siXMjg zg@!JUb`S-I_B@^B#uQ=N6NY<3I0n)+?htN(g9o5*Ste5n+$qvMCH@!=rkH1Prk&CK9d(x)!MLi-XPA*hw*e|Wh-|%_Km0$;&Xvio?PYYJhllJ1Cg?zPO zXr#QmHeEeq^!39Ngq=QPk+$%CQq3FC`)+R?m@1@M#qcE!$I}x6mqv*J*(EeVctfFP=sL7MAY|HJ)U;Sc4#@K2 zQG?m$;DovHGGB%o3$?=ZeNr#ve{#}iko6quzo>@~&h&rDTmkUxfdh=q8ozBs1 zP}3)sq`B~C5`=EbbcQz@H97gOQIMk+tv5i>U%d{uZD(q9`)~A_IRSMVn6A{Ph+?LC zug=vSueq%E&~Dkme75HG^v3^Fm0a?D6e`Tp^|!N{Ds6MxLI_w}nlAh3+SqpTN76-I zGt|!S2sXKjE?xyUn_QlgSimiwS|me`QZjSS+Xl}ZsJ$v2a_3Dn8Z$AHYy+lJUXh6?SukT*Dex2y?M}x<^#Aoe9aem!^O-LRlB{e{YcR1;x~dn~g}2 zO}RXJM=Qwmh&p0IR@A1XnlG2_Lp3A1h&8$pL$PaD4?0vA{Bn_`YNUx&snnS~uOTPq zT)x|RTQXO*nWqcdZ{y9U`cCO4dJ#k*u2m)4bET1K8w}wi{|kdAIov@Ktq5P{mAkTR zpDHvWT%fgZT&3Hgul*weC{7=07-aW)S4J)j{Ar8>UFD$Qo!`U?{qgC4n>QR*V9HmH znJ=(LRiwjXM)ztpRRRC7WtQEO0mRHQ1vA@vB4W7!YR+7*#qq>9XuE2oTS#=*G3)Z} z3e9k%4k_M~d{T^40^W5cHq~1UgwmnCF0pCTko9eDv*OLAasqw{0oU&s-#J%{bj3v! zbitA0`?2I7H9-1UH`nNU%-58FbiVnvgk`)k0=x&1X!HmBii(AgyU%7eRKL0WS52j2 ztQz^21gpF+y>;GpGo{(KyP=jbdm5mjc64cgjd5>=bok?FT|KoegGDSm18hEy{vUxb zPGYe<8Vqe^UD{7|oey-KK{CNV*<1d389omn)4tji7s->5rL)n9*)|PaM1aTBo0BAZ ziOMHOgK(;(u}TzD>HTV{#(P@Uq(dU37gPkSt;+@4yuz2pgKP0<1yuDJH3~{r`E|Q?(Vhsq)wvZ%Gk3J z^E1NtuMQ$B+k_uS1{>BrI z$B`w$U3(d%6cf+Gy}W{PC<2!uBAapPzZ_nSv^vgU8=x2wmEgoAb(fMERfM@h)#TW_ zX`AHGK4~d*F1Yp*JuIE7vTUsi>lqyhm86xVhJ>0HQHk;~J~K{nK&{)E_{nr|01EpPKuA<|S| zgy&l>>R{v%N#=s1@x$X&KduD$sv9?~cxnTKP1DKYxV z#2aw+zH1^|;;$GEp=sd3@G@@TMP>2>10&8r%6uZals&O$5*Eg1-0+Bl`b_Qbj~~3b zt?&)!7*u27@-N2pO8Uhk!o}pBUQ;I-UQ9Pt_>_`af@ZR3_l#=&8AF_C|J_Od(lw|z zA46kV@!gi@vD}}?aV7D4Bk(?3l{oiq%)0Pbz@o|-6_hCxY`f>maXp|nq$pi~y-l@s z*ts}eubfOJlC+yBa9dBqJNF{ZASoOvjmJWo4_m5STUT4Vhh((Xh&uL$ z>0kUn{b6kD3K?;I--vSk|LHZ7ZyvZ(@k?xb3W<&;^4mCziB4}?3qvDV5Q}8N-fW$2KeYT zUkxqNI122GGsvyLJdyUg{F$rLrHi?w*nWPO? zWS8{5w&aB4;y$MD9<7&;1|TvceBEINyL$oUUlrGxTRR|G|V_r%FyX-=-_7qi7yJF4Ig;zy<%o_uH)i zJxy|(vm&72QCE&D>a#+-%v7rFahCJBQQWGM;<9bV!OGD3b&FrCU3Syv!s63 zTJ|vy1U$J9cAo?uK6X^cD77cGzG>;d5b(s#TbvXGld36>FXd(yn+j4+1p2)$@ z)72T(bo42;X|;}xwVmi3_Wm~0f8bYs7=;8+>-Dk#cPk+q^XE;j=hw&&kU=|VIV%X< z1*{iNM@WECHWoh}@zH5(4z|P(T&9HUS|P0)%EIqvlF?JgOnpo|T0w(L$(yd!)tKKS zJ;2CtF5k#(W8^B8)Vo7_Iu6iP>?KFjl7yfqvLrd*M|w@IbQk&vpYqvL$#A37oVu>U zf05}#5pn3Bz2xI~ABMyOxe&r?5@N)coW2LaSB(P%F?GrCUj)tpi{eE~)WqnWo>z*>!5DyneU9k7;PaU0n zV|lip^<&PE|84JAs_S}xFVE(*SIf{8eMH^#^?(rLWfq?&7@y~Lf#z0!asrKWqs^x2 zl-;MSbfC)ijb>iY8^#yk%l`TNQeban=N@wEy}NU+!OkpJ$EQHVFtdVE?{y3<05JB-#L+7pv~uELY!N$T7mt(Xuf(Oqv=l*wbyR z;wwl5~*oR$>m0kw^8%p8bj$R>GcymH^Gh)T{6Sp46wfEp9#LrH=EBhcvfhh;sXCNz?#t( zgD&=EmLWG(5TMe?<>$!-@)LPt+if7+EB=jdxf|8Uj(ghhBr0leMuA#xn-TH`R9IWZ zq~9F3+%cc&$D?t)@|#Qa zYR3BM<7ru8lYRR&$PIciCYRISuSb};-C0{`55?n|!87f3UBSwnh;C;v%%;)M3srZ`wwkwRMW^mi2QNgOdX zl0s{^IIGaME3*Wcx968TsijocDTGzCE#2%pJ!q8ta)B3O3`&{|7vY7q-sLno*cWo3 zd9xk%J4+qUZHZmSbyTQdL&1ItrkDO%0TDk6AFiH?{n-QwsRC^28&lPPN3NPUcSfG9 zz2!SDUW66^cx<@{On(27W3~t6Iwil4YaWD6cbjc-yKeHUo`=p<>wU5v{kPGJ1#5** z?5@$Rm|ccZ;Jm-TlHz481&HVa%`hl59s=CJx8bd<$Gdedca18#M(pmn>mgB}jrNO$ zgoD%#7$Rm%4w)vM{Eh}3xfID~)UNiVN{zaH@;(j>8tpKo1{wS7G!3*dv>u+eSc~4` zbRqhuG!>1kI{WJRHxPOLPMd`^P3$>4y3B02U*)Wh$O$#1M5OwoD##^HI}v(@BeLw? zGYN%_B%3Vr4^Z45@meg($Wk_8L@^w+M}*$sQTEy9%w4{m^~3U;Q9e3jV{(Z&$Mq=4 zdyVNOfnnCJPAH0TfS*lBsrx6bCz~8V^&$T#2OBtbUat=EuAllKs=a&hBsmx2KYXcM zQew&};K9w!`W-10U1!iq9x3R;pJEN792G`|OH_pnID5u4Mrm=;Xz}RH?YG5c#@?MK z3^fI%t$C5#JOEhGt%6d)IW8u^cv=izZo+X=oc6Dnx>;_+EE?#!?M>QB6ok@l+|+U` z!YSIV^_GN7BtZRzijKEp7^IT@kss?lRBT3;| zV7-Ye6FG%148hS%r4!-JgP{lRkxO3IzAJo--pdX;?M8p?8*!b7MYwP%d#sxq)9MS; z|J4<7c1cKGu&Pv?c(uh<20ytiYgA09r~v zr*4|SAbOfsEw|YyhX`wL{>u_;=)&Tp;)beFn4nYT`D0SkUQ2eXt9;imk)>xWsTV{h zmzB`~bE7>9ZMl%H^q6N>%5%NpE2>LhF_Sd09~{*Pgao;hg=Q!iFD3oEPJM~=HCi7~ z#3DWAXDfqTH&n4Atu|47moSP*ND;d)709Q=$$wu3ZN~xfBZ#D%QMwNjJA}PX_}|?Q zy1{y)u0c97c=67^O3!8nAysr^gdVaU$4`gcW!_L7bksL2c{qNYDO}uEI%JGw>ZWX8 zYE&w{T3ngh@l+uxFK8VthVN3nD^|e5(ILC@1d^gWqD6_As(0jxQS|1mpr^E`;N@76 zDBP01s5gFkb9AR34M7Kr{e;ox69Hh^soiJO$a4R(x zJCcsf$zD%T=#8N;ltkdT!gVXtr3N)n4M>koslTx9wZ<0xjrMw>MQF4l)-}B5UaXE- zx}NcrMs9@PaKUZ(;O6In4cB}`gL2ReMNt)V`Lar#a6uBcBE`t(;%Ft+XV#qKtsOSR$Gb%2B5FT((cpkb>_~C1~T`AfR zenscU#amV`K^W*pv73YqwrQB@tQ{O8C-PF5Ex981uSa8-)zxJGwBRB!0IFYOnVLuw zcdd!uyz;=TKiI_9eIIt>sUEed%iUg8xgXMG)NP{e{GPqR{H8dvbe$AeNlj`(+9j9P zlW9ERC7ZTl<fkgiFu>|zoQhts~GyXRRtSp1c8v`iIapy(I>>zoK`z^9Ck_U zp&c!`gCC=8xO#K{7P=?}*n01M?JH{1+?4|ID_mY>3EcYG!TwN==NVbylGmUWp*nQp zt(zrf)gQ%1z}gC+MYBb}`8!p_aiC3&+}(aztZ?IMX5Gqo%l6+cpTMrTztkP^wiIm+ zgsT2`UM3fxn(t=$#hSKB&RGAyE z_z9aSs`q{5k4GRqKVpyh$h%>CP0Fhs$p=40BWvxjr>^ua517QC*sQEiBLky=0gh(r zv%zuQKIf%@11q$e4<<8aY2)0d!ZI6XmY%5)Mg5Tdk;~nF#jLHj5=wx2I*rn5!3J6b z-uzpA@Fd-^qrYK()#E{DS?Xo#+`fZ&!(Nywbgwz1fYQ4;`xcivGw#)Ua;APj(H>k;v{%@|395;~?>wME9|L=p_a^7AJ$+?8n$pJidv1=BSqf zW(cP+K+_$SV?&b92>k|La=wicv=R2c1WD>)&Vjq{-P?d_gmAu&w(?l<&~+Cz<@@lu zRst17X>GzPQB-Bc34D@}3a}YV^vEcAN;isbl%@k3Mo(Q4%KT=<+#hw6zq^9vR9UQR()$gT3Wf|oDWRyyU{SxvrR>hDg;$LY6w}(~_m$UzX1f?aLjBWgqDAlsj`@9Ew;@oWi{xHR z6elOED8v)HL|$2H=@u4}(vbf2{R(-YUay(fsQ#J_K?mRgj|GX1A4inDdfl2re~-Y& z`w06HW`WJlw5v{#Qb&s9M|v2^a}=hd*Oh>F4l>|&p!8+?cYUF~EUM+3u>MWg%`1ZJ zN73OjRfXTd0Dnb6Myoc_LNk%Ui5tp4J5hBO^Y}W>XZGKate}zI2lgu66gu}$(kj<%gexzU^knnz-s*(%&b0ep z-$V93*7q=o)n16;v}xzqGB!-2GsC^gh9|(oDVAj>&51 zUtzI47?t^Py^ncMW4FzcRcjHp>w((-7UVF5WuGCPf_%O6Ny#q451`7;PE-O*TpeJc0Z^P?fcuELo9CVjb)1NAOgsu_jM%= zQ|h=#=iG;pA#%5mfSlY4b2{Z&E}aUks#M+wAyu{anCNdG{Rv<+rJSya%vk?n2=mIC zbe#*!G$ZNEC%*Go=WoYyk^QtDW72rR;_1=Ss~J-?RUaQ!v;zkD)|$%OBykKcX&6L$ z!W%7$zL7fLG=-^&Eu0mU-G?L?@wt>0T?ll_9XOs*re5a-+2jRJQWmDb zXZz647>M^M*_DTeg;8WAV|5!R1WQO!tlkBvvO)*|L&R`uJtFuP4geu#&+!^t#0PX3 zoDeS2eIfoQRV4>e9B#=422n}Y``P90*|um(WlH&ZX11B+C1v%swmEcS7aU{8Cn$mr z!WnE7dvi+YHWq~Owr@9+_UR(p6}gDe+?Id4T2VYVJGCZj_9zM^8hcyn;K9GZgxNA| z$h~tdycX6}=7*r3{jA0xUO1pO^Rn%A%`ArkQtlblkAD*b$B)Eg%Wm9lJY3Gk{jo66 z!ixgXRp5Ar68KNzXKgrRht4lgQBKxe%)@$oRvRo$ecwvx3NzGhcMsQQYbGX6h$b_~ zR|C7FVn#kumM;c?m0hw*P#2a> zGCy5Xad4XEv{7zi{xPeC6t)}@0C-LQA})B3u;(G(DTj=i_1DJ`R)q7NQMDU%9U*ii zuBPjXNcRa5qQ)_B8(=cABD=XIFl+lP7)NR5@KKAD);H5}n@OZzAXIo$^rv^V%F2SY z&Ssl^03O2y-vuzQX!QLOzFC3tDYlkQUJGbpxRbasN+NS{D*FPKn}uZA#^U53MqJR| zS7nbDJvk;ROm_UL>X|&sx+{ivk;(@y{kDCjq;$#1`B+5vwA4pw52OSY{&Ur)$Lcp$ zI5=rJ8yqg9V{|6D*#dU?rMnK~_WEjNZ9od?vE!NJ(RYLsW?IS6^+*1H7QiOCw`m9< z*X>JhH^sULg;zj1o|z(x#i^yw=P&ebBz-r7y3Tu><6)fis)dY1RS)#4VyVIOum2JB zQ_Yyh40D0E220HssX(a_TYS{uOii4mSQG36u)C6_YHD&8P##s)77wNJ%tSF)dc=vUwivJx2$X zxx0UEEZ?>hi4|6vVwceV6Y|p`{wb-%1a-MIKl3SWcy7E2%cLRUjp9p~TUvhsyjEVw zz9Sc9Ho&K>oKfJj40apnxP$k+`L_@9hL@4t^c*>GX{ufkvxbOOQbFfFLQ0l$jv{@kDd6pbLQP% zI!F6`!oSTUB@T$UQg8)V>lpB7EqqPgLK9Q_bHpF>yL^ z>Uh5h<=;US8x03YCRNTp9*8Nxu5zSm9o}Zx*r=~E9~Ko-nGBto_Z4e-myAPG#+W2c z7ZyV-R;YK2O&f@di3Md6tj}l)tAo<%f3U5yoi*hOAV81cZGCaNZZJo%1OIZ}$`jQE z$77W{T?MoNUs^^5TMIq#Xu$`u89MVWTezx}$ajNE-@@Sj93B59$!1$p=>Pa|Ql7gJ zkeNz`p^n(!i%Rq5g7Ki8ybRtl=tu>wH$xw55f=$h1<#|$u6+HE%zwB;GrrUjca&{v zi{~9rZ+&j6wEJ1Bz04(4v57k_SXlcS#C-GEd&305;DAPuDd^WkV;ghqtDT=+X62U}cHik27#~ju zqlc&A{tV=fX>1O^zfs3G9rHiG7$KOR{bz|O!<2?2`+Pzr;jawK@&RG!Dd&UH&3mJ- zA;ck}*>UXBWkur=<^YVl-(kglm(k3$WI1ho^Hv_|Hp(4G3>F0Au{;fj6ZmIUp z+WPK~;gZV<-O@y4GHXW6&(U1m$VcthJ#%f$&L|YVd9>ny_C+*Fw7vVf&7Y($62}p} z!gHAoCw1IsiEOZ9bGeBl+&trL)Hz9I$_&yz+ixf21UwxN?&BJ!nFBjTviIv_`Se4_ z1SMRIUR3W@0GEo5~_WnecS2Xb!q`Ln;!T zhfmZ|!7{7X4gxluqg|N@)s7MD^9u#v9AjQvE>HedvHdsq!G}{#Kw#;Zh6L}3usIP( zH)A5&y2H!nVy*-?=WCb@YVz%ddstu<{R_0xtzs?FYc~Tb!vZ78iz# zJudSHs_q1Q4CD+Z+USfi9tcV`>QZ$&+%lL_xhfm{7hY;%<1Stvcw-IrzjOuz@9e>X z=ZFIRb{CXIMyGyx^4<@M@%2D!Hydrg4itd{HyuB)QGU#GV^!Ou;+)DFJzw`*!K`_% zK^leDdg5r!f+aOpMn&Bl#4@fGIy#sRY8ZjIQFr}xGTxQDt}J^S=DVXAo^?NX-$3Cm z?O3Oay!nb4NP8~c5M4DUk?~cq?}~H|MbJbTdHjlnB6KTkNIu`YQRw%)f6v&;w~w%x zfv07N5e(>Q0bc$!2g>73=1O&lqv?L`M+Za$TCaV`Bn&fYSr&8~|UEfjYv z?(P!YJrLZjxJxN+#fn35m*Q5O;#%C@U5dNApV0R^_uk+4CmCVnN%q=n&Si5I^8VV6 zXE9wg05=N0e52CY0EOx3o8Ppb&f=uGefxetxJ3odS}w}B$H)4%Y5DLxA{9$vkvNcf z6r5qe!xVmA4d2&MGvfFg za3E-DR#6d;OXv8&{q6QB_+=;HF|S~PQ#!}wH#}#nT<<1U^ByXElE`M&{e_9>47pL? z%IEv%>KLA7?AEKCxPi8a_Q+N6VEB?0>8C(O6c+P%zYq~!lhFJPFs*!kHMgrMPULJ@ zXBoY5(NQsfX7cSvWD-SKdlum&_h4x+h?*J;G%@PR-|}t8L}RfYsBbxW+g?uXr!$h5 z7>bs}G01t9!8~mpWH)PGi!CxE<{hqyeyG$v@6XHgGyy9G{dq+3x^$hioSSV}p~|al zb(UQgs+~ouS?{`HPCiVuah{3LHI0!{96mH}z*}%4G9*aNq(2Bbt`w#1;c*35IF$whjeP{{&7;FMDs zE4QV6Io>GcQb~1bBW9NEx)qxRchiKeyCx^N6ax6$E*pv6UYFs`<%h1hvsA9MK1bkU zO=_AgCURRtctmAQMs9s=bvzQ%c2BZ);ubSW{H1XBI)?zrVXL{^dp)D0dpvjIgr+%b zj!ysw%P{$@hsi1tfqf6)Vl7*@6Q##^M%_8jQC-^m9QB(7DFwBPZjr7S4k5DIQTKEN zk&txUFU7br@w4q(or2)l)X3YGbFj&#@`*OXs zZ=#nAE`Lelckib!MYI$zm4-HMN*j+(N}3y_NwU44r^Ndg__nE`Bbn0bGxJJ`((5 zA?MYXTMgj6V4w)lwoFfbjCWgAp04JB|6$c-`ZBW++dW&=z8|2Nm|izse)8UG?(@Cl z?*gqh(%p~XfjOBVA6CwvV*GFtb4{l9U!3`+JS`f0;qm$iu`wySnV;*PIi8H=FO6G7+n8dC3>{-oG$7cuGyLbQT6-{Ye5` z@+h7b`YMMs+^T`qw(t~RSn9Zeq3wONT4eHAH|Osh6gWt2+8j+NFrs&-Y_a;-zI!NB z{CdHV0&$L+FNv`Bg4J}iwrowl@Eg1l(__&iwCyEvx>fb41l*1JB&1rw!Tq(V(2ZtR zR)&Te zNT8^D`iHm^IaN{@e0NRR4{-eg@ss63-88Ka8qLOuZurUa>=gRSKALv5SI%=FUw_Os zzzfrvV+$EtIC?`M$!+?aflk!ME%*{QQM)tKzGB@?yf)~-x&xu=gd}vs|^ z2WW|Xl*E!y7T_8`si{|Tmzr!8$RzJKa#eR51uN2bSg%WjKd?*hb^{~CLbid9A1QlD zfS*NHqj}cMA#-xj_|1>u8phl`L2jm_^uTbv2$ z`yzfq3^~Y22H@kb_snp<`qGXGhzdbj2v8Ijoe~|q+Z#~Lr5Ne zg`2&+M0ZerX6Ce+8!Qqw$Ypu{G{078UT?IQQQ*$>GR>KGnM)W3vf9mXA1|-oh_$G- z_k0||i*udu>Een|F_Q_-joy>Nl6hfu?>K|>EdehW`DMyz^~(xySee{ahRcBHb7f&Q zG@Q5+LL72?MXE-yAj+u#Zbw1tc|<1ys=6FehNn?Ok4y7RD|E;WJnLJr-%ZZo9A&wS zgY@0{6m2cEz97|phPA5T1}X(_ev@@o#Ta$1lLb!Hn7IuEKHPO$SNJWW;{$wntA<3t@pVC4 zz8JYwMB=~(9$#g(o$t(w9z*3@GEk+OuX`KzE%NEHn(weigOW2cOqB-o*!koaIEqG- zHmRxWZ5_gf0UNg(NxLf9>T!mfA){N8#C&JE&yw-PH1N3=iEl@%ScFtmLM6_W*fqwq zvo_OVU+#v%#2N({2=LWi3%5%_O;zOX#K(j5#)05-wde&7rCHyz_v4WrwYW_+#7cGR z4(>07ewd#+w7V6$i`UBYicR(D>05Dtz+DZ|nWno~I`%2C&tMboGUN6w z{uzk!_%#3NjU}-uZD3iJ^i@$e_$lZh>{M*@=d%XHLwbZ?H%^(6E0SN?TVQNo=n2msR{n z$S`&0)J#GWdq)4@7fvFWMb>zQ;H13SGdW=nX1{IqU1!@M0zpe1R#MCDbs$wf0Y zJ>w^w(Ipw}jVBd#YF88THcN}aW_XQYcLgNDPtcY(-ev)I+8gptjj;gtzTb^kg5s`z zve%Nl_BY2sMiN(1SY0**0{h7%dr8%Z2IA!vTeHnIfuvlCpJWfFIAs`%jZ|`B06@BL zZ>kUGZzdd1g0jMqZBv4F27O#S&XM^++fP$!%jrbkr6W;~$pQwx6#{5!#ilXi2(ns< z9nmbV$I_rxPd6%?5!*iew8ZdLN?FxRR&}}RN zq8LC?Q}u(ajl#BX*6Ef;bkL+rF;Ww314phzSe^LmSiR7vn)qSCO;SnsCw-#)RY=rr zR5D%r5}D28#FY*bh{u8$F@m+v^Y$|XSt=ax(Ai(N6u~F;ybC zKM>|y`$YsmoUCRrCGzSXiYX*#6cV+@d4+3lfVr78{yC9C%Uwn72N7Gmu1hLDCZG*` zz35ViH2ro@xXAQOku@IX|CN!vRx~QiOG^XgCl$kYcKLkDnvr_Nkt4+L+Cpn2z~$A0 zaWTEMIkbEKHWI|apHEOt65em*Q!4e}Y+q@WBL8YcFDbl(2@Bjd>5U}R5BU%Z8($NN zaLMd;xv||1QBtHk?p9^UQ{g@c=*Zv*7BK|xlKm_RRYEHB8T4<%c zxiv&p#lu}+qYbvMeF5yZij)SWaM}5a;aTveBn!P!{IiT#a&S3OjbQhWVwf5t-jO8& z3ZBh!aMZCNT`?@-hf@`nqf=isdTd4*QD8;oF0~=2PR;VK1L0|OHg-R51o z4|&wZb8#&RRySCv0JCiMx*n!R5+g(GN`5+y+y8D*g`ouyDnnf0sml9OGyUFA-i2OF@ zb`g9u(LswS^8;#$Ibf~j?KhJV*LOh^xUW#IvWf|Ib87xE(04qx&U#X$r2q+6lBAg% zlxKJI2{ZupTK>72e$|II>8QVEgK!OvRe1%q`}~|Fb0VK5Rn-&`iKZ~!7W5gAV~`FJ z3CGr7Nln*GG%r7_Q|E@ykZJPO%B-6>wFjJfUbgpVWWV)f9 zrt1-%a%pnR>Fe*S>l%%^EZ*l%r6rrH5@5d8`HSSN$raf#Vv<)FMWTg}w-3W`h>~~9 z9kV`*R`$({X{7wr^Dplp7dY!;*g?*U|1dyqH3g_KYxjb2H=s~%aF#P3*Gcw*X0e3R z=J0Z-WpwL?+_w4JZlG#@-aEc8QOK0tGziU(XOR1c%uAWw1@?$3E@o2gFxgRoDL`|b z0}Tqh)_hYpDT5r|Sah(03 z&9{V?5g{l`{k+@BxXw zNH09%qPJIOu0*qPa=ZAov10wH<3-DD{7poIfx`~RCK+gMAp=gf4f(S(PY@dRW_j;8 z3GuZ@pjxp=XL9G}V>&IXj~GzO(TJT;jBdcI(v-qPQV+!`wolYj(0QIwtA{5ezVusm zas1n#`W@~#K9(_yNetBP?3NvuGo^^u@kB}#_@ys!J3Cd$@^=KKxkOZt{FlLP)a)YY zyeyU8aeLx^L;&O0aGBUJMNe6=uGozX-eS^-uckf>zHng{2g&PJ4o4|Q;_8Uf$jB5B zR|Xyg#W-v6GCX6`IHi{s`4;EXE-!4ZXF|9}gDT210Az5oC%Tx^qv0T~{%vh3A!yh0 zv->(OFCPCl%0ngUlHdqB25GM_D@b~R-^~!wlM*BJ7!f729S8!x|23JT`N>ftjs6Hu zESze?d7Q>X4_`4!{oQ7^@d^_TB_WQzsqRx)9Hd(%fy^n%!NM!X6vwCM1dCC`*G0bb zhw9NkxK9!~KR_qxE8=4|C{F!@rADb3(1)7J3`6CSmFkNy2oNmarKqWOwU8f(BKs7cp4m_deG*tlT-F7#Z zQrcZRO*fZLjJ-$nV2g_E*a(<1-GbR>ac<%BBtbYlxs+rm_#41Nb(S&y!Zj9bobbGy z!t!2tE*}?h=72iwYOU;~1eYw01`>DR!a^yWyUYQTxv0WUXImcL=LwSz^b0r$ z)8=;Y-g5%z+2?dlj)5+BkH<7fc*parHwH{%3QUAV!+41UUivdhy-|cHOw&TFZ!g(G z3afw2HOK5q#8K+aesbptQWgn=QXqKy&u`A!j=?MKdaJNLx3T=hHIkycm zWr~xMx+6*szGv%}_?s+vzb(F`P&}NKtmj5z4S>aoJvcTcKhnhr@#k6o1tWx4cDL|R zY(T3hH84=&uM4fDxGjPWArN^e4ji@>!t)O+De*h>pUk#Os7TnxeioVf`@HsfN>{To zsMF&QYXU_sb>*^HZkVATnMFD!L6*Dzl(Oz;3i_O|tEe*5C>HF#TQ`YfZ~+)-ZH$Jd zNg)I9bLPaJ2f3L1nNgn?tx-pQtCJ}nWe7;creo~0pb*w1JQV1wPvev2uDVv;y^sRY zNmF3nGxJ=DabCoU#JgK$tEs3dM9qA?mA{(#PJW#3)&PY+6C4L%+S+cuBAXQe=I(zR z2{p3D2WzS6pw+Fs2^M<{@xZRZo<^^K{c>(i(E|M=7+EX8uSIIkpT%LZqq z#p2Md!+-`au%qY15K~<+QZ6OI5wXQ@IQdb^ z21dbNLVF`d$0*M58qAQ+UqqEU?3~C?-Ha!Kr2iE3grYn2wLzDCePUtXT?@!c&SI*C zP+PNT(EK=X!e*HlJ-yC(uJ~1v;K;(I<&{;`;l+TP%GVcrnKLLe=~V*gM5_;u`Pk(c zQ7=)!jEq9qvGzQ3h+@b}OpcmX9z?p)U;t(ODPC@P=;LXf7Ct)uC)YF@O0CW@lrnNe zCK)WsQss852=e3Nlv|Ga9wMQ{aJ0&5LTR|<=c+ctQKFQ4@z>7DoUElb3 zVca6DEd&WGOj~5uOJQfjODM=xhtMdF$bi+O4BddnZdo}wbtRI|LKOq;7{7??5 z)^td%>Bl{k2d-(dAm&tPTbeVA-yjjV)H&Qh>Ie`Y-H0aV{WYczCTgn)oioOsL)-Dg z6qT|G+36Y@-vav$4AHq&Nj@l%#mQGj>q{BsS$({@%;s>#8^FnOpzaxr?PQMXA zNSq2$XcRQ<$u*TVHbMj!TcX+ZWR!<;6T>1g$0n#!NiTeg%xu^}zw9!1aq`;9)1Na$ z&~6Pbrj50)Dn0#b_;LOG2)@Wx_o?WWP%Zb}ocsnee2JTO?SYCsNk1;HZ z9WAP#v)Il)V*oTy2m+VbqIgIHBXATJE!-BbM}}8sx;6-iy@A07&QU(DuhW!OB%`tZ zZbCD9&d!QUR%y#nI~<2OoONoS26pw&`#c}3qx{ziRGnDARW46qm<=|kJJZv^Q*>t2 zMTW`Z>FM0AdRdNPlhU(lkjKRbLRV=Ih2e8xl8RtJS68$d(tgN#n|lK62j+>u^=~PK z8fyfH>h0FrR1~ZCdq2ij@d&<<6gikV7f@W6=9wqCaQ{&)bP)AR*Z8|{l z^UCajRhDvfJ~PzlVbsw}!Cc9@KXfOFTZM(<=Z^%a>zrI)+`;kYmRHyl)gMVMWCuzl zC5pS?CbQECuud>>9>X;1T4le~5a~zk0e!c#ZXL)_98)suxPns&Z52due`_dE; z>H}8mgCDR{qf&=r6f6VLE^ghO(mxg!RdB!y6$_Me>ooj`u@3LHHZx=~&OVDhTDDhX z`ybE+b&M6+Jz&?G5-_CY)05qg=%TG+f!LTtpWRyi`a-OvOr?bc|ARs(sC&G40+O=WTgz4@Si>Sdw$qF$k^ZbB~># z4@b{p+?r805>7{*{>Cb-(YFCBV+kc^eyBxK5?heY&B=)ccELLVoR~?~Ni^)kHDz%? zbN>`q3jw_hso&{Rjt^iYy7^JpTK1G59K2R;9ESlx*_l-S>T0OLB9MWk(U=ya*( z-HS1JL&J_lAFan#V?A-Ia zj5n@zaJK_VIK_;{lpT|Y+x_3p1o?ITG*&!3Sp!xK*76S!0D>P%wit~{+wSk}a^P)M z{BTIo(XkmS82M$tRk+N*o_ucM|Fhim3M6gmpqh@~GNb&_3tIy|BlLtuhdipi=S7{A zC5W&#HQgo5G;UATeW*+>Cz9D(TDHT(-kgWc1*;_WQB9nuoOt0nLEAxVoR%Z@UuMBy z;*Pe)l4uT@lN1S1rXAQ9a!tqP4`mC}B%cwCKfu+MUpJKMHmY4MsF!OMn5IE|80k|~ zt@>}&aaHthpb=iRp=bdX4Tr4lND|49)r0A=8(~OgPF8h|#_hmjX#mMKhLRW%x&Qao z*o@`yv*tPqUy*c&)>e$N7p3Uxr;_Fz*Q2l8FR#z>xu?n6Rd)?(7HZNNNT{FbH2Yrl z73`W-D~5z5=KTI@RO;rzf3@Dj=wVlAiR+mkd)zkOm!1`p<`_bAcGN#Ud zP6%w`A~bG&z}uD7bS9^ADptY_1P$#5(~;(NeV{9IU3G|ZyZ4w#cHI5R*V;=ACL zO%sy$;kzPN{QO=S`*+H6a#8UaahnBzb`{5(fVZIajHcUOC)jSaCJKx|MX`g@Hc|*0 zQ>d_qKYjXdI3RxeU?3?#jM)%U9x+egfn0If*Dh>KbV^y6)uymAn?m@dy_sTWNs=5| ziu&=evO32DYN+yL!TMVmS+Aq`&53n|^HW@tYT<8mcpRrCwsSwzh^7hSU{v)J>S*>V zJ6go0(%?AH|K@7XQ6YaJjmMb@tIJw>)TmLX9ZU%qxq>ImSE4&-$s7+8)&@T>y`aOg zo=7ftvVZge*9<6K)&*m&1-~zmwAEfjk8S2i6E0=|{+am=J+^7w`r68Q%&>Sl;TQE_k5xRU1>ws`y77$_yM=Ub z7ggMcu73?-!QX|^LM8H_d$)pzk6gRiSnGmERZZjK$QK{<@h6tvr| z*#pADXrI!Iz?Vo;MNpKR04U@zBA{Y&V74c{{U${dud~4i+n6wrl%GpR0WXtIaeH@o zY9kZ|m0bn9Xj#6!O1Wv&5pddXxRTsPDJnVeh+#jb#gLs#O>lOk5@OsG>3v}JorDNp z^HKB(^jP+y&W@d!5%z4tFsq9fHl-TH1-KdrQ2z|H@WH0w{^t)m*5QuRVkvD(Z3>J` zn#u?f%H?7jr8)9)K@^9GPqO|?zIbOru>{II0-VaO-7ot#Q_1?BqG7gzp-4FKA4tCo z3n4f~v%N@yJ9L$CoSRQeb?Q~P+RxMSkDE%V9}3Qh*>5NaA-{>V7$C&GSb!1GM-qIw zQ>(44{><#o4+fWY_>KqmN`N{;430L(!@ebFTv@cQp4hO)wJX4dW2}X=(EgwCF`TE@Z)*d9k3UU#eOJO-&YVKDg73?`m zD!L?;yi%>lZ~Bg)nusE}SYbK*xnJq`%VU+`?o!lpF$pI_JfCHV<-Nb6qyP%Z&3=^l zO_tpUTcybW0Ht{-s?iXuX7%~E=lqK}?-g{wvs?S*IHRy6Xw{AdkM9X?N{5j^1P+n#-Ly7mx3g2Wu*;#s^uP0E}OSCbNn*x%h_Dl-n_U7lO ziHlNsA@@wbz`>~ONTeZ`-b%fE|Pc}9da7fNj z(ijyf9J*iq6c_Qg=aFg^wSAjOQqS=SP}p~}zOxM4`Np7Fpu?*U>4TJ2)QD(gHyNI~ zy=+nRBuD{N3f5Ocu}2J5;ez*f9OhdVE+K7{E*@ra0-XKq+cVA5gDA+!%J&;4?>zhk z(~mMHh=C?L#+ON(CH5x)B{ze+it#n5$LIhzZk{pksC%b+usd*f8j*Ib$h#ML}A8&9+rTI@qpodA# zN?n!Mu9T*fXFBt7q1zIn%f`F0|eV2hBP9`6=^es2k~giAgt#n`F6=D{PdSf~rhIN^qRWQP>S zN*p#Ry)yMS4^5!4omQI7$~m|C3U4+FKmr-~a+1py{(=ozj!^t~W=fF-kM~qA9$D0X zNpGgDn(<7iX%zLE0oBsZ@#}!;tUE~Man%}>DWo#xO7d|XFr9Mo+WfcibDL!V)~Fsc zvKgoJ5RZBsHF6NWj;VxgS;Uvn*qWM6s%dhDr{S!C(QdST49JJN8^^n9-N8u9q?<*u z&FX9J_KsK=IwvJcFKN9Z-B8F=ZMK(XmlD;$5z(WgOFoa5e4qwUb8xqa4_7FIqMle9 zjzeP}#3q;0YfusMdqEnM#wQn7xQ)c)IJdGusm^d&;M~bq{2hjknnr%=j+o|Rt2)+! zLSi%L(@(VwQq>DHM`xWfi3OZ9kw^BbCVa>f@(H-Ei|1yqhw4V%x$gS*DAnHlnFmt2~ zKGq3{8pjq^^>MdpA3)}Wwxl#qTlqc3_RE(9Gd6VzL~BoUN9Ih^D%uT{(zS71v=gNfPrO`X& z0Vp%`F=dN1_g%i2q(oFi#$Ol0@iI~Y>!YKUGYwx4%V-4NCz!Th8u#u!Vxp~5+4<0T~-!vE}&?njDD{Cv8gi+N*-s15z$YBKCs05 z`3F*t0k*Hazol}GpflK)>6Ek3qjHVfT0W9BZ^iZ$s7?Bv!xUNvO7;$E+ zi*gQwOg~TC2}a&VW}WKaNFgA{_Iyj(>%*XE+jpKckEW%gK{ejd&bU5H+eB(U`!dlU z;bY7j#5@>d&x_|{yiA3B+#2CSV>*^M|2=u5s{|(X5G9?pM&nTIFa}-3=NAxQ$wnq-Q zN?0V$cQDE>IPdZ8(lhIHx9AD?fUfe~XCm5RO6mkllAoz*sOLhb0-4K3lvy5@a#l zg9hgcwU3hogTd8ErejR0R!APQ;EYx!s{Hcni`4J+j|5p{tTE_X8X8QMUl|i_Lcg-e zAjBHqr*HzVGjJ@m0%WKDQY2}>0I)Hsq>w@J7aw&g=59SsKZ)&nE61^0kNJGhyE9LT zvo;)Cf%6Amnd{+>$WaH2ppl}j5t4_U!w*}BCYUn9Z;$~#6${o!i@$&g3b(lT6h zOoPliJ`tjX0-uVdOrJgnRN7@sJyu_|xTiqzL9-^MkTnbzLe?%KhBE&b+(!t4A1t+? z`yDO-mu@xr-w<;H;*8)qg?Fa6CiNZOT$40;5%rw=^9M(b)fvj0svMQjR&$q0vgT_E zst@K<(IqY{2LlAy+N+FgM)zchmz+dCMkW}>R4W)pPtPJypU7bh=_`VhLWz5F7X(A-SN6>0pfbr+n&e zjx0K<-(v`{%7dsn(Jl`|4^` zEQ|`OS@(~aC>QEEI<24gsD46{1NB_CU{Qs>?pnMhb`4~$Xc0dz##zHtNL&0tZ7bT5 zjO>RxN^32ACZm(N>|@L)_oH0V#>NSI z==B24X*u%LKd$c=A(BO7da^1|{X%Xzj?nZydxzXkojA#{NSDB21iD%SHcq3$v>XpT z^LLYYsYXaIJyLCm_4pah#*e@-HVjh+gdf&d*AWq)svJ_?RIMq| zuBi*&p;~=G-+*I;e-REYq@ce@JC!L>PH%o4)kMjsfHH>+)Le}ZbxaMVN^0Lt6*`cL zK&8-Dr3ij~$P(q9o)GM;n{((x<vt}JoNVRU5Ou%HER)}kd`5@$je8r&t#Ag zp$`xe<%$N2Z>FG^**-Szf3=Y~i3f*N@0k!^F+&lIYTH#2>xm(PD$+2ft3rnsTxAB1 zNJoQDBRO^U_Fo{Y#B*J5jBKDpDU3=Ht&;E=Z?qbtWiji%>UuKSyB#|DZ*(Idwfl3) z@(f_zNg9(i{c!D+LR?-U`4L9n-uop_q|msE^81$pLr{R7SZ
aD)8t>>e>9!F!hY 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 literal 0 HcmV?d00001 diff --git a/adr/graphics/adr1001.png b/adr/graphics/adr1001.png new file mode 100644 index 0000000000000000000000000000000000000000..14f4354e439f3e7cad8189d284577e92fd5a1b48 GIT binary patch literal 40662 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 B!|4D3 literal 0 HcmV?d00001 diff --git a/adr/graphics/adr1002.png b/adr/graphics/adr1002.png new file mode 100644 index 0000000000000000000000000000000000000000..19b323390d8c783514473a3224b2042fa78625d4 GIT binary patch literal 48371 zcmcG$1zS|@_x=rtNJ^J9%z(7Cbhm)Cv~+hj5>f*K3P>Z((A_CDfP@m#-Q5lUjo$b7 z{yi_?!GmLuM1N8+e92^{mtc-*T92|lP931>RWF+97JJH1p zU<2>0A}t12Iz+k!{3Y1*ovfLH0vrSI8X4{>JPzEG$6bIwaPTkSp8k0a2PX$l^1s(A z@Gt+_2LTQ))DjNypMA7}?czps2e{trk1PNi8ZyqDMi zjszU=OUxF>Kj-ylBf>$G8C;xXACRv9&)5Cg93)e|tG2*S_rLdSKA*M@i;m_VHy=t3 zuUqh&DGm({HD2wDeZ2zVz#<{>?(?&^w?92tps1U3BM}o5V^FMn-+{0@RrQQe*FjWr z>UeG7Xyub|mh;9?{b48C(#D4Qc>}{jjWuDOQbu%hvp}lf_15NOnSrE^uIFm3bh+Ie zpDF?#J}@xQVZULcQD8O2zE#x7h`O|CpD)qX>R0qY zkadOe_E=$Ge}Ct=rh#7Mw6^4bSCmZh;RSxBrh)HxO!~0UO>tJ)Os(zr^&csYTe*ow zhl?GQD7@=mjnO-d!21i8rf4ipyX>hx$1pSDNlO?E=5abI&E~fIuK8xaDGy?RM#$2I zLYMkJ3=y_~uc>PYT#m5EA!Rh*_RHI&UW(to30t3FgHkG*3qy{o338@4QF1bU1@^i`xLm6yMob?ha}^BIS#e=MH!+(^qjHYJfI!cWW3@OyD{aUeZe zs&}*;$@;={NQ*bV%<%iir2*D9PK9Evs-BoCazU@(3d!J|ROcbyb?3dB$-pkt9tiPQ zPD>nepF`1Xlh}3;7@Tx+bPKYvZ@r>jAI`83BP~l|$Y7+g%-NRwxnZ%jwUtK}rwX;g zrF|2SZ*Ka07pmy!$foaq=W6r2yd#FK_U>vUgJe+XY86*px9~j8|Nd&7&*RR0&NY#$ zLk*n_HUm7ukb|~|`IuitrH!b*H|O1$!nbhg{8UsOF+1`s4T!yD?y1HXu6qCH*&~1G z-_7iom37-(Uy)DU7oEA&%zYssAmA|Xx$$9NVMYddqRik^cO>CTn)`f*mU)_~TNDY; za|-`kHm{3)TTL$ciQImvo!=GNjyiU;^`q5G#Xh%}M?EdDYXQRX3aAO>hBS&rox#~n zc)|bS4plw8pRCRjBmfH1)c4G#(u%fISM6A`zSy68z4k>FeTvGG#<9k>{|kNIL-Tnr zxp#43@$^lDi+ZR@Y^h;-Q)XuSDfrbZtgeGTnopdFUwh-qkCH9u(mk@2dkXS?r14LF ziS1G*HldKoDin+JsT|^()HR-_mCYTfD=6qA%{KTiSd3I7tI7Atyj2uDQ_IQCC3X#E zh+)h|?eVHruJ|VZxgQNbC&jK2HoxW~tAdY(^|s>EYLIDZ|6T+LTP-|V`2G^r$mqbi z)KMgql+m>$OSXbA+~)=j#8b0!STtn=bRA~>huii(HeSW zaRzaqIOe#QIIIlr20lk2R8?13SDRynpOx!m6p4$ZFJ2k1kw)bt_Y>obLgRd|Pdk8s zp@4sW(R#E0{cO^}UhR!$@JxlE-v0@O7c`4MO=Y{chJ_!xqRIFn+G;8)MqkSF)4lpF zSqu2s>KC{ftkpa$K*lcS?7wH@N4p#B7lf)(*i@fACxsi(jjy7Hz0muBexDCj|6HNR z;70oXJ;?xcI+fQMy`ypIBMG{)qeidLN6;AgU^~0NzkgNazCJ_fEDIA;R~R-87BR6U zg@!SiKHJb}5Ck*Jt*n*46gXGL}v z!HKJdhkJ7=G4}fbb>48KId`@4JcSeuHtJtfSF+lh_a^9CW@fasim4XRscpje@`Ki! z(&e{tP2LABgqVV-F^(rw`~}lfIioDu2vY2F2(pvQ_HB1&Zm}|MTR)%9HM#Qyf1!CZ zrIb9U=;|5!}5bWhLmcEsN!%YLJ^s zAOQuflOw-&w)Cgk;2bTn**7U&LG`leDd6mP%*0{u`@=KPY0JA>EGsbG7RYwW zv#a`U>8mCU((YAss6mv0wy4k8vaQl!a>o6>tqrq*5n#g2s1@R7|p z)ee2-I4@%;9on`^`d4CPB6Bh$#B0g?N}t)9+VpZZEA3AkFOg3w0#&%FOi$OYy{7!O z&BhhWHsM|@{^03GjFE3dQJ)6z*@XN-Bj8(RE;CrSXb+)ZzxG|Jg4~RBH zEe+q4SH0K+O2T(|p9If|S|9FjJswcj*4ExrKLMvEC284` z^`=ctO}(o$2{%^Gbv+N-sIgsa|A35%S;w=}0VX&O43G>y3S5cy5t-#n$tOH_4nRK83!3-a9-x zg7@FL*!s1BrK>ys?ZpZ3$S8Su2m$rc>go82hz;Rim4m!kQa5jvpd@&Pr%|RKMPlEK zt*ay_2c>)qA}MP=j+h#5op<@AfQ*dX{#i*VoaU1N4iNSO>*{#y>X(pQ_GcSZ9_GCd z1O-k<#Os$M7#ZSux}|Q;_t-p-O`M^C(4C5zzd2}IScG)~OCPD)PZ=WC#!c$rkPxz; z%;v5Uk&#E&J7vb-KVp1@#L867KMHObT?Qp1<3Q@g?a6R&5T;NVm-WOVAeK8#6ZJm& z-CY|lwEE(2e0w47q@dzAuCDpbexX$g=6yD0yVQNTuP+V`-jO{jQnTUosJ=d# zS-+dT&C%@8sRQ(Uxo7?FPu34_N+&j=#&gdwPs^e^)%_Cg%qWpMcv*+~R$~%{nle zEuE4WLnAXjPAu#vKut~k%50Emb#3hfi!#nfLIa=C<^Wj`OZ_6k+Zx{GFq%R6^D$MW zkhZoq$567@4(+KCChw;zO{GL{PKJdU`|!uh`1k9d_*nk(^;+<~;C1^^{BS(L`ub+K z3X|S`8-YQ^1p`;}h3r1AlE4R!VF6qc9=on?;A>3RflpvNIy%ZIC~&QQH3hv?lNjdPVTut*cj!dJh-9D2qQHo30o9Jb)8#!@pq!W5HKLU)YPh{#i$_lL~OCNK% z!;7{DG6TP>T;9l{jaXrvFk=7u0{X`=|CS5^8lxUMWLW=64#WQr2pdQiDjR~lQllmsl=YFuIBtD31#1PHZsbh;(#<{-3*WFjvLy{ zZRKa!m8O6q)#yMZGr4hn<0nwX^vjf!tp z(^ps7R~C_ktUa9}XpGxQoyV*_J+Y)JY1w=8Ei+icrKLZgWgVgALV5i^eygtZ=`YfJ0Ju+h(0tyL2w{a&=1Ub9iCMPB)@}}C+Ce)d%aGgjh z(Xg%5VCgVOfWYd{RO_MQmGV49_|(rkGaKCw7e!YpALF{h49JkH8=ie+mQC?f7cVdG z)ameO%{uDLW1a{+{CcW=&<-b#d#!j;sS;=meV-0iTasrUG)$hMfJ56@yA_ew&AddS^SZMn&u_} zh_}YEq;%-v{z4e{Kyq@b+4BU_bP!76_v%Ou(!mF$SdciA62mW`IGpdHzC zqDl8LW$CG=B0ZtQ_9wLIk-e|uTpF9}>=*2!OG=d>lUd%M>u)!NAK1?H1WDYaUt1lI zN>gxwVuo=)(N$O@C%7o6e8{z(YaCx3-dF%8(4fbU^8#6@D>tn6X3Ivl<~ME0(7E+r zMTP|LiCsXJhb%J)0rv-h+jdLp>tD+U4lp}1Yh+Tfipc9mYSh`yF`Fq zANU!USa!DGbfBGuu7z`9Dx3Nl4Ej+`$0{n1$EB*Y z{FBKMO-qb>P>2QWF>@-uJjJA({HDQ}%rPnHK7~xZ^*8qom6d+HU{oEw=*4Pl5)syMNz+75vMb?AQ7Pj!*gn$}}fz(A_c|0?v zly5So>g26!w$o?=q}~aUaa>%}ZTGHh<-5+1_{H-*NQ4wmb`13^g2;V7XownPA+3`H zgPxZwTO;w^?d_mo;eg}N_OVy+?-WrYbh8bAX4frM+jNY^imP3RoRaKuBzaBOOB?Jb zGi#f_ORHRk4kRTd*NMz;$OgXR1VdjuQ~qCgEnPqyC(FHgPJ&3Jqe@0hgQdPRQuE!I zsGg-ih>DD~L3$;!OlV@FkBF^6jv;lKn*O_wPyhWJS(B~x)jsteq1ZQ$tKatS0Rg{q z^}2CHuV-heK(bMh*r4ZrB3G%#llxMDw`%(R7F1C$gIVaHW{dF#Hpc4G3;i44ae??g z9vrh@#)F{dP+&GDvAOLV_*ad#lq z^F}RH$K^Q0{!sxz!NGA8E+K>2`3r8qyzPB#cw9A%5Gy9 z`AUqMd~$twgl=!1hN0W(oFpcrO|bqI)Ib_Fi1JcsPgzO!1Du9aYq=4jM#M^#9DWF#ow8q5^C=n>w(!g`{79q(Vizq9w$ zfP(cB*0rp=AylhUX?V{z)FU1A#l(n3?Ok6AT9n=Kq`=w`;P#PQza&@+Di$B;4yu znr7>2Ej{b20a7XzUKOd3@Gb_rHpu%52nfPb11C&@c-`MStU1wQI;S}?P&?4yupb0h zxWbxoNSRdGH#rl-NWOER>ek%$rQ*3PK8&Dl@9g8cVG5r=z8(L{J49KEe{! zu;@Mhj$tJktprpl-@+jck&!dtrUA5c%p<4%q-l-;Ge2%a#!6>R(jxz#8Ez#3OvWfI zGIIO^eXyxXijtGY^XF!LbR5rMw+=c9AcMkV!$CY0yeFmEV*QD_m>3fI1+UO|Uqps2 z!WGY?g@JW0me-2th~sj*vi67Ln&w(v4?d88`zj(Iad)Olr7T% z2`yUGt7SKw@Wf({*8;RmzkRaAgRsa5g59V@iAX2mXV<;>sdQthKGZ~;8@-v#yL%Re zGXcS>-d0VCg_c~SR-gP6$!bJ_bGLnK_09FGqM^Sw?K!RadnGx(^Zb4?D zucT8HX*A-aqC%v1le#^Z`4J%1ALHQ~e)>pfGgpn;SGg7!|J-uu<7sm(a*ngmZh@Aj zn}vx}FhRyeS2;w~J);3fY}m))5~)nmk(I7TUy)rt#|Ep_X*=l>IM)`5O_b+{c@FM& z6=GP+e$x2Msw`lSH+i|~d;29<6Hd9EQr4BtY)UYhY#}XCYh68#cfa|Y2M=A><=9PZ zk}2p)*&uQUZBHF@dMWtxer;Ht{^vh|^T!9^ilrpd!ry4xEqnscoEvqY`@X9%ZcAD= zdt3JoefK9h9mZC;juJnT;Iwqo;7-)r6wd*3ld%PNnLwuYd1syX}n*hA=B;u*}E%cd$VUx`rQK^4n4GlXfa5fH?z?(Vo*s<-5A?>ND`z`H>{rcDYcoAB?sZU(vAJ6-6``Qm zlM!J7Fl{Y(4P6 z!`JgABBD{Ru^tfBe${!tk-Akamc0Kd0m9EZal}sEgWMQg&5Jw1DNTc0U4)rkeh&lY z6Pn;0myp@XLVlbd3*TkQXhzi!l~o@H%A$ifFzm<EJWRHkIJ^$+SE9Sx%J`nl zi{)5Vrey^y%*7&N`@Cuu2bFHkq0HL~w5bK?8U!RJQju{jsm|TMyZrVE1SKOO`G7<0 zTCX9q_lAmx;~cbddwDKpSh#<=J}WH-^J5|W=@@wWu=MT7RVA>1HnzG((wY@&&Z;cX zi_D^ikO($kYSX#MPQluDZtSM4j?#D6X-@P~0Os_F1LE}h!zo5@ww+0QNT9!5AiTZXIU)TP4? zJbDCrPm*3%hc7d%;J&%Vv(2$r@HL41zJ_w2x$r?@im>t3r)ZS#eQw{rx>Di~7te(Z zc)PrkGg3VlAO7=q6Mpg@OK#NzqkSbaRa*MIeZK{l3F7bPg>k zn~CHzH3pW`j5uDxa2?&EFvbSr>7|4qNY3@D zqH>S#)lkBn6g>$!z7sNw_TNITj(Db-fsRhovX}mFweaNPM0oa&M9+PdA7-Phz~F+H zyTEQAk)atmJ8iA)o9t~D$+GD6r}y?9{7OjjoOOGwnmwi4to*@m&#`~hG4>b&s+-LdXC&H30N5xy<8qCKdr;+*Tvm0IFZ!d8M-qUt`ucj)fXM!p zEb&)rcvz_laXsG}RJ~|0vR+Lpm3JDby#)c4Lw*AFVtasRy3c#&Pt7+t)0MWIYroQy zP;c5u_h$H#2)%h>o#L#;O+~?x=qP*fj!Ecicnj}Ul&coYj6xq{yA`p8Lt}v}M#VSr z&}9h6P|S@Np^uMGxzn25FWtr*Y|r&1a|eJytN?`%oKBtdRDrA2&j1Lf1q#0!vu-oC zzZ+exySLh|w;6Rk*W&8|uw3D|BBh!h6B7Vr#za5~?kTzdt)sx%nCc~fOdS9KOie@c zq;%*6C;=>14GVpLL|ISK2-H$(z~HAott`!lV&$wMAt5X`{I=7a&htF;9#2?-Hzi5N zOGxSH6`dmGD>Ta0|3rt(66&|iR0Ht_8$i_wOObaCPuHR2=_NoVcY?ns8u*1@%zKw9 z_Ew+w8yxV3$sUWDQTpqZxF5`4uBX_)0*nO_;)$#V(Ey0Eh}IzFtBEirQ3MT;o`5aWq1#(xi@vzt`60+vgpYp&B1i&PcLct~g#n1GlKTNy`M!|J}ffE-uGW@yUjjfyZC-z6+Gfp$O zh3Zb)$(|?cz73->-SqQiqNIe|NOg`@rrKR8lmQ;Wlo!BHA3Y7rz`f^THEW7)VTwz< zX!X6>Rd_Tn^x$`|kg8WTIBz6#dk7cCjd+wz7Hb7H?Kh&eJ={0Z7s={*J~Cjz8|$Uc z5UG|WG~jt`E#^ES#~D*HasWW_2PiT=QF7JE)E=h`Oxbfv68xKmhAgF@h`*Mbxi`no zVv~0PuofKO_yn!ipL7BcB?_>3oYcK`SQOb^U@hdlK7V@f$rdE4R-o^>hHtabO2+TD z3+In@tzQ+DgMew?nCMmFlW3kFD6jYXzZCQHUl#^KSs(0sWZ*>i_S zN@{~Q0JT-V@&K$D3TzeG5l(&)tqIP-;$ zD*w=so+@!Tw>jV2zf+(2aq4H|oJ?Dn84iABy98)*)Jin}P_d?O(u4#7;BP@{RM^B> zl3!l^tb{b@>|$`J$!@GcI``6N^x=HQem(KhbyCko!{+}5f?)Gr6ZXsF3zw!DJ+3E(Vy^)=@U0Fbj z+P8+P-jYynam(d?p}=zz@W1yVbsbaAOJC7^|30%p*hSJwMAUV|QD8`)?yA-w{dR@o z0WPCudz#8Hr(aWZ#YHvsiJHPATli2LCQ=g&L5$ePY#b#L?jd9`mVmatDWX9GAUzig zE&~sU#3l6T=^}kngDf&pWGA;}ElCLL^>Z@505%&)VOGZm)R6c{ugHH!naQR(*G8 z8#suJ+Kmf~kAx15Nn~Hh;>hByOzNiPZ#$kJ3DD_f-}(p0@jfFP(XILJF~+mt^Q&HF zkK3wh7j#M6mr48=v`>Q&j*Z+caR!WF{v-G|V2?>0cC%VvUteZr!NJA?3k@5a;b{2ZFPOj51CpX0E(pr_CyT$7{kvVhk+Bce%loa1DaaRo( z-OR(;EyDw~Eh%^;*s6kEC{*-SMaNInG!0~G8_I@;3=-X-{Le1tYAsY1)Lq*C#LN<$ z4_5f>JrF^l>?IZZ4O(G7On$+|8$UoMZGclX(BkZ1QFgVdA+aZV0 zU)@=az?qWmvJL8c*zpW2&|E5L^r;vj`O2_16ueHD)dH$?3B@30??RMQt$5$g6(xFv zo|m^1yYTCE73hqzisZ&b}VZp3}oq>FGG$Lo>p zy6cZ;c285fmv-d)1wR+B9(57ZUsXlK3N<|!EcMcLof#ThfeIb)928ZZOy-hl?#-;t zJEcjkZ3*qN|8?<<&|(!tOUdaoS^q9Kl!9d@Q)Ra>h4Zk7$^^86AK-Ox1ngiILh`dJ z3FxMEAem;dmTyM1G@J^)RHjlM6nc zD?ZL29W;_pFBNZ*(piLSSNxXE z1yI+~F=|qqhH@YUR4GK0TPrqg8f3t96M7dnh2~P-RuqyXd~9r9Uw>5h7gWTw%MKCi zgEV^G5chHo;IohT<*gz$720n|2|qj;s9Sn&pEz#Al3``)>CAa!1G7oyMDtH;SSz)S5qK}O+?mpv z?@4>3$oR6e<2H+y*FSx*rmxV~XO`%9MtXdZE-}-H?qy9EUC~=HGEiVK*iGRk=ke$w zL4aFjg7Wg7@3o}fOxR?22 zWTniIPM%J&2(RR?l*5Hfd*6_I$jo3HcM_VPKrQ$aE!PgT8p7V9Tv#Xl`LwM@ z;QgpA^}`{PVx`cn#tzTd;CRSi*%cu&BMoqanYP{^?jevC4IyRwTl`ip@%(3hjxn3O`Uz(8Hp*z`2YVN0(CS3W<{Yt3K`uj{qvVb&fBFkQBXFv7m9d{?V8E*_b zBh;na{Mb{d;K|UrtHJSNT_FDo^1<{l>ge#m@M*4cut+?RE^dv|{w)e5JyNcui`=MF zsH0J4r(kn=<7y_cV+F@?^tGi<(?@9j*w+{@h* zzOq8s0?WAksa1TajS!(}k)3AH_0n?{3m`^)A<2hu9#60|ysW#Mu$JU!xVgL*RFWIA zxwaNrbW4p*HxQDmbxBU2H=u;rLv7&X)r~rpb$IG1%0~b@q9RYPXU-(M_PR3Gk%jLR ze2~)-JKJ$;Lw5O6ONh6&I1q@Q^A1cz?OJyFNg`)VfrYsg7vx%KgC_+xasBXS=kIN_ z!hRc4JU-u;uyE9qI^Yy&kDQJZcjo0lx2lu-PWQ_*p}_|_Q++WbeeAPA=~{2kn-_|& z`(`Mf1k2p%eu;Wh=pXMN41ehL@DlwDwVjj7VoJr1#B$2`r$+2Z-NmtLcNB5h$z5m1 zv2>7;LQ2MZK8+e)jT8s2_=H7?_4j{pDl;-rI$_>4t8OWM8)-$F&0bRrqKJ$z;fDJr zZLSJFITa1A$6Oec@9Yh@lp+#(vVJV35UW-%2eH2tR25Lwk$@ZMSC?pnJ)V}L)5 zNx9uZ&s2E4@;#L<$QbWh>IO0Sm{NIsKC#v>&TYPrRdsPtH0mf9Rm(UNYWw##EMvV* zG>vQm+ZKqg8b@*VJ9#>i3t_8Ax=|Rt>fj+li*z33R%g~WyebG}k3wI|6~Q*HdV|rf zgN&({#7VBMGDPLu&sdyrGNRBRZ#0e&5_a_kH|LgN;}u5zRnZ$m7w7Eh)PGQAq=X25 zC4r~Tv`l_~VCIW8Bcir(o#n3Rljofxj?%PYMzyLksvqjfhH-0(s|t)(LULlQ_P+dP z*X%KlPT)q08lqLm!P^)#j8%w%8B}X?k4Z6XeT(uqc(J4KC}ki z`}l=0FOSOg9089OY`hR^Kxuqs6_Z)`2T^1qS1TZ@QCX*4)JW>$Ux^!g&eEb%Ez?OO z|JFe1@mHArBIz`)v_`vRhVoNb@|^icUuOoG_$ABacbN(3i@C2#a@&xN)z22PKaQUh zMj)I+s$H|IT`Rka@KI}S>bi23iL+CV?QzD075g#!G6Pk3aB^qUnkx1x2xGV}l!7Vv zQSbHmsH_#zV=4>9hMrUJ*Y1pLMMQ$yQtlI=UaYP7V=uyl&xN+v0!etRUV2OK zT0DoFjo*abB?`((AG7EeD#Q7&sSQ=jMA1V6yw0Ih^WflZoWcXvGh3bk)mkxVTj_Ck}T;0Wy>D4Js+`3EE|CB=m@= zrlq; zlk1z;$CH*d)W&Z9(;2+jPf=vw`Ck1XI-2V}JhbZau{f7?E&L~jS|Aq;RE}l}Hou_7 zo_W~fWFlfCC$aNKmW0tG?~p{aD|YnhH(?LZ8bp}p8$eEl6Up`4)tqZ2x02rZp9tb$ zp5yprQx_F(`Djk=lm*zk@bBJEk_<6g{LAi(L`Cq~dFG+*sVW|%ACpjyBt`ulW@|ioV>16 zJBdwa58x2UMbscWE@k##^>oQ_p>1>}h8wH;BrSaT(vQ~{$1CF%cE?=f#H@13zx5*O zM_iXTgR`~~^a0+_f^OhD?EK(&bZDM#glwWg2uE4Nw`=(f7pmjlj1QXoEx7!4^-nL_ z?u2fiAQTDb!F#KMcm0aY(+6FNrvo&s+&AsXEniC>XIzc3lXXvU6}@sF5)k0GX1TpZ zuyV&SuQ8$?**kBlSPaj1{1uwPTQr*2Z|0fTS@b-oPC>6(9|DAmYRgC0>DKwj8?Tju z&9|o*Xiln;%xy^k30henU}={h7779!XKe{&cA-`IzTs^TcLyFj>(+;N7YpBKnjFc$ zmn1dxy=3aKOq&_6v_C7WrKEp?%O^!O(&Sd5yTam+!`gNzFtk5@Sl_66(2P%$?}z@N zQ1l9DQ@A#eV0`VQDAt%%RE_VV-c;~Mf&gflsFJTEH{KTU_~gW~huC}(;8aCVh#C2l zVVVyo84r}~>^MLtPs-e?VO6TIzmSTms^eqJ&04acWW4uoMekrQGlmt-KT%&H8kpI% zq0P3bhX6$F1+anx&>Avv6L^2K@L)8Q%KMegSgK{lBI=pY{pHHXzQ(EpTslPwGqb#o zUuk<*I{zLfNMz+QB02BCE5S_ceMjKaOMnbiSdBxG&L{!K1!Vd{v`Xm^z_v`uS$$;O z@?y-8hqT%7I}*T;TExgwc`6U$J&p?rr9ZM!WIzgt z^9jEG+PVi{=L7Ae8cBnKf=FiDmcECQByK$1Ej)15mrRVb11?QVHOWR|OCVwX-Q;fH zy#aVa*-a8}>RTO_#KbLRtd5V5MKq59G!}Y!>5=MtKJ}8Go;U0KWd3&2^%=mm5Z zCDKq+cjh`(0=-kIZqt_dXC#%!0Ox%{Ju!0rr~All%9QBUd$`B^Hp~Cv{?W=g0${+8 zE@hGw^6Y0o-;MFv_Bj5X0N|f$$BbIt1-Nim6wkaxEhf1@n0dNqPk~XMNGrG9Y#2Zj zmw`5+o~DCV>#*4@$;d~-ezelN5+~2Xw)O}yc|lZE@PNar)m>hp3v1^ZH zZT&5F@X@rT788R7__n`(-&+Gfven^A zoJo}3`iEUOQEr;sWxM^ z039b5V3l?t2U_1A+vC_w`|(EZR#{Z?3n~SS zG{gKa1;P8k{qQ$oN;g+5oyv9O*fW?O|gYN(0JKuAmY)>Z*qpnI{^L>fJvn!VXj zswG}hBuir-7Hz^~31*#$LE9xIR&5t>Mb?j{dn}_2rtx23t#xVLsJRezDg6|k%(qoj zr>3yp)><>R$J0I=f zwKh{m$ha$G1zk?hw@vnwN~T+n`xzIVd(KyumlHvXMyvH%sVK@+ zla@f8#0Uvs33NqH+rwoYt6k-DU)mx+)lGn3y~gktUH9<{!WumL>Lb6qDhrd#uD?p6?=B*0c9F9PBPi&@tCcP1@G!r z6dT?4A|AcZq~RMDwN7GAy@YIYdLVsZVsgr%?>JG!<3MSA8dUb)dp*68{E^6hG5S=h zyIVuiquBVScsNm5_KDtS2wBw+4MmxLkNwA6a_#w0ps3CTjUE=f(3Kn{xcI#3b}&yy zIw}W|9olNFj*{B~Laz;yW{iWfBdCMgk@{QK^yc8E6UfuJn0N&yg9G%2+J9kpXva_=fzK2_X<_$QoF&t@7 zj3{~M(m}$tybN?|+%g|8Rm_()8e0pRm0^@glu6lv-LdgLQzxmULY6A&tx7aK^oSF$V+bsL2s$bSoFBQG2ppRYaZ1LJCVOQ%%xP!BH2<5hUu|^X3e; zhK7dk(W##~#&E_}e|~ks>tZvhzrj_W_GoG5Yi8MBIgxXX369z!ecQev{Rc4v-8Q7~ zSHrENZ}bNVgl#)me2!GD0fPk#>)KhAcQMA+6wAe=Ybc_c&T?yI@H?&LR_JS8sY0z| zm1>FH%3vQYu|Ou`DUFH@4>ZS0iQHGFapWD3wpGb49Il+KbVxI>Tfy%HWw(SbprK0{ zR%|!dsI~iKQZlN-=Ml<|76Vn4VI1&K9Hq0Wrc4m{!;+bvRETy~jFy4_U5$E;FO_XV za{)7zPeNCdme}iJz>?mb8sv*-+FMP76O zLusut!FIo(-8J*A-Y|lq%*zos>$w08wMVla3!biv|DQ$JRtjo|VAO zpDIOU2x@hk*WYl&#)C>(81&FR@*6we+vL5>jEsp0wJrUE%b<&%R~H2hDX}Vt6k-&( zjVegt2Z`RPv2P-o+I$vhlUjNoz$3lDRvHG3nl0Xf)K~k18j8@`VLVh)50Q9?Ek|_t zdO_+)6wIl1G67;K?V$&O6@5CopX?zTv?npfD(b#rxhaGXBDeL;F-w4v=R zz&batHaGTISrQIu9J& zbFqYXI~=ooM?|D^`6<6Xw^mrPMt_R3sDyQIY2$TgX}o5af*qOeog(z3X(jH1_+?VM zAsj~Ah|v&dGoN6OPu3@uW`gDt0VZj~$TzS{>gZKm^`WUPE4?0AxBqlvV9E`b55hsR z;&uD6t;c(Z)L+1Xy+BlE1b2DtJy&d=Oe@`_dc6v+_dR^W|FXZG@t192lA@XE(m(k& z7xm%<5qlnICTge1A&XukQDwWqI0zGD<%8`kEWN>2hGTGRbtaz4Vv<{H0ugl7NDPLk zk~CB{zN8!KBbot=*2(hWi$H@QTGnVi^-Rz}1xxhn{OPT}#le67F929!Vp#sa&}u-c z-By^Ra3aQqZ4~sxb5BWmy?JEVy9SQ@-m%U~1LWnaMN@N^#2O@-{P$R~&|@lHc-#sHJ- z8SWgBwN zQ1^Bqb5pdS2wzgJiF7U!uhLfklWGG#i8^fdo`)EVDc*`r72{^2&=HQqRM8*k5*q?u zgN9v+U$h6L1K4CBbjIba{6C)Sxtx=ZboYoN*>=npM%%)MzOz4w;a#Gzqu-r=Y5Qh% zAMMnG-nCwLAN3SFDqkuzFVX1Ty}=2zHpDw`@~`#8nR1a^OzOBh*4;(kNt_(R=FIMq<-n=IW)mQuIUbRvX1kFA(f#OqyRYydV5|2jr8(^gE z8JOJpND2|M8=AF$-xsyIX`)OJDZfNtD0pjD9N;cN89^iQ^d#R$!;Gf+2^OaXGR}nk z(|(jG2YUWF9z-FhTYJf=%a#HrT4t58etJLb&E2)2sP3ni<&^j(&rEM3{!$K+9m)2R zV8|;6KEgc3_bPI>*(% zOyaO+R%GvyV-IJ^r-PO$>oE;7i$GUZ2NwL`^h5j(qfmmu>AIhq#XL|&&!*ClK4Hmr zP3O1Nzw%vT^+&Els{Sr3)~rv=j&5IS@HA^$dA1Xv!$x|tLY3X7J_aJ_Dsq_bYixvZ zev^+@`j=u=SKWzWQ}(YhUeTZJ)spA`r8;k=5oZWn@=q*FHT z{Oy&}9RBM(*Jvj0$L|WWXDa7(G&~$S0zA3sg|W51ixfD)=Z<@$#xhE$0#Hl@P-_oX zjaSC$p-@b4*0;~T&k&zd-iROx`L5D*xkO5-+2A#UpXtSRN#@e!Q=2NGI;lFx)N^5z zdAk#w4gP{mtTpIVIkLcne6Kk-afl2y2sc0BC_nwRQ5xv)tz6f6_y34G$G|$5wr#gT z!^XCa#?9w1P z`XMGU8!JghYT65}-zlR8I??63cN@_@;Pbl)i-{hHr*bz5%tc8gnP*@RHA4*1Pco4Hu3|Cj+cTPnu+Wq_tW{t9B>WOIAnCj8!JY=SlX%n~q z?6U)%wCFT(ngRRr@AxUntR-}7aFKn^c&^V2jF-C#zR5IGb)ugVa^YI=cc#B1Pl-Td zPzFoE_XWKHlm&GSr!jYzcKe>|1j%$4o&udo`?;mzQ{V_N*J?;#a=#(%R`X*+xsm~H zKVBhr@JYViB_Utk@&6puFC<7o%#>T$Z<`tZU3Zz14AWLWD0fOsmQ=0n!|TnvqgBUX#&2e3PB>xKAsVK!nS=L) zHp=Fn8Zp5EHKfGcuAHp6lx{JBBcY+6 zB}AzSOKpk0JNChpM<{g6$oj#xx(4Do^Ks4Bfu4}h)TBbf z9yF41aij@(5$8S7@p`FChu9>8QYR~BW-%th||MN10#U5 zisB?xdTeYhiNXvQdsmcs{uyCI3j;Dq{nh|MJ5xElumm8!(byK+b(5)SLy6%wIjQ@5 z%9)^2<6E}qYvvvEXQnwS&bY9~3ni?JXN{N0n1U#LI`o#hA_jrEB@`y$5t9lh&9@XqoG6Q@0hJShB=YFxDsAnm>LWtY zj&zKa2C6?T^?~}rVL@0h$n{c*S{x8#hc)l(6zK`EzCi*vDz~++7Yx5D<%B;bLh{z6 z_@?-CA$_nu`j3xRyR5M1P&(5UDn<48iX8PI0h=@_cW{%K2dAWa(&EQTop%Sy7r69h zGeXv~n?c?2;PLL?z_|#xjyTMb+97@l+6u=YaT7Cj=Uh=~d}C2rP|Bb?k>e5giN7@< zBzGhH@}NqW)s8d5&(#gfRgj@t%)WBiM2RWzc%xKI82!9Yo){@{A6drQ_Ouz))oR%* zc7>ek;T=uJqfmc)xzdW8&`y(0Gaf513oxNb3;!6r~CiOZoR++uzQv?oE0e+nM$6&de( z!-LjngEeb0GSKi&p*7HnnjUdxd51YA2v0M@mu1=P-h>WA2r@`(9U6>~iKzWC!d$sl z2aDbIU73V|(+x*yTtwFj=p%H5gC86JE>22E)E~#pj|;PgGMg^}H5hwA{5;xhIFXBs zU!WOeQ3Wh419l$ zo~R|By1pDSNND$f-Jw}eCURem*wIrA>mBOYZjlog8h0`q8+g#$*J6~-off@pYh`~-=!K&%r5w%eFymv zs-YcgBw#Kw(#Uqi^c0f=^#4$*~fa?aoFr=E6K{HAPA$NsQbdyMSq1Mcx*@tESZ z4-OK~a!9&4tgs!ROJ{__yIjvTH2%uW2G_tbmQBLlq((7e z0# z=f0-y^|5t{q_`L9o%w+Ch+DEPwT>AMUQq5f1^IBn?I$=~7cTSjH;jbI=u`fa(+imO z^;Y;=Zih<1*uXX>zz&d8&S#OF{qeG-pT%9r@#PMAe=7W0+E>_E1Q`co&(!Xeo;X$4wh2;kb<2$@4 zg~iy#o+Z(tnWK}i@u6!aRQE0EQ2DLLsM+^9;f4gQsDQu& z2KzQHKCM&WZQ>^KduYF-@UV|+Xn8_i$T~Hj`afCy3+XJ8@Gy144>FaeBiuDAhUyEp zJ}qNuBmjPtiA3~pO!S(ZtY)5X-mflbF-6U9#@xe1MxFt`kso8?>iiUa&(=FpX)$Yh zFS0w3wvS`6?WP2?26OI_n&_Jqpq`+T+jf4;4GlC)OG-jBv+NHU*v_37M8B}P-ZLJd zZG4T-SE6uzcXDVNv4qTgMw2f;`^+uj&fB+vxU>-N~Cu22RU&%F? zLU(SeG#buR!fyCQ#7GK74V5^TZ=v;;?|re@$O}T{6%-b3ESecO$aqXN=o6VX)mH40 ztR?x)(}&lR5z`6XA?;7{aOt27!{#wxJ`r1Q9jQ<>cZn*#rSNqQl@MI^9ierUY*LN6&Pi-u_~ z0MG9N4S;$OG{tmC42H<8yc*7?DMMslV0I7$q&3$p2i4@}MjTBurFpG!L7!tS&R(<} z?-qg(RYkc+i(CjjjM?E+{E#T6Jzw(qk)iKnzcGj#pOcf`1%L_9GO&I*C7-qyT>m!M za;cPGklg0({q1V7Zxl1ttXLKU=OD4DoM1I|0)tzFxH<>hrU^g8HbsI zV)*?XGeHdvC#-Tz1gX`K$16C=UGiH`DA@{q^3~@snJ&Y(PkS+^R==5DdO5Vw>H{;J zx86BKbpCl^_Ig9JhQ;Z59D`&xFv&q6;mf3%4qklgUP&D(Gu2@lytf*h^OsUg0;Ti zgu#W$w{y$HC&=oKTCwoF`y3=!T|RLol;=wVeq%B2?^3FKgvmUIZZsfmm3UTkA!g;1 z&{aB&c89*%Q^%oU1aFXW8hi}wENGN zz(e@^>)Fr+Wyjr#jz6Wmbwg7cIMT%AaN?|~+lc`Vz)=KT1jTijuPfo78RL{P0S|!4 z_c;GA1@%mFBGllyd0be47yzil@Hnwy z+ocf?1LQU^0<089Mc2Ui26DbE)p+KiGfOjrpSSI#K9hgU5|hTZ)srL<8c~$cqE~=h zG*Ir5+PYcEdPS-n|10pIfK>&=&6!~@QR}00+79VFc7~M7D}m%N2=Cm)K2E#`GIaAN zTk6JFSYx?twLAsf5>j4RCSzn{C2=eiDN{3J601PfGwlv=86T}6Wo$O=MSj_YB8+ri zP5R^F#$Vm`2f^tL=70e;#+}D(mTgjSDqGHHg12@T?gH{y&HP`6N9YTLOW6*zUSxu~ zb%rsfX?14d$57uSjHfXwGXoc5xF?SHnYbznnO5vUhzS#=3T-=UVRaaIOwq~eU2+FM z=}~LepZ^S|2u_IRsUa~FO5x#PQMA>PalRcTN|+4X+%MPtfJ%99#Y)i?Dq+Y*+GIe1 z^L;~|@X?P@O|RwV<&_oBkZOJgkU+@DsyNOI1x;9go}^OX$jXgnRHxGm-rCF#POKIf zD*Zu!i@|1B!~BNIE`VyK% zF4fFA>|5KZAn`B?J2h&Qr-`}}djz@3M@FSCFFIDF>y1iXRU^_lZ>PPCAkSS=rw=5v z@^eK$JRRNm&j(YF~kLL!=!x?h8a3pXCINtL!}RXbaC&Xyrx16@Z53iAo**|S80!c- zCffvTwu0ci?0ro0gkDFk*@>-6!b8*`owqe3^BshHeZX+di0Ui|x!cz@%=0YUMCuHWjM!tD$GVc{+QUAhZ^N%lT$> z)){_StkS`%D-wo342INW(wPu5pS#*#!2zG|W{nOH>L)WH@ zSIJvn>kay?3!JI^HXIAfNwn#Hqp1PJ^pr(BsD3z^pB9$7dGQg#5e_2GWmF+&f)k)b z_)w|EI?+ox*>CB$h8P3#3%9r4VYFD3mYU1ry*gXsO(*Z>jL8X0Kl7$KbM-8${VVz| z@w6U-x< zx=TbXc`ynA-oq^!0Xdw4ME44Ow}2>T1{jL^u1_Z}q6v9j#@0}8&$k)v_?n@sV~{-n z!A(_SIpibk8wDvbbmfXd?2=S)t2|PjN(KRp3RF#7!P3}fmQrJub$sxqSD`*f zQai(Hvtz|ZF-dtNQBwJ54}xksI1t*H#1#?Yos7Ju$|s=2zRqz`TGTac$gl9#CCY?*@0Y+fg2#_{9C+-_32Ppo zb7Zl**HO_ClGM}m0u=PIXGR=HQb50_k>H&@@73Ct{a9Y6Y*yw3_(p9Y*3)ZC*5CjE zvqzJtDo+yP=o$I=GK$i?50cm&4Y5V@2E)bphVZPp%-PBxz=dh{yRh~DkQq3b{)=*> z<8{aEWCSLR{K&W6K=4cqJEWFhdtC|NO#!BZX5D0X_^ck#E_Tb`C56NGOjqfpSISo= z=Bg#&r@MBArI=6GTB%Z7rnwm3&0GQ*qQ8mwNl0OKwqIGSJ5RD;;cVdZ311F4v&f4` zFT%n{^Q|7=n@MNQQC1lA-2^?i8Xw_fZS0ek+*9PT61c8Agn~4NFeky)i5I;$Rgw1J z_>fngwNMPyO(`57lUj?AdK7;~T|^0856tm*26BxI5>R3@w{V$##W>H5Mobm(>rViK zkL1SSX|@>-Qj$o+{#5Q#DyW>IsU~i!US(n@F>1PEqu0Mqh5c8hj?hWrtSr8paS{URQxweC zVfDUjcFpzl!oem_ooOHIgnFfdj18(fvyVx+Z?E?FWP$y zu3wjxtI5)f-g1vKql@jTzj3T_rCy`H{I zY|Rgy)~k&$)d|_mQ)1Sll(M`x)*>EU z^~ny_lTag??1YRcSv?@?w!52du1nz5VLfpR39%=mKJZ9P^bw}-4~u+XEy9SQX~`}V z-2)axO2_Xr6Dw_IjB3d*D1#Dr;*#4Cg;DQvqsx2zD)7i}W@}5DxpbyY?{i;xI=Vc~ z^Qm=(X8n6$noe-|Bn z!rU*U6yvCk^4TqQAy&T-(~gWvpqLKFo*D5MhxM__exW5i zAVqaCO!&^u@aw{kuaHPBp&oc&pzC1xc~j?^b5S zA$xJ9@uPFjm=qV3t0953*NgQfNYp2DiMyMq96KKkt^`*$YD*wt15Qfk<7W7-bv>#u z7&cj)5LSLvb5hqhl?`=6QR8fi?*vVfu*|BUHgpm`7z8wSoZy2?u?f$nC!$tLE3=<2=cIe zHg{=%sm#V6(evg^>++DU&#HqiR4wZA z$k-(C;vC|yqdkxAVk~iv6{EA;D@BJri?RqZ%1K`S{-&fE`xYM*T15ju% zAgxG6j+OtYI8hNxNnCQ_lenjJ-92#V=^sqH?O;9s3l#uOrUJi1YNdX$SxS%m<9jnk z`SgD2t3Zwo{u@?7e}Bc=YIrkYYHw9Hwq-uG*ZOflCnQobZ;A{~Q@cY++n|1%jv`Wr ztjKPgJwjchzNtEf&Vmrn3!e!HWBKc;G;;(9J7epSrkmcQN-Gl@94!=gEz0J4iV&sbff|Xt`m1p zE&Z5NS<8;;yKYbDBgSMjgtmZsp6d6ANH+u-ew(az+R<54>*i(^_pTX%{F+3^w_c6q zK}zDKP$|5Z9AXU#FgYyJkM5x07iSo(9+{-qZAE%qcS0;LFQ+=bc+?PY-#zJh0>HuJ zbKiNw7_IDcF?eKnOk&?SbvD|8WAn3Iy&V`N_LeKz%3)ZLk`A{F`PL;{P3O_p*0JIv zRs&I`!;Q3$ET0l*Z%H(ct9A)UK0g#iA@oy%qr`min)qFA1MG!kfh>alMkY z(PopaOyRIc;@cXce-!{ixL+LRX77~*Na0rS;PfmiM(R(&fBuAcCnQ_l+nDR9H-Luz zOiTp9EhPw{MJaUe%n_4LV@EX%ZU79biU^YanSj`(p;B@9k-*x;a3sEm+%+RH$=|6D}cUr{in6;0dU zm2D``ou`QJ>i&KRG$MPosAIPi!*g+j{#WQZB*)PdF{zT>Yl;^{7?U9ro0~98Gl-#$ z)(bfP?zj;{oJuy59UaLZYkYiA085^RjZtE}DlR6k3J2wOCaA6DHqi>j6hLR;kG8Ha zUKyKoIUsV#SNL-CV=|~$2n*Ah0C+VuWB)j~mC(`PbfHX;OK+M5K9hZ3kfx~nd+IYG z1+vFXT&pbseJIS|^#~HQLq!r=Tnp;p@=^aoOist?=F3dZx_=OcysKHVmGw~&LHfFP z<(QTF4T>Y?*=#LcQ(scnLYBig!wNgXAK1L4*5HFQWfEWERbY*~R)Np+xG!`*e1hzeg zkwqGj4V5_Tq9?UP`(pKIdE#o}?>hVlQRENT|w^|R`^6aGtJJ%!7$u}2w835CPs z`$dkAFZaw_mGt95W&U@l^CY%h^@ z%O*`5F>6gz3{4GA{*qB$1g@XRqWn;WN;V!|oI6nkPew5g>Gaj^7yIFSSRUn?tf?bQ z%ji@d3&1qctypGP(JIKTYDbyTyTjP$ZYc0K{sXMrRdBOBNsJgc>3qzig*ie-b;X}F z%UbTI29b&X?gHM_zl-2zry2GBc3UyFde2e+`%J}l^tFUPI2N(X-=f0vJQ(jqjk42l1cj)l&rKLWbqLKo|t9k2YE*f98m z>3`>q-M0OqYC-NGEk(|w6B7do9r%O zT6Wq=vvJ5t2Mg+#{2!I>fxdzmLj$8VQ|cr(PC)G}T#n2aJ-@G96{G0f=pQS$8nXE& zwph1L&hQ$amkrucM@BOiEwiH%LcFv$+N9`-(l~CUy>9ngO0q39xYv8mp);tm#Wi&F zq?jhZkY21fmR5x3Gz-))J`III{CaZDV&88Jl!W?wMEsEcuFf6tHoD)$V;2}p)tw34 zRCj_+((4cQs^UhH77CRj!>5p-PdZ-JI6k;q?zVkTN5?eR6{O-(CDXffE6 zc;`wg56oU@`I-M`ASy-C7f<$7o;g7!*V0mc2@+5yk>vW%4QoO98QB!18)*phu--UN z>Ic}WCNzc6>qJtATM5}9=r6xv5#&7Jb@M+^13M1I>gRPONwzWW?Q>{!mfZID4kfnK zNOk~10(p*t+J_8!s|WCxz6Hkf9X8QV0ud7tm%YNnfuPyh216sz+&S-l|Ji)_sxuJ8 zU#@e%HGcz1RIDH6FS|@ncZN)nccI{nr%#9ffN|1G;-N1dh<)x1xX*}p&Fid#2n-0V zP?pJh{;(YKG2>cO>BMeoga&j5wP^}bOWduFrRBIW4aI%G?zk5inr%ha)M(HfDs@27 zkKxjZ^RP*!OT8d5tf~rR$a7+o+i;f0miYIaw2SvvSZx%w@Iasa`c;G{IK5ay8@dry zIUbmVNsC;;A}|>BE0`wyv>I?pcOxD)f0iyhPi zf6gYz&jZRWdhkl7)Cr=v1UIfG(3@AU)*21iUv@nLQgm#Uv@Z4Tk0-ltZXBBgw?VY{ z(3Zz^scgev%goc`GuIw6jCyjk9G4Vu+SoolKwI8!pghVCt9T**58Vwv)UkT|j>iVt zGQ5QuMUyh+)G_bQ?`AX{@&k1pmMq0z+mMFL#N5J|KSEJds>CIjECduWWlyHXBBi zN1Nz-KU>`s?a*EP4%Qas%Xw4MSkJ7z&*D_MzL(_?o?q2t(<-2WhsEQD;&>Cg^YH66 zxhT3sUAS#_(bPN2N@Al7LQmKbwrCLxUS1qmrgCGWnzTaq8%$qlgv<^;L2(G71bID% z@((n=jU~258t3!t!8ZJJ*T*bV-hU&4y__IKx)sC5=BwI)1X?1izBlzP5#2CQj!9p4 z{iWwspzoour%xf&H*8D)%9Z!-&(|cAv(M6Hwcs)?Z^7MZGkvHm25PodhAO9+RIzi* z>wYZ@AO81y!*9gN67Api9b1Z-(()erQpph7=Ue4>L3Hovu&kYs`>@FhFZVxaxHHslAV~cA#{9 zrFUirj>;Hdc+3g+bTSRg+h?tFs?jl7<99s>;hnRtea7C|{pz0l$?fMa&!A()`o#?? zhwy=8T`qPwx+1f0q9Mc~7~H(asKGx`ww&+4{WSihw4fDC+B&!S&N#$xx_quD{u?rp zz`Dc*byIA`C!WhWA13Bpl)UD}(6)wPWMkE=MNMZ_ldsq!91S5oLbnaj1lXzEuz>Dk zC8L$xr3tOvk##k(-r^Ty6KYpak++*F>MROl)F77{KQ^n<(Py5^ZBSMsuA-8-ThHS) zJu{=>%mmUv)tZhaAiTP-;&xscBf#uP%=mu((7uD*C+Yx$Dw99*uBcWPPG9)(n`5c` zCr%8>m5&hra&nuR9;^;WOMD(KI+K#tMr+8?E(@?aVIfCEI4bd}y<$kYx(OD=BQr*) zCnG{DE_l~VJFE9t&PT-{XiKHKodm_Wp;TH(;&p?K@P9!4u^m(T^Q2}vIX%4wMaaP0 zXuh|rf!5RN4&G}=ZZ^thM~7_z0nX!-otrK<@`0G1`2hHeD(yeZdygn4iPuxW8v9ZQ zsN|mU5n*Y=iF=7H605`CPh2*K0I(}-H7AYN2;KO%))@7u;W*BQxCv&rRa4RUV7f>; zb8{54bp)+UBq;_tnuimQo(>AK-GAN@LA~E$!iae23#y&BC(rRrKVB{luU^wXRGW~u z);{dY3*8VZUq0<=bP8c_>qG`PH8!`+lv)^=5>8 zW;|Mjm=?5?=N_*h>v=xFB_Gwa{;OLFi;acqpp3=i3aHX)34lv-$^{{QSiVhca*^xM zF7%5JP##hNza0vc+R`b)ecoJubyYorGb~q7fnysMS5PZTYt86o(EjbPapd_ss8#t> zhe+FR6+1R3{m)T#N;I~W&#hRyPS?#j2Q@8Lzngd8V%}qxZs`8o)(W7LkBjA$wY*a= zzK3zyUsZ^?JHFGh-5h&Z!MMq!`t-WAcK}cpPfz|3blYZC+s;&&aK=n!+!P$DZu)^? z06GY`o(9Slj34Zm;AvFN6#{HAl)GR%W@czI_vbBCR8*f*k=jA@u)pM|dn!0z-<{s- z(TNbCDBp?3CY+}pDuVLl3eRh591@{F(_T)e*U?uSjG0TSgQ!!pn;$a^9Jpuf^|tYT z0Vx73)tI`CgeBLS46;%%rDPljoHeL0x+@;)((Vh~t6M&J?)3ltDv7^&(ee!}PvnP& zoAZb7wXz32#b8!VeUp=JJgKDs+x2%hj?~?j(~DlviKJ9=VS&6A2o#vn3farce_A+O zy2>pKUe;3z-8vr=IIfI7fJaN|l(yw36qNwtNN5AD1~>Z?U+y|ElS1L%@=}CiYaVjF zrcR=5-;6MgoFY$u;%#76Yan8Co2Jzx@N=GHt0jE58#A|_)+v!@I?wylq)Y8L^duHo zb7oIq#zsz6P9>P#hLh~hW!b!JwDe=UXh9`F6Q7mee>P-9q>!Z*Z(w~n3?t%v0SeNX zhn}W2LtS6r3|f>eyuoOX0CbO?Int$9yfZ*0W&ceBJ`>ND%xx zSx%Fw2_fPc@S0i68IV0OH=5oaN9brNw!>@#mqSNK=_P5=okI{exEWX9^|gBZ`YI#^ zKHi+zG`iFkY{$NzI8ge?wM{+HE>U2z8KidA(^EvN*m9o4nq%Pi`I~s=|FJTC=R00=X^j|4M`^seCJ?>GC9G^3!hc>{ zVpra5V;mE+Ewa&gRlt$e|M$cS)}SB>xxjXMjH~&OnAB3>{yKpM-qgEPw0K2w)#FdVciwT;H`I z(rB=kEO5GQf9v-eU?O&h?GG%t$|r{sE3?L4h&!GCqKRWzLnZoNj6NF@e-y!~71t#P zsQ9^s;i%CJ%bYVRgI4o^=wWX{d|(N>sXG~G{`;;S5FToAb)IECUhXbI&o4}mJ9SMh zD&Mm**V=1)0cg-!!+y7s4zt~aZT_tXJ12!TEs*D)-#b?a({{JV+uxt|F?$5D_5(dm z`j^&jlDRfh5B){_AhqNX+OVl%s&nXc@Y$+IYwbr7{{$ui9qSD-EVtCEgaqZj#jstD zq=ntiD#9#}Q-6s9>NRQ73yOTTZrZQaNX{#w!(0s;yv#1R*hYRTF3M@#(hB41nVa)D zSIMSMwk3aw6_xI~fgw88@!0*sfc;mlRAX>$waD2dm&< zh2qiuAmuF&{b-f~o5|kLa_c$nnLsV3QJ+#HP6CQ@5L^78dnEcVmc^o-o0h*t`v~~) zoI84gQ=}cSzr4-~@S3cBbACl6e(qaD!?oct6ZtPkj`7n;Le?1oX$7x9E|bI{y*L~O zouH;B)_Z`RQW+vA6#5e1o|jq{&=6!QNdN^Ivw0>A5%`}PzxU>xQ@b97vryq}j(hS~1-%`LWIi5`db;9!7q|FwFO zK|ve=R1^JM3hRt}iTDiFOOI-AfLkjEsnuB3YrByjtq&zMMf0pOu6)sWH1ghSPocBwg|!8Z z-Wsu<*%nsAR&wZ1$Y$;e#bRIQJ;V(`{x@zQT4p;hG?az1LjR+|6nFpk?F zb|Fk5$gL9kfZ}ij_krYjIW4k6Y_Mt@jYDQRhi|NgD|`}c1@gTsS^azAqnb8GsF($ZcKlT%d+AH$OG z`s|_8p(Ycpa)C-d z$5CC$3GQ;{=#NEBL>oo2&M2Qoz`Tt2&G!xReOxO+8E-c0;Fa3fr95t0D1X$EhdY!# zw||p~BXBT2bvU}#R^Gp!m>?smuMC`1730g%*eECgATLg0Zf@;xCIs7q;gz+Hc}>4$ zRZL@rMFhO*6$KF5txN!tMW?E&UtR*^lfjE)1blQ~*snRz)F27iX#YS3-p0y&={GkC zTq4V*N~XVjXn7JCYfrKA;XC0iH+_U_mdsrIG?%SunZi}K6&7us4*9M z#|k*4A55esPB8tL^u1NZ(7%*WH09wZs2MYkwiZmw;jc`jQE=r2K$yJHLAb^vQzR`> z%vo4~#3@|7;M!w)|CPq7uOCD^>wjyb2gZkC`c{z(C+pi`fD{&(7875d^-!D2uxhZqiKN>_O zPgvb6x9FQMKd_5qcnO!LJ3oIZ`Egl`;qcQgt9WUISJ2>K zB9rDi$&QtPIJJWH5jl<73>Jh4{Y@@3Y|(SKZbe008PEUfY1E`cB~*#<6hod#k#L5Fd@!ykznfhes>QnIcLGE7H2~GY`9uAO1|Ip9op+W{c{sd^ufRctW2o zv5`wGH5%7mj{c%%L`Sqy>oiu-p`_P_w3LZm;bVwZG!=0^h4G|!E;zQ-->76y17?eC z3UWo-HlDX8Hfb?4HQjrhUYVWE(@oFT1I~cg%G^w`eH7yvdc2*DOCaH+$!JZw?-!>! zdUNOg3hs^?{+a>y+SZ6uPeb^jdCkkeb0fy}3~p-u-*CNHnJ+*2k|xd_BT? z&5aBKvg4K2n^~W<&O~G1EJ@}Z??pKEKp#wZ*9qiN)p}f<+0JTT>I;F9`(ZL^S1#dh zgPpTlhsnk?S9`W4y7GLRcU>&#OImeOlu?rP(myeR3Db?dtf~?IzP6+SpN>9w7U}MBo6+xXi z!lN;oyoHk_o&>#w7$`Wlz-in~4^ra+6l7GK&_IdD1!q|UEZdVkrbT0M7CcMm2@-gNy=Ybc{WKO_n82URfiA6hGSpMBZK}+Pc&jmd8ZW`erc5#`$?!Y*VXw zr#P=o2-ey^XKuT%<5RiAUD=g}yOL3Ab3KU7L0lPg$AQ-Nt1kclox=m+VNL8L8>ymQ zyUdIeJi)a)qfKO4EDFijCTM*!bSbIT)#~ z_G2Jn+j9=T*7QOYPAlO29&Jw{pnPcjLzAjEw_FU1n#)?mgsNEowB6DjFM3zx@zDll zqm6z_Q_{f%oora7be5}waV!75aMbMCj~cIsj8>~6>U6qtAM3wxLHD@@hB=0Ocd!QJ zG_2S*ii3-5R2;B|*L!(*7-~3PG&rO8{VW3>?yE#YHOywWN9V)!L}Pi>qDJ%bjzs|@ zf#ZT^1|6EjLV>y~dy6I#ZoHs+o%t_v#G&$NS|)C1Uh|mFu-?Fb$_q9(oeU9Tz zF1yRQMlLr+G{F)Y)kBG|^+ll0&co+Ff_sd|Y5Ml}+|v%td^6cR8t6Ee)kIdiVv9yL z);LkB6yYYrXM59)94fPXWfakyex4!=SH>n>N>@cetI z`E-`nmfRGvInpzp@hCi4MQTIKiQTwb&gpJZBn$1{gN z_)qHv`g|YWlDp3V_7k%bmk1xc@u-p^*1dBX+V)U*pSA;AL56ak{H)>3 z(arZG(Zgth{bxa6PhV2BRjpS(=L(H2i;kK2DtcC)d$}&|x7cjy7<_7Gx{a7Xm1yaT zwti7!`EWa13Gb@^r^N{>HHqa(1Vl}cUpoT7; zq6IbBT)`vuWRFBz{f%j?E;I*G24P=$7D;J&;9RD{IWttUC!V{`$_JiC9t7q!QZRj- zfHH1w$Lv^5l&NBl7mRDd+o}+)!jPCaj8s&Dva*w9?JnMdm|t*&i?d;}Mh%GD@m` zLOBFp;y+#z5viihgezKRvK4dV_pokrM26akoB)W%ArYa1J-=suT#Ajj0-O!RT0g{Wz z^_-@pYz|b#avA-fp^@CjyH}Z z&BaoAPf!ZqM)?6D0Bh=Nd{6;uQaiHYuTVmGi2B{eJAAJLv0O@LyfvUQ(Zug*6&Cc} z?6`cc7kIw0kzBFz?c4ktL$AodHc(8xK4)1(iK!{zbg-<{5AUbyvdP2iXetIVPF7r@ zqL|&5mO6SI5a8wg#^8cnp$XfHOgV9F{!T?QDLC=W(!f$Cp7)h4Dcxt~qQ_X_8e^UH z!ACYc^Uq3t`=6RsV=;9bQlG9}%a)kbKu)b%e2mP~85!Sgr!|`vqp<|?zaEn7{2QRY zN2Ngz0bbAl`jju2{TAxlg!nEd-X={<*NCm-e9jG#AtTVEJ9`DseL zTlv=Klb;lhmnLwlj5jH%Q9-wKsVP_ThlqmxOJ7ozm&}W}SA*wQX=xdx{{2WQU+gY9 z_wmlMBX?wDfU#lG_U_X%gsRne-1n8x*hkgv*xOW+VS)UT)Y;?RuVkZM_u4dq3>9oV zU#s*a=-WDYP_E9~J@#Z`Doiy#wtx>Dye~(Ewwa`<6t5sw8-n~O-G7(I3!y*i+=E^k z57dEE1l%<3V&bqtB@hS%2~nN6qEgo5BTEb-k*{}aFK2DhQVvOZ>F^Gtup-AyiVZ*d zx<2#?EIk~y#d;5D znbjg9b7YePf$l|SAh(RrfuL83T}+L4oagBZ#;hc7ArP z2;^+RwQQ?O>PivA;w;wcxXd>(dFAa9`o2*}((pXCvkIX`?Preq}xU$M?pF*g&!HzYC4I>gBh3@qUe7;cSX)&#X>Kt zd4CQYl-BRCwEsvtigq%*GO8$?X9Z!~wvVCK1R(r)l2}6E-CR@O^1EB}4R0**g{qnf z2V8C7$ReQpyR%rN^9-~{@di0-mVY;5r?HySAnX^J7(5V|9^e<~njM#0FRY#$^sib6 z7mWoVeHen|tXPH0(?UNc?T@zbw8B_bx!&=U;<-XP`iCx9UxLl=4|_tJL*a zJoW}w<57LF8y{Ujk*3Yo1+0jjBpt@kay?FM`2AS-c}m!0c9s*WFSnp!m2n+dCG(c{ z^`6idsee8Jw0}48Y>i$DKCv-!aj-mJ=TVKc^rDi*3M0hyx6c?xf32^pTLG}0_lr6u zS=FjUl%j9qjYb0gOzfsdczvmEC;OBw(5;RfoItv=H&a;DoC*ajITQ%tR;_|u8+%g1tVuO6n)nQDh%vt(p zGQ(kLw}PmPoW3)!&gAS4XGleH{apt{yL*!!b_ zS}vjlboGi45(ZWO!3kd!=JsMm1$H_=cn-#xjJ~I}KHrA@x1Br-AdY(F`Gh9@Wi~`l zR$m^TvVu#Liv@W|cKq!FdLk9EIa`c~DR}-QAR8vi?wxp6(Oq&xnr%3{+(~v{wqtIx-GJ3iekh~qeAt;in#SAvV5hO_nzvrqZgByqq;aO>0o=@VHHXsdFo(@^P( z%8B`+6KNI|l0aNLdKj+c{f(gl`4rhjhu1rltFQe!O`r0+Q@Ul%GxzV*#N!wBUWkMi zzaGGmw60-B{QlbO7%!kyjXLPj;(W=f7zH5s6%PKgEFDV?KsuO+;Qa^2cdBL5-r)m$ zJH9D&2w%Q@F-_9S&CTtQB+W~f?aP5hyTZco-%9*umb9mnF>Q zKjR!y>@_jz#!i7B(q~4P-j zIXo-=W1EhhDwEE#MUQr<0N`tXm9Ct8JmOu|wJj_yyAKx|=9jo_*5QhjsOctPggI{5 zJ-GrI&xj#@Iw)W`%n$l!e_s$}Q{8BG@%u?wnRo)E4&)7+wSJf;GyajUn&CkEyM zg{I~CLA431J*N8{bnKu=@rjiqH|uz5YvaNsjUGj(rI>->Up9CT><$*J%R>Oz(*`h8 zJ-ti{+{E?nu1*|}n?e|z`Wc9qRiGG(`z(`2aZu&&tSWi;PVtj!Ynq>lg56I7B|(~f z=7Ee!T2WKeS{%R4I{h9yGb;;8`tUZlZu_m3gY`p!K{Sg_>=K~~&ylCC&hvGN)P!&z z{t{t^KXsEiv~b1PgMiV!M}T8nxxs;+LORhK@Pu?)&3GFd8w^fJMH(SwyQ zgy`#F*Wy!df!Tidqj8n0zP^55(f!(?-stG42SEOoMPnKq zlnR#oALsQJa5RI^LP)D=tVT!@l9DF?R)vIv1CvxN)NV|{;SZ+jN#^veCkeEB;dOvl zE=%P#2a~zcN*hmKxSfBm(Kz3qE5QlEsJk${TeEWejugFQ0kxZCQC3~sPyb_DN1%@lp{$n$ zC&K7YvcG`)eY_w;J`V&|CU^ez>(}|3Ds-4Gz-z=-!y-x=8heupe=zyKyy)^fU;_2B z#*=Q`69C6n_!-z@p1^yhnE8BnKL76mW=E+rt$RFl_`T8txX2s>@oN?U%0o_yX&#!9T+Qq;--3juZxL8{HY;wPL-+ zdVAn;Y8W6+MqxUTz zA4kLX?4v_*^`tJqIQ2rU2yV)F9%?q~B{^AlB6AAV9E&aa?)%C`W5hNivhLJRbR8r@ z&m2^7%VP*0e+GGpz6if;Nn&LE9W6nGkrOdUV%2PRVQG2y>B}E|%g)vTxUHz@=j89lljppAQFIv3l!avuhoxvhosCCuJ@1ScUY{K&Ob0rD?J|6tM zI_Kf@3X9%fg%U_Dch-PmKY&YffZl4w{TbjDs1O8(+Gk5kOJ(y1Pp>%#21(wS;xsv> z&Wl@F&&xTJ#DP%YSu8uMx~sQ14-}1a%ovFvy1xdi1y18GMaNf#|9mNCrghgSzuDp?vQaXhPqvdw-NLEAR zWhfyohk3k&yPOtiYtmNRf?~YjJ<_pzVg3shbiL}#e3&(3XbMiZhvd~h7AnjAm$n#F zkx-)e?jP*K`F?vDA^>3@_GB7@j!(G_pd>2c-*k66pdF;*>iX7k%0N`qS7F4ne8)=8 zDWdQ+F2|}W@U*)A%|>Kn#|)0yPrV~;;ZaBr;3Oyy^qy^+9Eqbd`cw3H+E|w;;n?6c zI_`9LAb{-`>7%9l;j~Bp27p_eR&B(9Gy}53T2|lf5-^R^K3G!@>1Hm$9_>c8a`#Kg ze5Lib32R!$LSQ{G;-m=TH2Ej6hw~GNYgi$7g8HP(S`R1^_YMwr0-X$#4LdtKrd`?2 zW6qn#!@7fCd_^fEHXF67fA4{(vnCY{`9~C5N7~&wB{r)eqTxtt@j`Sm_D@FlYlOqv zHKfk&6mvNn9;yFz4x^+`VM2S)b@o5$Z{@92Xo031x(K8Ss^-+eMs<2|ZxEiW>$g%{i=VtJ#?}t(Kq04|iD=snuf(f3 zsNF=1$`hOM#$u<9U z)^>d0&rE~A1G0ku*^Ut;xPLss*ZhBG2Re}eSPe}20QJAMfgoO%0?eNE#QXIDL}`t)RLkYe6M(6i6iX`_@h<~h?F>(S0NJKOOkGq^{b?} zfS}tgPnNT@w4u=V4V+`h8A8zkoHfgV9--ssk{4tkef=~*%=;9NyTSdV&$64q#h3(A zo_&X|e%2;maG8!2&?sHQicQ_W**&&U0PphUQrM8}pODE0z$_^Soazjq|1A3r@G)R6> z&9rE-n9jM~4P@^SGnSkhW94S@AMTqbNVB4j+saY#@+`NH;z-W0o=hk?2C7rgL21e1 zQmZm{90dx;?uxDjkC1>?1li(|iTuT(GR78m1Fc>{rRMQi%3H#tXH81XpC40VP<~r< zIwPFFPZ1;4Wryto=NkfA+kt2w+Q1?$PNdN8$Ah=NL2H5$t44wdDsAm1kD;fkE>ib+ z2gcIRU*ORDf4gJ|eF;r@y6&JTPc{zeBKxUIN9a8UN9;#0dM&;T>sJwqem@4X)Gd#q zVsgiIMNB>5gH}7*1hWD)d215n+T!sD(of|qXo|aUR%tGNc9j#yqhtE##A0GoTN|51 zbzL(_1;KeocqiJfxUm^rM}xzT_#_?Z01C9AJ20bM~Z3{Ug8RUf=jTDP`&%M=?ELM(`O|a zna^>89giaQlOd+p$kCgJhFS93*x{Zn1IvdSw8!Wzl+T+Tg0WE;XX>hRhBUaptzkI; zO6I}gwDWa;@-Up|M^tg76I9(%(&6uLN;qx$*Epi9o+7Q&<2dB?B*8b;++gvmsa_~L zGVAh+Ow6Hm-9{2(b@*V6y6koN!k#LLy!gp06w&8`jrLcK>FNPx@5#uNI~HXaBw}p} zPidEPC#pmE*hXPN6e8M`@NGxp!6zIDohTBc-chxMJ(!6gDERiD^j$x^iR~KCI;=w$ z;%YR8{I*UeD!JH8A0uj+!)0%FMr)&r++EDk1FHB@MO_v_WTM(|%y(R+h?r^!mQo?2 z(Bw!mWDs5EDtYANjk%HH>nA?;!DR>0_V{LAxmcwg|IeRi$ zX4iq$M}Izgs-V}J z?w720yDJ7aDR3gK8^vYE{=7F3qzNc}wo#zhwr<>5%y-zo?izZc99`ZQJFsS@_nnk; zOOKnb$QKHh5oftuDYqR40abjm%+Z={OAqf>dA;h>5Ci(`<)*DmNoaFu`31ujSLnvx z2wB@sJmtukd4&#^$_Rxobe@Teimc}u$ycT{_2~V?MQOn}9}KnL>bR+8ICyFYULMY# zt3iMIPYdyM2nv>sTNtRJ=03QDn;$T1iER2*qr0U3MMldJP@M)l5j7iw9||J9hkLcP zY>E?@cqwWp&~$5Xdf0~okvuu;PG)Qzg6RbCCeS61q{;TMd%hVEVtp)uF{DL72t%M! zqVp^g#_IO2v|j^I+C4G&WS8q~sCabUGpFcMg)}4CXI5|Kux%i!Kbc!Q2dRe+hyBDX z`Pp-9hN*yw>WnqcUheF`Fyz-I3o%rY)%_iB(?XU(mGxr7OdH{K18PT~L{FG2S?kPP z?}^?*8oine{lcRw*nC#Jwth5dH`?V;PXG1#Eh{Zg?NBkUSTJEGMjW1B&omo>7pPU@ zcQzGbgn|f@Wu%$U$lRe2f%c=-H5qs_T4A(72(Qe(SBKa}YPkP4l-4gvL2uF$(+-!~ z(VeyH%K=5<=z&T3@+2Z1$IMXoG!Z76OHqe|A^BKV#$%%K4`=j+5rK1;2Nv*g8GnUb zj|Q3X%>9?=^f20OaUTRX_f{py4QDW%q;1eu0`_SLf_e@m*7j`J39A>H9KIog$i?#F z8Jnx!@u_9ctb>0%C?nNxnYp=01%fqQ#e%SBMEXKXb3IqP3i`VGzXt0yU)9%IFcy-_ zz4qq|#uYx44C0w?Tliv07@^$|v^wJ^8pJpwk;iTMUQeh0#GX@O5a(#k*1`x>{wEJ~ zYz&FR%N~}R;U{%Cw-vj#bgf`*shTgei9-~u%{j8q6__<;^Ax7;E?}NM( z2rGPTo2fp%_;yJ3IW9?tv;*isO?*~59`h@n#P2O~uCzP-QLx#JkpceWTdWM3;cD0S zsWJo}$Gn9n?O zOXd8OimGS+a;>p~nYnm&{`z92!|w!O2GRbxKbw-q4bN<=@pAV?gr(T_Gb?eb#nlyopl51uJ}9~dv!lRx%Fr#$pf%Qd;=c=Epa z?x(J%%x%S3=0!WNs_9izA+cQGW(ezdeq%ZO9P7P7Lha~3(BW$UMFjTsh1s7ee-2Q9 z(*nfrQ$?!1Ut^Mzf&dyKet339RB3>tybFLc1I$#2U~|`&nTo=JeEQzb)DMq-iC_|M z%4`yoeRL>cves?FXY>I~)m|!zgT_S#{Lol; zh`Z&w`k@%H*PJZm{w|Kw)pvNh8)TW|u8=xeubSE)waH-n>lW>Z3Q+^cf~mP*qQ4j4 z(!vMi$R_nJ4;Op;`r4wY6_^0dAq>#ZACC`MLcWMQjr?HMGK(%;IK-gVT3XAm)O2&? zd~XjfLi~kh!pFoDnvr7*}HLFvEihtgxP*o;309>%9@!?55~NO0->0_QT^klmgw5j9ff` zD=8{V#08o(-1$VMrg*>M_@e6>RgT=Ygb^*XTi|lwcMM)9@fk6dO}QkrF%lOdb+!-n+`kgJ~Hp}XK^~X-Ei1A zShS}HY?0FGFi8=kte3Fy3$@*vXRNW#;NZ%FG=sr|cHi6^LhpEE{Kavft0|D4FLe(m z%iO?0jF9s4ahTgH9+yyggt}SH?67{iK=`UCmbSC@SUvY)?n7?Zt4NZv8Zgp)zuDA0 zgcJQ{j}P&U3>Y4~zQZhSh-$q76I2EYs3S@jiBRgqq!uPH5PoYbb3_xLbpRp!L zVZU?Xnl9A}>+hE!ADtU%sIFG(N>~JvvIjqQkJ%AQ!nchb*%doDxuB9jcUS^#0(n{G zF3-QFPvDI53l55Fu_$gBjPBXNg$9av$RQ}KBkLc{2h@H70Zfs)jsf#vq2W_sBh)9&eS>mDw zX@A0Zi2bgkWXBX-$#d;KOCB#hA4l#D#OLhtCS!eXJ64aAQWAE1!j0r3RDN9pVF;cu zccL9844cC#LD`aVtKb0!g~Rvw@MI2h1Uzg*`9l8=~z9=O;vbd9D~|LQK2HquQh_rM2v}E&0V%c=UZ-OH~n! zqW;?iG&Gy>hr?#=LIXW}?m_mc^+3z7u?wS1Zl1^RNM6(PxeXmid254Jic~|HBX#b` zUvol*?A@RfO%%&D>Xr|fHokS-ZZjzRrQ{YFh6cU5nD#pQ?p^k*hrxT|o#slzx)p?j z(qy}+QcXUJr$o5)H#c6|-D4#sW>nV@N9~U!@T`P*1t!M4n*ZhPYZb$HE}Wzi+1|rf zC>AQM0NiJC43e1oKxpU45=y+czbny`Ef$*ib<%cAcg^optE^UNcOVIy8REJxTU(rx zs*|d?Dw&T2nDC1ZR4_ju_(=>kvJ75jp^BV zE_1uO@!-ph+1AyI^_aM$t>}UiKiDd_;cF2%AiJ1Q6;eF14qm?S@yTb-LNE72s*L4E*vk~r+f&`)=tJ0*m7DNU%r4WNZZC^D zalHC`{B2P`)9nYlxg@eKg^pvfxXV@ebdK#7bJ*xjt(Ih1ql>LeYK^O!)8)%+&G?Wl zm``3T96v*6OSW?74m}vJXo9|W=8RG-LPaa7L*S_gmCQwyf>uXwVzA$BNuXM!whc|a zadu8yGR`E#cS0xR^62%_T0yP<&|p87H|f|hs_RpdfrEK-GODZyBPq^CE@l}rWyj8l zKc%v=MMg5%${$pYuFzY+M7Btzl|)rHJ6mz<8cKJiR|@wKTZ}kJk_ObOqS~@cG|rmLi((==ub?NJp z>>-cpw_)3|7SzPgg-&gU$i#9{qKL(Ezl7&DC}zE`()=(lxA>!$E+gg|h4S;qFA5bm zB!+RAHTv#ZHYPUmKWqi>rq&AE15*)LaOTyu{E9SwjOil2ZIASA#m0uj--xV;V9$$C zw=?e>TzUur>sC8z8#+Pf#XZdQg%rMHG`x{Zf5%w`S3Q+kodNYO#K8Y7^9A;_?t0~w zww@Q^Zbzg}&ei*)h5IrX-?p4Rt}03Tt`uto&fOic$dJ^R63OM*r5Trwd^P<2^`*HY zJfRP!x&Q8el%skA-Bq+I-o+{vqSCQlm`1xs*404Ib2aLFb8fvj^3wW+Dzmu$-4S?w zZasH^_RbG$PSAuADKguvx0ad=r!ln1 zixULV-gFf4q%ZK*43E4V?zM<#1YE?uJa1~zK9%`MNxp&-Nd{js+h84L&ZJt)7`X2b zNn4PF(p%FlJ@vF<8CAV_Lw+tkIoqPeAtt2NT70MoZjH$9EO(6@h$*&J7u`iKPSB04 z(r_Fliv%=tT&K+A*oYWEQ zj11_72sG9LACZwjQHt?S1mCv$Ry?_6r#!4P9whSc^G)n6+&&S_{_SuVT%P#f>msc(Jlx`m z4gH9_@2w*#iLgPzsz4{Bp~8%lkEo!6G8L`Q`EqDWiX&txNjI<86k`6zdiq zYtI^F=8BOhX&V;AT|F4_Z22bbV6Ki`8ZMJX;bH~l`1`H4e!%OE91^Igi}IX+)xgA| z(MYvm$kRFeS+BTG9;a<=eIvZ~W{d%3R7_D?qYlMBTHKV*s(SX&#S}|$LhV!^qk^nO-g6^`)j`E}MwCtHVwEgP5L&Ws`g3(ACfwal*QB>i`X3fo@N7RMRO30+WM=4KH!H>RE)3x3@M>P?M;2eYoDD z(ST{O{J}Lz&cK7}BQ{>XRq>divKO))&2}Y+ry~53i>6}YEENkm2I!lfG;6u(heY1nM0$OkM_I?Q ztU`;4)GTZ<(WXj%8@UKY8IU{n?F$6voC0KnFW0rTbr4n8Y2oo^7=+f*as7Ua#m+PM zQs(%XLiA3?_Ej{rDIHV&BMj=sF-f5I<`sHjk?`z6PPmKp_R5H5q_Fq=yZ!;k2)Po7 zc1L%Gh18B^D9)hfP|Oe{(oKe(OI_Z^K_vl2cXinmWO<~$k4fny-^K*j&CQwuLI1gEDzdn)eO2syA>7!gl5ze3=ULFaYYSKjEhBk!%OjAY?*W9qkM zK~Cau@yiHUo?gk9GZeTz{!$2VYk=vtK4+6ro5_uUL z`Yty;xrhM;B_f(Cc2{$HQs>tBvGZJwz&Ezpf27)wQck1*v)*3`bOhbzb$k>I*(jzp zJVr{n7Rolf;Xp!RVkDQX8t|DRTevJrR{MK_(0*mTYM&rTG1xFPj+8b^6_&4*X0&Q>0Rt3BKyMBd-pmd%Uhfmcu>eThTR+B)LQ!{pspiPwX4-+DbX5NROnC zps-zhN=CTR(OsbsPI#JX3GPmkw`R}tL#YF>G(V0RR%KpQJ&c}Lrnhl&p_BW4ZnH7x zvx|i>4g@c2fZ*rbj?ige-XD)e@v3!v>C^V2wuK#B+e|qd$mhRAU8Rue%@{&dl#NIQSV-Hgg>`4|`@=4}bLTma98v zla$C!`~yRV7J>6)Z)eoz5O-fH4j;DkI`}l_BizA!aGv(D7cOJ`sH{{f*4z5YUe$c} z9k*ygZb&}VZUOiXZJJWS>6|I!l6?NF^c9-kAN)#+GG1-m{iZCJ>G8tVQ=1{{`JfJS z#J1Q>Qz;zL*dd6e%Jo>O1QuAgk1h7M(=SJr*^T?f{mQG+ePvbYIxtzhQXedgwa>z! zsM-p#x(NPc>j10_&`DBM$^arn4rC50$vwwX%+tA)HeiPAlNgt>7V8lAz|V+@+E}-g z)VhSnp+4W3SvrWOirUqXKdjKTQMiE-OOMnYYLE15n-?}=HU@IeAC@41YsCD?l##1F zeX1J)NO#b}mV#Dk`m~g$&z8V!) zqLy;BYRZo5QnqDMXzr^{L@sLc^Sr+3c}D1Lv9sk*POvzb8t1(JfxZ#a!BU--Eb@|v z8X7VLm1L8DaB}>QqyW6PTPrsCcxo{pB&(6{J1&Qaq}Dw%uKVrUDZ(R2>h+7_Pw6(ENC_?w zjmBdhm8_CPI{iM;?QIC;ehzX-V5dOB3i&!BR$SL!o^K#>uzU`^@Z7#+gtK9;Q}>8v z?g&_M50-YLX+ky-K@+MCGWL3weZ4vQ&*^v{$zKDVK&eqo7*M`~QjV^s^wlX4!z>*g zOFBAyf>DRd=ezM#g{OKP3^?*y?wZW~MI?v3C2gS0(b>R^Sf7r218c>|$leJhB0lWF zdc<+2Vj_-a+xstTY-HVeS5)Sej_D$1t$r%(=&hPQ*n}?(`Q~x&YtxN+MLd%)3&?L@ zpG38d(X7xij`!xwee)~aQyd3r-Fz2eST)S1L#@)YJZi1^H8H=Zftk z=BC`wR}1ega3!=NTkxaC-D(;SNg#%^$PaFzYGoavvT3L@lC8BiLE6j#CGT}0t~^j% zMH3p!xtQ^i#KVWaO@Y1cT#tVY3er#(VgVH^W_v+?w6UWojx4EXjN{qA=mctYD3M)@{1?_#XqMYc%l>X}= z%EHw;6i+ycy%{B%A6={Tecz$bx~y!7t*g@yi1!X4XtFv58ETfKNQw=$y&?;L?2Q>{#__1Y7Z;RHN;&C8DjV$t(DY-dGufXpZQQ#GQ_rrVv4uZ4eYdVwbqx_z@B4DEZqZ;@jG4uTr0o z_R2uG)Wk^I>Wo^Six_}$sNdvesYZvAthqoUEgR9!*2=nXB(A%f^RMx{Bi$K+42Z~+ zn%IcdV+KsQEDhG&{vP+%QABsv_ikUS--Lfm#sM zCRM3e>Z1{;NP4K_QI8xh89bC?o6~PC9eIB^oM99E`^w6Nf*hBP7OY?~jKdCBGm;YQ zyf(1CzQ5%lE)8~`cA)P0MgN8ld8BJcz&;O8SDVi;gpD54#~_j#Xxa<%4cc5*KE zW4T*p&3dPE1HcWyocA#R2&v)A7Fd$z zWNyylO8-_MSSGl;(b^>bttr#jd$Kck&WL`UTq0SKy0$=^51J@n0uNn(#=goP5>NN8 z{JR21Pg)2jH2=8lveu?YHi)!b_*M)>0-ke(Fg4hA0+rdsDp`5NsTYLwt9TFK5v(|# z5KEg4F16|CdlMDn-wgE3LAJ~#mhqgvb$JVkz30yUAIxE^0D!dc5@vjB zgdVH2H}+8lrKhY8HLlx%La;n9$r`TnAAIG*6M{PINVa0i zS4dw(a)e$f%a;# zz4*IuP6Ty>_5|y2t5K!8b9*LD|%z83o6ll4DqkP4vM6SkI;WQK||@?U@1Q0yg_R22|;X;JfTYl5SNp`^g4 zv<5=14dVP*hz-7y3e_~Ca)v0f#_KK`nju(srjj6ftv~^bG3D=lGaGq&HkPT4woq)BYF1tB?V z`L_gU-afcH8&xNBAPbK%6Jf4F-y)phUzfTlHbOs#?2L3)iwsHm*#G96gn!oQ=-Wm5 zBJPe3dW)zM-+T9aNgHI3XHZ1XAmH!>o(VWW6;;O#$L=8;^W~nMrz@%5zCtyBH6h~U zqVX+vmSjlLIg9=6{Stf4E$zHqVzAiChwctL%14rA>qKUxVBwlJidRsOsJuRuk2CLoE33O*xFIK-+F$#+IUlPWSWo9IP6AS?%>P~ z2Z80es3MgFUUb8g0onGoL4`hGu@Kh4WD{={{@*fC|X^}U7Gr0P|ed$WL zNazrrjWDfi-c}k&{3I%uDglBj}E4;N!f);PmZzd+fa?&Ne}#&eVRxwX?m z76ljtU^$kRfeG{ixK#V(0g)t2*RYF!JL&9LPf zJD>D9=UwM!eOsbh_>L7R%j*?~t#6%YN9KK?)cn~IIN0wMryqLU)-Rwh40OLcDJYuk zZM`k%3_JP}snyf|WE;zPa74YsIIwrqw@bUt zds$l0cP}u9`=L?a5k2!{CGsHR^?GmU|JPvIlK69H{d&d(o=ok@hCP3x@rPHrhrTBM zWzc|LUs8GynO#9yJO2Hj%Cu)+i|%a);fMi?e^R_L*V9T+`geH!-Ua;W_fW|C2Wfhu saDR-LzXP7A7w4S-9>L#H4=9gu5A(~u`86<_JOh5-i^vF<2x@=*KlGzY{Qv*} literal 0 HcmV?d00001 diff --git a/adr/graphics/adr1003.png b/adr/graphics/adr1003.png new file mode 100644 index 0000000000000000000000000000000000000000..6223d59c2753f3a7c389c6a7a40c31493d94d735 GIT binary patch literal 39991 zcmeFZRa6|^*0zlW32wn5xI+l;?(XjH?j9O<*Wkek?oN>4?he6%YjD2e*-!R65b>FkY739Pb-{Zaq0|P^pln_w@1A{OD0|VE9g$AB^7To*;Y`~qB z#D&1VkK-Q#|A0(2B+X=H!DxWTuwd`N(ZC?zUIP4rf#ZU``{ywjm=rkPe;+G>Q~moI z2r#fvOE9Q^U!w(V-+m;3KVbB~TgY7S|Lrjs;_s^=OmZRrJ_gr#8|JpCw*ze893(WI z!NB0r-~PbCGP1D2zy!b~MFdqmz>jrdd@%cOU#7ho$*$K01)xL(QBZo;s~61AcArlk z*6SYo)@vR``oApVeIc3lKBJF=k~nLj{^Q>%$);n3>yWtW?Tpklb~-*jKI-SZbbp)0 zY~FrMqM!(c0WKtU1sha*W~EuB#@{FYdA|E&E=a~7HX?u|7nTa*pA8E$gw)TB z7RY+9{|#1vN{TzQ|L?wlp@C*%0&tql?g465e+RyeNBjJY`0sxH*-VbYQW0D4Ax-|q z{6C*XL8z$f|NaY=fdfu%GPVk?)$za2K?QMxRvQeDwcUO-{^RBOv3&AjH&tH-cc!Xk z54ZhhURy#|w({a37)viqoX8iWrKLr6!Sj>-I*&{y+evP{=}5}f#URlj43SU3_V#v} zb;Gx_r8*eKj%&1RpG(OK&AK8Qeq=q*-Q+U1+OMmG9-H9Di#3o7dfxO|Edo9JIsP$! z*1gYiAMmbB2BL60uEyB$>LP?`yf-?1o3|rqkq)zer?cBGgW678N5~cy#A6oR&(>`p z>byL8x}I-WYTQn=@THbmlM5{W&aQwlsRARh_syL8#Yxk~cA`9Asny7QrS{lI_aXAs zT>saXkAm2IJ{$=N2{MFw8||LV3~k4sqloy|b@rLa>FE()?G`?F{Y=k! zv=I~>oX+O$>8ZNQJ00YDG;er+xht+E6Lhxk%%Iy^-*b=0ZLFt9*!l8sL|R6{%S*uj za#uiI(8xy;uGj9t)ZWoi{t(v%`NC(N(CPa~^7%7bL-O+=k^ko92xHZunym8Qz{|h@ z-)OZeP>VD<>c`UWOQKeGII3(?Gqs;9!yM<>L2&j1W_9NaJVW>MpN-hp=QDo_dOkkF z;;(KQoH1cx-N0d5#;AYSvHXeKKs@WCDTL+*Ox{juakh|?)92+T``G<#Z={BA%Cydx zLzFvf?i;M4PcM&WAs9CYQ$Mnhaamwj)vEMt>kZYkONR=~qA!0S^M9nJ9hq&iU11Z3 z7#SJ40Ai#-I21|j5sQ$}?oxqNG{N(hHu9Ec9Wl_q04f@S9fnz4y&;Q$Opz z*u^@1{C*nmh3~pzb*)x&G^-vv(FZfd$Xss6Vajrx{U-bN0j{XDn19njZVhUQvapyk zKC8UCt}CY7>8j-@KPzk4GDQZI<$66CKR?kdzG9H*w&T2}dAhXmKvWNKfkGi2#Pqh$ zS}AHZ*+n#cu|NKm z$>l(S=Wa8I<95*)QP8lBI#tiB)Dk9VD_)$il;rE4(QXbh|I;K2eL{C6W9MQVj2_8Q zp=NZ@3ox%B^K8$7Rl(kY_P%IPlt_d~k`|AV@E3n1X^CF>x$bi$|*`n9sgGOCc zqZ_j~qgiLRrT_YX^}X$s3kn(#oOF9}WUv-ca9q^J&&jI^O4y)a%RTuX3X^aN|9cs{mM zZD%0*M+&_*f@OhOgqBo!$J|H`uXp2=7Lb$>SrD}fIhmMH-@SVmGMR7?=fE|bs_$p{ zsSu~ddf__|qwG;;6HKu?Oe><7Qt0fm%d<)G5}fZJvqfT?0$bb>9bkfKm0W+c>dSd~bPo|vyt4Ls{G>fPcDbCiW z9-g5~#mGfkP%}9=IQSlp=QwzJAqbQ(A!{2uX7*!BoXEDGW}bIGdx1WWBC;@4C>mo3 zGaPQrf-X_0SFDRiE^HG7Wi;k}aMkBUMJCVEgQ}f@N$*%OBDIs<7p$9dboJwgFiBhwz5YKxea4O{_GbeS_!Ae zs|kMXRKzKA)E#Ct_3aeOG*_wU&GR%VQ3hcCf7 zIY%)&t}xQWa}Be-$?vc!P|#3H{WTF%!l`+GQ?AayR^(eF7hZy#(BgMpZsTdPn!?gZ zP*LmTU}OgM1AV;BRH2m8{fd3pR^0?2na~t6Yg;4Z@L4UROz7TfWERIz-N*#&A$%U-}+rk+MZ?VGiDy`-iPEJ**i?AB)?< zNepW^fA*~Up7e$d|5skW=bMGHeKW!YH?&WDM31o)IthGM(3PF_!`ssSIF@}YaG z;^#*HVvRB4h0|)^F(K^0** z39CZ^Ciy*lHNRFShF6HELjyP`7kF`fX8J1@Xa)w&ioB(aM5mN6a}F@oaYkxy#Echivk9-pYqtY{%`s20Sz2IPXW;l_1`lL z430(x1`m8KmR0||M8p7}5D_kZ)i0}0GS_EhWx#{U`o|4-sS0r3B267?rM5dH}V3k0a)krOIf zM)CADB*Ii~eCCe!&ucNmM^1LBA)l)5&2ODf<6=*elu2)ggNBtQt2nkd^lZ1cjtVxS zFeMK4frvVHd5c3Y1ydXJREEq6O*Vyxv7dB{|pzM2ekv3V2At*)4!QLV4*o!?%5iEV1K!5mz7 z8gE5#-fqG*s|Rxo#QReU5*yzr=NcLou-@J z@+ChGvslGHkyRG?ie@zFlv53&&<>qxOID9|{%-$bafmGPp9s!91g??!>on`=&~UIJ zIXOYp%lDD->L$W=@yGDAe|Xpr`^|C~MQHS=FUgR@Rs9s-^%&twV#`_yg8RYVrqXxo z$N26p>c`NI(@uLHhkhJFr^5Rq_|h4obFnVa74Zm39=#w@Cei3&N8qjbJNJi=S%>Vu z?`#Srl?v1AI%yvA23ax{&3C~+hZ)Ow7=#+}&6#<-6s9BMm8lj$Iu{&GmuXtG30dcx zV4!!m6 zm>+qYjOt<}%RXO9G{27@l8tGZz;qI=RPu26NYWAvrA8qB(^EtuPI8AST-5`m%2~b_ z(}G3S4l15a_3x$5K?VdB0h&&BX8Llu?~GMR!) za|~Sh>J6fsx zfP!`4k_`Z9!6nfP^j3+CAnaRQFq*b=V~XaIzuh3-dF2RlNj9^Q7aJ-|;Wnnxuc0uF zLmy)hk!!PX4R=B|aV!~;3ZA4qn6?POv|6A?fNX4ssJkha8uvaJ<$z$fK4Mcc%Lj>) z;vVdnLW>c=>efT@HfUagcgKRi@U?u4e6>pHdx%VMU?LELoYM7C^cD%@FY}Y}`pqbi zQ~m)swQ~?M#^f_hemCPP6|&3Ljfic33?DlY>QNEZ|MY3NBv)!1A+%ETTffv{tFpg_7D`)13k&(8u*bOwWymK^=+*0dlpt}3r)>wp$lg~7cLct27IZgLYO ze!3L%U&An>pXBTaqS??G#DO@bZXn)aavwj<8n_L{wE$7=gvl;p60zG;&=xOuuKbFcS^REB z+0WEKm%5VOrXlrBy^E6}R7CL_5A~7DaaL3Nc+2(LJC}ev&R|K9UuPJ%6c6)5Dri_M zmZqBor?68_3O!K{d!Q+tiGr~IpQEyvFB~{-TeIX4W9dfUWj|x&i>HYQCVe`#-z#c;)S?4t|Y!*Bj*lc zf^)!s(*9{x7N^ElG}Beskw!1p7$LGzl2U3riq6BgnDIW-z}c@@&7yMo3nV`-@1+M6 zhwvTVJ<3vCax85d`LIa9$5?+e-|iG(p;Ie-ywBREba7_MJce=NAH^y5Q$ziZZIjkE z)S|b@b^}K7&cMc~o*2FJ_l9%W0i>x>rv_=^E&D|(32{0ZsIac$!=w_Zj)H$N;mb~N zTs9dWtJJ2p)Wngqnz%s_RKrV-PujUJ7Z+36gDI~%)G89NAPJo`Rrb>io7k%yNKDO& zGHz|Oo&0K=zk9FNxtH>7f4e>A;$T6jfeR7h2!**ac?pzrwixO+mB&%1n>EN?&4__c z?k_$2-X$IrT?HdBB}SkTG~(gzTno4Bq-gGlI;CMo|4g|xKT!p$2weMfl5peUy+`8X zwJ(Z@)HsaIt;}{R7?#Gwc$#2fB*0qDH8w8*6?Rd)q7+ZfxOe1TFQ~vvu><|#$Z5$e zLYUcHVSToo-iR!$C;~{1Djx-kU;l_&>sT=ks;+5STVOpKHq!$M9e2@Hz5NM?f!8pO zNs;Z>2ejbSdGd6yQ1hP^ACm_}H@&CunO^2kI#xXKsUKN638Y1TcsWlre$LBt+-BO{ z+uJTH|6caHkj-{^bC|ZOPf?seHMs~TBA}c^AoO)YL_3=zvBK_PYJR6-_xm#P@^?~U zf#MPtlrAGjGDN#vvoDOHP3$Lv?2e1-pXUVvVn3}=pBVKsGD0b{kq6y*M>w>;`lM^R zIZwDniw%USIyy3S-fhEY`Q9!y19TuhIXT!kmiGfECuj8gT_XRdz!Ao-cEuwHx;KP4 z2=L6~w8BBc05I9){YYt8a})n&)^}MbZx=KkL>aNQL9FiG6J@jOwgdi3fpCZW)5n=w z_g$>5)>GTr!&bfetjs_W4n4EVYz98lQwA5UY#O-{_iIc0`3LLKeMxC)VI7?;Vk1;k zR4RIUQ4J03H|}B_!wF5RR?+?X@`wNK{vKycGnSAyE+ZpCUC*;$=k<4a)nvIkU*?QSKP9Hv!E}Y!{=M=xFhxiJl1Hi!W`$hlHs}km1y?S7a*-Q zo>yjB-lr`bhlPn`E>Y~+9@}sT_#7zwuTRVr^4SRb8}DTey}Yo^G*MBGN0H$I5NiEh?AH!VMp26q z@z@M*e$RQ_E}2i2snQ|Eg61Umv?(nG0i~#u8u%J;1b^?D}Qd*Fg52_t1=;cSe;bupVu`VlX7q@T9idZL_~#z{|XiQ+`mD&fjlb* zpxv!k-|QT}hr_*~z^)B|p{(gdMn}Js#BWd$4nYuBu? z7=0%B?0~NOnrjh(nic@As(tRA==9pLCwQ(90JNT^wK8&ffH!z4Nu$bx9w-1OEVBPn zx^g?5ze}EdANQa_7%uP?6vb%T`O&`PM$MS3`EEP1T(21sN9O+9NUEuHyl!opvsTTR zNIYMbInw+0pCN}Sb9|Isxnnss0G>4aqv!JBsES<+R3?)QLrzYZI@Zc+y15&%a^ugM^gSux@EoOiAR5ESN$@+E_H-^oB8<_pFAD zhUPs>q>{v?6`CB~<{%WSX~oe&LF@p4l~t1GJ}aw{{{(04BC}%g&i49Ux)}=dykTWs zwbS8s+yYylxH)C4C7!+*oBf#dV3HjIOrZ@BHyjsz=uD2=B2PO+uic?Uey|B4zk{e{ zZEoVT?oZ{emzJEH>OQk7&E@8A4 z=P;Ee>?DdN`dOHHe702iV%2#9=L-fdt`!T~+(j;+c<*SA>zUZuAp8K=KyDm#nCo!dm>WM!BnS}J5y|~)Hq$PvZI_17{ za#aFCe&!>=#eI$F(C8@3YtEtbz(yr2ZK9v~2kMP3|E>#6JT8}m4Z`q@rVj5v`4tri z7Z(=;g^MlD=E}(YLKq2?2xp_DJRk>1r|A z)a!fB#%0+h>v&-W}%?>@zL@TB}=UU}7w2Vy~9UgVO3u;={*&#Y{fkO;t zm~9AjZa8n*;djHXr~jar_bg$eC^s zXYd{Qx7*jm7pmmRms2w3rlQ3z>E(@IvL8;8b=TcheSbjzJQi=W7?RO`xypH61cW#H zv&p<5Pohu!{`Nu+$3g+eMy>VkNAqJ0M2-|)qvQ3F!kzc@k?0+|__wmHD4gC#M)|;@ z?4hICpJM5=wpkni1K9D-cG?1ZHyHhu=YqR*U-tU9HpZWXAY@ZAmPg>}Vr`RSLw}1N zw!n~7vle&1RGDh8o$_u5>gL7Hf;?@Mc*jOORz3Dr2S^ThxratMj*^yKw4A5fi z93|?fjjgn-5?RBx4X-2mnX{|?33glz;-dj5(J@Sa%GnT>#>rGVMKkTwpNuYBelb^s&hr@&EZPZS z(--M`Qt!j*;Fw@=#q&j-q@xaUNxJQGY>ld2Yg8^I5zeO<5uI9J7R-fN13X##rUYX)YKD_JQpAT^X%Uzl~wp1 zr|Ga+s}#^(5)P*F5%LG=yx-(iDTxavu#KM_z;<&pl9Eh14d60&47Bhx4LTLKfAsa_ z=+_{$DWv+tTxnnSzz_+HBAG?-gunY5b?CoWR;x}T()9k?UFzx}^v9C%EMLN;!U2Z7 zxtH7;Woa#_FL~vB>&IBPIilaJ*`#^ouV`HMNR%9>VQLC9bn~pKoXEOg72X^_>{go{ z#eRrxizm!A+G-2eW9vuYvhFopYTIsRLz1wjlYOxvg%KWzGvXxkyoTRqZ4CCLj=4#P zqI|U^$F1!MhCx@QRNt!KeouD(X@Q$p@B^Yd*4EiL$@%HDnXUPVaIUXKE*wFfmhX_3 z-hSH>`T`Di3UliB=I!^NIx&NTIKmU|BGQ&*XLFg-NV{Y>4VI6;A=*3;wZA*?+)4-h{(8R1uv zl9qhMMTtJuakOcY74}61GUCz9$x61zLS-J#^37Au$;u%PO}I^0{H8h<&(O2Zpx#fL zNFR(6X3-~E)29db($#%Qf`gsi(6?Q68-UPkfI6Zk(f5EHKJw z;3LRGQtqonG@7{^2?hKS#+osMSz_`Ky-Q!msBchf*~z)C;o#yAa1^)nXR>VPT4_-h zvy?v;MIfw_Sqrqb%IMY2h*@_R+*#)g{UHsF|B5V&0fDcV8yr3A#E1GoIi(-{zjTxt+71lf{O z4;I>_-ILhHPf)|+|A3SJp(S>H{C@ot24JKJYZ+L3(LPHmxLASRU!3kzlSrA1_8QRf znr=gqPgU*2U9>o-cW%0jexS_gM09VFqQtAl;A`%yiK04)LM34~8&z3kY9T=Qp;1)! z={J0%FZyvKn28zabk8=Dd}9PCQ|cmsx53-=eIu+gCB8q){`b1)0C28$iD?6c8W98K!`^KOvMe! zNCRaCChDZUv-&Znt#YJbccif}x&|F-hfj4`JuD+;k)d}wB0E%nZh4b))`C!bJ1WIW zokZ9CWlys0%WnU!)_dPdR5c{=R*@0qV40Jy>6yWbZbmbs&VGybs+P+JtH+T!t3Cb)uu8#-Mq}!(hp$r{^JBZ~jv2 z&qLNjb+Qd&LA-?@U?aBdO8&K--%TYv8u9?WGu&-KhvmE@qs_4V{ysm>h?m4P8CKF; zUSiE)h+Q%aZ}*`a8{r(TH??2$XJYGLtrAI0fYk(MC(k@0V2~tEO)rAgR5S#IU?1yC zov1XMc)gzDwziwTA5CL~noUjzMpd}KI`>qV;$CFR(bsJR;YkM6F?DgtGYYNhtjo{s zbbJOFR`W*vPm6joxwAgOQq`0ROj<^<=t6&5e-#wj#w4+>r5I0#O18cQ6`!>;qHV_nf2t2jdzsEw4OIQfNE0t1Y(pT(#P`n0Q<)OAPa=_G z%HPO=RU_6DjqjG4Brl8dDaM$V!#Df%s+Qt>mUT_HO}BFFwSQE`$$V6WMAOJqKi|6) zkU+gfRcj=hHOLqw6IF10j<7rpMpcaIKr9IH8W3%78R-ZJAY%?Pae zY%sFeBir{rOwKVhaQ(JU@-10d5}q>qxAm*u1%q=5BMpgdRC6V5!B-jV9LRb$vh}3=Zxd$8nq0x~pCwF3jbDb&v%kIGd!(`Q)VG;o%#-xHc zP6ev9gtM3w$9YsyyVaPGSM5yz%_S$v6=c*b-z-W*2b_JI<#_WDa?DVRS8#xYbk?30-bYgv?l2{ zF&h^P-1m%)p;PPOU#WxpSDSdBNUpQtCh0<{9zdL1aI4(S^5;_6+9T=~=KH*@FqDGmyH2so_uwwAV;tG3hoI9u9& zYFlGnEHH0e2%mPQM%VhIMn&x+SPxi;p?Ccf!;H6a#Z!alEKswdqcdJAIpTi>9YDiI z0-uX((M`1s`e#B)2m-%)1|x0xT2CyXRUI?d=2hrCyK5V5wEbWP?gXKF(`+;lvS9+H z2pXAvt8JQW86Kbej%jtGeS7-ve`Gx|%0PI5x9Z4;0YE}6KP z-ZKFz8wT3;TJL;LJv=x)8c7B<$R!qK=Kisc$yJ-?K|I(f>+Y!^=Dtm0f?yRv|FC$) zyNRDeaRLE?$X2#z;21(w7}Y@%c%K%NCW``$z#`!Q+?t%k876o84`THZeUQ)GB%|{B zh{u5nn$^r~3iZZYJ=n=8!M)R;N70RLw;#w5!jSqcPqq;>ZClr;0gI(*w=$}O?OI!L z{`ZM*u+6X#IQ`@vYQV9>+cxWmEsCVamzh-Dj>BEv^rZD!@VKZ@CLVT`yW`f`owy(T z$JK`$0)$t{R$&W}QiMOMjyg=h<8XJXLVZ7&*9u=GzWyZJyzgog%)C6foqW?)L$7YE zO#tDO@utLC2?(5^u?FNz0(_q|jyj`8o&9v6gFInK3=LT8W~FvJ1$Z5@mBt9_j~Sx?H9<5Zv;e$DukEZeGEX>k`wa?PS9OG}wYl#AM!(+PV0c-=L4N!1gtr5Rv6lVp$nUysY+^TBMI@8Q zuq8vaOKqEHhyeUz9EG<$TkqKH7OR9boyr&8%Q{@G=$XVl@E8w_F+y~)U1?<9kMZZ2 z)CJJ3swDow^z?MuIG$Iv^#VhMepl!Ev8Sh}M!Sb&$32Vi%*S(Ur;v0`&vuS;qVV%3 zHo)>&7mdsMp4aQTJDf5*?D_GJF;F;o0HAWr4RG;hSl!{}79GcMpLQpZOUvNKa-PG$ zz!1%1yfk{e0+!PVJo|RkrKP34hY&=(?n}F_XE&Rr+Wx|CMMc|hUP-{G#oYezyBsEY zMuqa(WRKije|)i_tF+8Tir0s~T3#%c(3bDkV>Fs5!1wXCa@vUNTP@f7rB+v3V1FUI zBdNwG%MBc-%{!yqrGUv50HG`r^Ci&)EEXuYCo91H)k_l9LI3SKGuRl*;U@wtqM!7< z4#|C->;`77hZgWgBRP zqfTn&qRsqBhTbvu4TR1tRa_Ww2J)N1b(yRc;`LHYp39%4&A_fU$%(Nfe)>J0upJSxwzC%)xU#Qt9X3? z2=ERN9pY+gA1LIqV6FD)?e==uO4jM$lUzsese@gOHK&ixjo5?n2aUdha{AAd@nAnH#G?JYm zDbCDt7*_Uc@Z(tUu{Ij*wlp)#Olf?fg13C-9KavVANnthBS1dCXG_!gd|Qc+SU79> zt*@rKy=dl|82tQbY}L8Uq-kuugl%GTAe$a#2dqi~a8It{AP@zOA33ivy$4L`5HQ-9`=s3xkCD^0Otq>>%J9W*N7>$|Or896X?qk_Vx?obV&ufc zJ!$zR)Vm)?dQu8sfT&_8`?@EK#%^WwJ25vm0`{845ulhVh}+lPPVaDVv0@O>Jn99u zlRXp8U(bO{$>bplDq~spJ*BaNa&}HmY&x?!u8|EddxMRSd=_AY_W-zcwB<^xny62dhW4;zHQ$`VeowKaLc|nwxTgF$wvQK%nvT38$$`uE? z+KG*Mo^4eeDa(iTAbGnTRjVJm_yg$@ulI+hTuSq@z`{3aEaviYtDJ`7kf;pChm=Y1 zOh#p-J{H@HZ1xSG86Ki5#XHRBoY$wpJ8&jOf|h#-bw>sWot#>8k1%EUT^Pvl~QU5xcK00$Ck!UPA%vXzL=F0It<;()Wl?TuPA%jotXF7w>8p)}LE^fknlGqlQcNnM3R8r;)ZR4#kwBhT(wY#$V^uYxCjh2?zF#K(s0xgj)J zos{#YOMrW)Z+tb4ssBDzlVgZOSL0Xy6rC`tX(nYgR1)lrX-M~(L3kI==!Ss51RFAj z&uG?5QFw^AVV8voa6PfK;%oHcRL$B=zec_Uk=c`(J^3o!jT`<%Pq3Do^w7tDsB}t` z^H*+VJ131!L@r@6)xGBa&!xb4zdSh+4SjtaJmLREn-XcThL>wL?GX{KcBtXhON>Ju zQc>Bo0nvqZcXw0OH@BRcXr>I=rD3<6@v9-rLG>7;)%&h5rSFV&SYK8pS~(QdvHadS z=h|9$mv87l`$SrR{Lo;IGQAth{f11(yX2*W12}?Wll#k#63yAk3J+F=1~MnVFvqRII3u6umAQ)4Fel7qqcRqn~Ni!%ZL`p4PW6RBFS>O%osP zzUo@h69gBA~D*B!`NN3$Wn4HSm86mDNqBOyehf_TWxJ!6b>ob-6rF2 zQcJ~$R^P>Q*XJIK*g~WZbyN;CC?8OFl6TxzAcf)g;oLXxT683^E*|LrlRK>pZ$pKA zDJo*VA40%Uf`-Kv9&nXYM^%nuS&LL4^$d%Df(K%L`f(v;$aT9UJ%$)WcB1n7>8=O9 zPU`YgTVXFHeTLR(09F0X#gC9_BOi?{aM2dODAv$_O8Rl3ZdV(kaW4{e#zEIre;tBS zt(9W2TCF@LER%KOQ>2I=%EaLu^Ndi$dYG?c+TM@bHJeZ%xO)=bHbyGKXI~nU%~$Sb z%#d(TPXOtd!+>^L1#aNV@k~3){wb`T-)y%!JPjSzsO+=k^d>%y`5?uW7EAHRm`Tqi{;0_Wo)Usx0n8$0(}oKlBsWgTTz2rP0#C z?OqF8&gj;b-(dYmU0kD?{nr!vM8Q>xz3(L2sI~C5aoL$6qwNU4u=b@}5y@*U+qbxg zZBinorQuO&O{^3Ap#~!PH5qfj=o0JcjRr;&_;%?=z_)+-hv?`NA98u-Yqm<#ssc@s zA0h$(QkqAg|6G&kw-H!!%0xB({hYMSZ;gwQp0;QBM7qZ9QHt0&Jwb;dVU>bx``MehvLiiu* zNCRDrfWp!XgMtY}T{J?YdHRbf!68=yc%9|x<+IS4UR36OL z5Iy-k@oq2O5dX__0Cp+_OoTDeCllzy8IzM%*nwMOfshgoelAsIIhF zj_6RRU}82N!lS;43i-jngV{3pcG`k|Zz{S6jlYT>QsnrV!k*pK^(|T^zSC#KifCY<4SQ4J#?eU3bZt!w91h4u$l{%)Z;p zsGIq7nwl_GR0`Us_4Ug?YA~>{NEsQCO-)UysHjRRVgF-^?>0qMKujNTlf7cGSYk!E6zHEgAm6 zH9x=L(IOl6l099%(A-d$T7dRsa8?$6mjBEB!BhbZ&|Uh;>)K+~=W5KA!~rn%>;V0C zRZJ5=gNFFGeug}&Yp^%G zjXB$FqQqs7>VoO2y#L@R7+#IJGD+Xb{+;_o?d~2Ld!{f|802m>aclO?Am%P>Oq&~~ z7=d>rI7cOOUIkVL@D`xd(tdC5?W^zx%A^Z`8N5~7;$~(Pollq2F2{?gfIX{*SP`&_ z$f(Y|buan=3(z-v5>Qs&mbnlnrKSQE4ix+cx^AHC1n1}HS7sPFoh?OQ_kZ;Tg@h2g z#Ag4KP&VJcHB$uZIc%{#wOmoQcU^ko&v=pPWuKGl-5tY?YV*Miy7R+zg8ON7`LeQ6 zRP{GSb_#_q-i9G0Vykb9@12|=YKJ3o1}`l(J0q&uYg5-TdyiC%3PIhyYdJ@6bDzOp zZKy)o`5X?PO7;Ayj!Ztk51fkW%*kJyGKH_+I_MTn}yA!*a0-gi}-8VgE- z6Cz7~@>G)?tsVU35nW+@-(?k<#0{AT6b?Im=<+P0@!cChA>y(B)%_eON&||9fX-W7 z5}-=+Hw4TSi(UTysts=?uEeIE$JVx%;cRJhpYtzx&;rTU4;-WJv=;&F{^fIAnd|{0;cJ>alrn1 zykab^_LzEy=yo$Kb&|R)wA965g80sL>W@ZZJ;XQiZ$hmR@!5$XoFjhV&$p1zL0e~M zp+Z#vscSYnz3r0}Mj6p`cS ze3>jfl)yR@V-$_kM=2FQ!q{{89{RwVyM780vHaT&1`%63NxoKi%}4tlaFSo69}=nJ zZ4d$LS8#A}^HvDnIpC7p2IvS|qOe`d?gwFf3ADE!#-9-C{<*Ol3JP&cIRJ>EqUS~F z4q9fCmgokWQA2>vLL34viLejEzA+1xKJ=#Y5G9H*?FDg75CI$UkZZ~g7xJ0GlcJhp-*!QV&8031Fe9po7p3a457=i9s zI-t>-P&j1?hRm952o+W6fKr~#ln3bY)o8N&ddQw4%zWMPXWhC!5wJB34pHXV$V?g< z8j3*<58<(pCK{~t4JIkAJ&k^LKVA$Z77hvMLVfeD11|mwIB)Nq+>R%Z$mpx5EBgF$ zbyl@{Z})q|99lHidw`5t_JcbCW_cZdmbIFMWW1WVP>S}nsT=R`{b zTr<9iuo_fgMb#t?+;cKB~rJmDB+W##ys9DA8w zvR1&jN6n%6C6SVf&K_`2rm@*(qzm+4;>x15b3S4!xua8(@D@o909nssOn8)Wcr`3(OvNtZa zYGDj$X$PtsDUBpD6%R1EyJe6{^xSLcCQPut6e}@9%!Vw15R^ISQaH1i$Fy({y|s}z zzzs}1s2X8UlU|I*@%QkeR<06j;(dv=>hSuTj(fhSICs>%YCz@H99f3%YEx`SGPJ@1 zU$Y@5EsB1z*%RdWX2>}wjcHa;7EAn0DLE-~$l;uE|K@uIjJf|fx>sAAqxo@J6H|4Z z!Y}4_5HvElN_9z@_@1w4WN~74yLD;W&znp!QRK%>i1 zYFgu-Y}BC-^!Sl4D@32qE<&DJMSXpr4D|Ws?PtSJPd*k2wNa)G3kexbc<^o$y(GjI zZO)Cx2HOt8vni%(*F1(X$gz6 z&DH4Y(jn{NCXBWR!YufIT)kyf9n14IoDdQ$cyMn z?hfy8bMNo}te15bA6T53o}TLJ>Rr2b;VT$Pv+~VR#6|}%>pq8lr$B~PX9U%a-`Rz~ zTd6QXPREl2YNI5rgEt!w92pT=vZ=1F3nj4n4*@RUtv6Rr)s zMNr!-wt9<|1~*HO6zK`qWXc zSZDR&21`Hp!th~fqJ($t!`h64eSqm#qC$CJo~@CN_58j0h<6b39Yn$D*cNx#+%fO_X4o@LMEclrgGh@7*%BiDwbj zlbHlZzMk@!-j#bx%X$GfzFb@FC~OJo=Dh#15a86wu$fEvov>_{^wF<=I1&M}f16~F zlHqJ5q5aQ$t?$_N=0$h36TV=2v1b)safwR7gs3)~ldPrTuE84OF^M?H<4^tI6)`Q7< z<;(gn-D4?7VJB^QCBGZ19b=_u)rNMLguRtHjl}T0fEO5PU}durB~v0zJn;lsiCv%^$v8{>?dJ?x#-@~^OEs`me! zQP))8toHI{iK3!uMe8N>Jg3pHuWg*eYD||$wjr{@*sx-MIn%UBx!N$D7>B6Ick$l6 zR49OxNI%WJ?p~j>ZO!8<2+yM0*jGJ*w;o)=LGf$U%lzChnq$!E&bJBsgu|h`A1IR5 zIRBiHu;JcVP7q9J^?CKxeM6~FE{ABWWur{24TCO7^Dn%-AOTB4qGq12A!22e6y1{> z3DYCPOa=~IJo@EnOV^xLDE$+>gYr8V#~58c)p7ncZ00fQhvmt>?`9Qiwf-ls0|x=1 zF~5A(7*@MXZcZsPLbJM;ZYKO_!c~go@g4JiUCLJ|NyfdxedqNRqqC{Fc1_a{o1tx)EAevBzv`gn}G zqE9RS*+-TEsV!|6Y&NQS9YI7x*#abH_)EgZ#PX1*_00agSgRqb?d2t%bukF<})*BINJZqV)EIJmuRjKR} zHUOIF5w>>}Tl-Uv;20d)YWJ!YT4P_w_5yooi5-WA#togz@Z5f6fm1l%KKS#G5(jKo zaqI@HY^fGQ&`~M9x?)0gd=Okj(5KksG0yQ|J0;7XF3=N4IZU}_g~a=cAFUzK?~xc{#y1FGqNX`MSf#;n@vAp-syzMI(KOq#-AovyX_s zk4Yw&i1mD{bfT&AG?H8Dp$K+Dnj8mavSNWJ`UTd#7{o&qPL&jf=51N=ZS&`hzaFBCEJDe#Q_L(U*2lCY> zi?vju?Q^+Q>a{vR);f{ZmM}BxP#b(j)!CE{n31u{H~vfJbBlma<9F2uKhtFaB5h^{ zaLwuhs#4YWnJ$&sugCNldh!ou1jbe8t8Fhq(RS)6Y=Y$ABOL@}!{Tu-MdC*P z2A~GSmY>&PK^Xm$p%@HfK+;B_QgjH=w+R9g@t8is(FRax72#oFJ$+F`VYOif)mVKpQqOyhIj5&43p!*~4$vlTj{lo|`KN}&hN1Bh{XEG*PuTJ-zg zaIZ_$90$zVTcj9vH|Gbl~+?v%@|dMXWOAG5(|~BXgOV z4&YOyJW`3Axdui?nEZf@6b~ROHk8QXlBUKyBb1o{)TVK}KcLf#AQ?ej0s?AXCey`? ze>r4p7T_B875v6LIasm1-o`t%81>t|_G=U&rfu}=6eRjqW7g9tiR4D@K#&qZ25Jsb zCL3w@QtG00+Lf-~S%kW~J!RSGrOF`CjIU+q{Oa3M{AF#2w-{4RDL0YMbfnsEp-M7I zRSgg{8clMI{%S>BNo+Vx^6lF|;y1A&6Ygv!v)hwpQ3(kKK`LtMkwn;Ea5&Ir-Pryv z%vMV#j3&fdQ}H#{tGJvu=LL{ZU6m#v;y+nQ(U?sD)4`Wi+H6b(1mw2EKEj|Xph($& zTa?3kUp(OK2jQlq*Ewv&vG(ZX*K=_EwrP{Tp_Wh_-zJrUj~o2!J?Ce9&8R3Bd}7_L zI~F<6gGz9_cP?t3e>e>Axm;y~y+@jjzJQKNDbhzGg{h7>`H?(dUp#%_4pU)sdwS<~ ztZqd3P8pgU3fTDNuuL@+RAc36wF>0pc>nS}hBAg;Ad?VPVjy8C%VW z^*D{2*xq|%Rs-o>bwzduX)tEPfiD8wVz{cKD9ReLLd0omNvOF1j!g|9PL-rb@d(;@ z)zBBcY&hRC*LLSC&$>V?k(HhV)O+p}4`kt1oip{uimuSX=Upcsbg`GVzdi{bvXP%V zS1o%%RFLSW(OFI~YRV=1T7GrZUohx{T@|OAsht{DX|rc?dvaSlmFgrBRH)_;{j98| z23A%H7Q1~U;$j5t)&%EQ=h??+GiT7?ETT&7XYm(;|8y=Z}Ljgd~7vGKsW+Mq8b!wa;uT0YZu=cof?{c#5piG2$AOe$)<#Ft#zrq z=xj>lJjMMiif+_tYN65wRguYswPcFEL5NJ-RSQ$FoR4vdG?{ZJJP)liD$4ibW4(sF z2p7nc7%7E((K9To6?cXM!2Se?RoS&a4u9Gon>uFOw=noIkTo=9sjQt*Os1a&&rZu=f>~#iol~uZ`>+uqz?WMekuylRa`9T&tl$<3Z6_0-0_Qrz z9h*neLDnj;jH0OJK&%(eG8KQ4C=!7M|Gw8LXVZ3bI-le%gFr#Broa!vkYa=xJN0GA zBLC5xQ{a=bt#T;-j!{va9%l0FF&EHdpz^brdtT$8`4-IU0M1Vw{L%-9JjC4fsP9&@ zrC6AHY5whfWH$jg1A$$pY>z<8FW~QR(5ad`W;Opwh>g1B=j>CW4b_|?2>SsZc;rsR%~q8 zn#Da71B;tC;cjxA?%aq#KTU05^UxmmJy_O5dT3kxQ;@@o(%dvz`~eaXcLrvud+AJMc@pkMg#X}JtVFporM zBl8ely-|Tkk3RBTy|Jn?pX^Du00k#H;}LB8u>Buv%Ks2e+m{h-pcyimL&u9f0SXhc z`(v#9cRKlzeVC4~J0WN^%pLe_S-}!nwE6lHk#Pku!wWH?D=$O!1uBv2zMA)*83(IK z_zJ|4E7G&i0?WgR@ioeL{?^NlxFci9Z=?Gy$={cR~z~fl!5+fD9cz6!CI@ zZbUWWvwX*PBsy(;)PpMACGA7&UvhN1mzO*w29eoiPXD~D#%&lsJqYa>NMA_V2(wSh zsS8hl=6F-ZwhAh><8xiCdkl`EdkV_99<;6!dh){zj-2jAR;bo7R%k}rdyuwUVnSf| zsNvI*vB*29&K9Hb=*oBL=s(!Q*umJZrKx{jbyhulzMEV}A(Sxbw~(|>YQeyNokhRC_v^+U}S;%Eutbe(VDhFp%gq4w7j-^`b$yOvr~&w zt*X=QPO#R;Nhg1({))NHEy*d!u0bh1BdjtOr~KFUI}};s@N$%qrZmBjitasqaXpX& znOOTCi1(tW92G#%=<)16o69a&q^U7dyZiv6WGpJoAe_O!8nx}n2&{Uwyq!J20~l#+ z!q`5^Zp~5-Cu)%TlYVLy6$7CoMBC*r&>@w(&wo{^amQdjRwMJKH!N&pWk`r0nDRu_ z4r2L2=qq28II}ld!Sl(H=hJ%T`uUAnqd#P2F#Xv@rtvrtA^K=UMnFFPt$k^_TB`r& zpd~GWVQCu*tO-J=r}n@Y_@tggv`j&_Ubkj9S+!J(0wMB6T8P>jdv7nDAg&#F8f&~c z5^4;C@ykDsc*KTeL?9)DbnF0v){Z>_J{_RUiGZfQ{7y!!NzkVo)DIyL>?Ybw z9P_;~Q26Rg()m5F2lT?=`SAsohwQ{G44+eg&9Qhgeo0QG$__wQEeyux@p$5!MMsa* zGhKGE=)og$$*L_TxzD<|f2%xbw?|~v;|GYg1w6EE$$kG7H;6c|= z$jAd`jP2?T?gtyY`eGKlV2Ol3gZ5Fqw$oJ`)n}p3TQl==(S0i`OXEr($z^qr8dHB2 z|Fa1X0teVLo#(n!{b}stS%~0fhSeYl)|*ZRze5KNimr)-{8Ljm=dcrwF}|$q$L~@4tU9mn^NB zmad}GMk7~M? zLW$AdpQ1=54MY*N$9;OE-TfrPlUWqG5dI?p;ckuRel`A+0*_YbUHw;rBD8PAz|3%h ziAeU{`CY+eWpNM3yon_MoL>`c`}>+f8i7^~fI=vZeA8*G8v8Kz^=p-G?}#P3?NyLy zprl}==kW_6h*NdHY?`$8gIaHOPe93`%|!cT>i51Kvf=I~igX6VY3vbmHmn##tABk$v{^KKwPZN%I@I5_9LJ38t_r>UtX zg5LgmxQ;_WYKzgWi?*3tY-x&Cm8qHf5(5(=L+ox!)5jlc5(AUZRP^PBf<$tl<$JY` zE6HkECRY|IW&T7n9yzA9#FLALZAe`9qky2-33jTfmV&|$Q71WlVRL@>&W{r%i4oV^ z(}!>I`~oDaf8;shezrtqkE-ljQW;PM9j1fAXuI3H?4V&wX27DPN58vs)jt?L)j1Dv zVLi#0-J36k-!Q~T;%(zS&qG|rxRidH6BpXfND6jnQqsNI&@Lyk#0t1(FYQodBG&&o zZpF#@X!|7|buE39G$qFx(=MZEcmLaq5E^trwV!}<;O8-vB2u-2M(gk3tZd!tMv4#J zj)Hx6hq{Zk*xQ*k>1Z#}i9@P8K-3BgBGT0|bR7rM~X76x2zdjo-)|eX`Mb9{3F&Qwb zMhD8?;aZBiF#$CJ$u5V5+GSq>ddVfx8Y923c4c3msLi_8cL8HJd=Hche?em{YJ{QZ zKaf%}6?C@b=TySHfp{ygHx5aPqSRUvGXT7b3JrY*CI4V&;FR9b?!6g6v39jowuW#l-^y zBUXgxx{_&8qeQCck0HY{2YcSUd+!Rc4rUJpKp2IooH=j&u#~Y88=EsRP9d8UcK*^^$6FKK1Ccm z*p7&S>+hgGt7r1MUa1{6V%ezYIippq)`YZpS-b9Sj@y&h=H}I*nN3CT>vrP7z4!KR zwGhp)+B~GlwIz5w&9%w1Z1xg-Rrp6C*)J_CC2+r3mwN@bCFhU+FmxQhyBeE06DGsM zZk*#0zFNgEMb`DQcbDAv{|--LpoU-4bim-)$}-X$x%mL~^M?xL8ICg`c{1ZlBjD`@ zNPz@Ij(^MsIMZ)Z)`uhp*Qmu9Z+np?0xKb~7qJU30NSXfQ0^T%5uv$KtG@ur^ic#_ zBzh3~#%GCS3b6(BoRo@w;V?`?BjXwWnZOnO3WqbL=I40|@*A4Y@D}xT#T_D$xHW;t z`dmW%x9l?TCOJnv`-xBEe)l?k?d#}HR|SbpNAMP_6`D&HaChTViV2%F04jX8GeKt1 zcL4&hp&s{BD!$(ltTI3{zBJ&SdkdUEuvxa=FWJbI335oA+MK2#Qp+#zs)4Fae*&91 zzfcC!Hb4icDv>qIA|^1(*>+P>+^p|zx)%-F_?;{Vh=xaNv*mNtIiNP5teONAgXA+X ztMcaK38%7xnKPI02X(6lN0p7JsN#~+KfNw;Ah*{S9zJ=x^ z2<_hBkc^g)5=i{XepcC16E_*zQj?x3)uzc4*;G`qeh5fNNVVmsMiu8)o0=Dd=BqhT zM#`fN6MgzF1_qY6VXZLIr!9{sO{XiXF-)te_NNW=`KerZ5C^v%@u}cx;E@|6Al!=N zmKM_waMRd6R6Raz?tA7c^sX36RIT8bA!sQ{$wV!?xEO0MXCsg0=XXW*$4flSA)N34 zGLfyGC=Djh&uchaOj={yQ)%jMgAAr8R)uxU%={kh66%HFwGz1s*C_fORAl>SGFno; z+|4d6k9$L+%&Fqi__95nvTp;7G#l{>1gK&^rO4jxCDMm!=9Ws9NX(Xp#I10gp=!C^ zsydT+O!%;c&{5QVfi1aam9ghl0%HvwxcFFau#K6@VVpEnOerF477)Z0Py8YE(eP{1 z$jSF9M(pkp0rj)d2oEe5r1d9hs~3r_9Mp71I7x`|#`r;?dr^V@rE~<6# zL{WS#$fuVhesII5EtSa_k(7#3R+xVJN0-iM!Jqy1X`D)yod-rj#Jpg{w7!s``!rRJ z-=?qcf~4Ixs?V)6{Z$y{)875A3S?9O0a7&jsCW^rxNJ%xvkca+pX#(+$--xFIwVrk zd(J`nDz!Qvp{s&z=UvRt_aoeJF;1d3JxPpn#h!q4msa_wj27lVh>SZI!fj?L7 z7{VWr6yA><96O(<8Lz=!6EaX?(J1f)tRA^SDi60n@iafo+I+u2k{IZvvI4~ZCw3m_ zp$_^PNx>XiJUF#y*>hc8kf9<0b9@KYP2o)kMUP{hgG#>~!D5O-q}q2>sgxm1KKt%z zR>Onq26xHQNVT}2 zQjigqZ-j(#+@Hw_AG23#&W0@5)rOt-U-II@>R_^3R|$M5d#vI<_OYqkPmKkjR0lV? z62IpuCYKh|Q9}%T;b2AdRL@h~omWA^e;+Cqx!>*vYx{?RtT*P$mkDUx0LTr|6;%Xt zT!18aOpVM>7V4I}(bZeez>rrZiLQBWL6hXeagN!G=i?HkJxxu_I;z|E`PS^v8I-D( zHYW|v`im0uGe=#{H_K$QI7?6wH8^$DuY_98`!08nPnF@4Lm~_@;G$mOxuIS!RFVJ= z?+H(YoRNF9?uGyr$*X~Y9)mv__{g&SBL>QrE?sNyw`ZDZfka4X?8QXzSsu$PN_ZV^ zhhx&$hSNFfA3vD7CU^P7?Y=QLKa$E_SeP6XisYB!QCSXGihH5`(Sd|8hyR^bB`}g9 zSPLGY$$jglLH}xJvDyX;QFu#)-$9cks?&%tH#Najsv7TpVXY@&UN=;U{aimdUalG) z=fn7z_!1kM`+y-U+`D<8w{d)Y3<4{*#cUv+2z9R(zDJ8DP!qP!+lFz# z(m9z!3^k&bOw=h=dre^->%B~0tsWmXU%rd-WOcbYSLd1G*J#t3w$C3Rc$y)f>>C>U zSv8dN6#oce8uI&N!DG$*o6muGR_pq1oN!*t(-uGeuTLB``i7)wZNjMolK5FA(TPW{3$Ocrmia+&0v*Aw8PwMnko*@ z;1p(0VpI&9h6TNpncKW{@FCkqBaW&mi?!W};z!uf;(9`Kr0oO?*VDm~qT5SGBn?z8 z?v$+uWnSYKmsCzgeKlW>_c}Mrz&UpoMDGPyF1+4MQ&dL|O46JUl|a9WwY>g{v&vMf z?FlX3Fov3qV|Bmym(#%OB9(BW zeSsSV(JS7kn!NYi^RL!wUuW3m#u4B^L#qT;aY=8(0~SvJFF$l;0bg%kB(EEivzSIy zxlDB)p7e{i3&T;uAng9`Zdy-3!lsMM@+F zW4EHDB?nz0{POjl7RC_OUrBm*;)k5L5Vf zbs@KB&}`76<~;rW$2o+nHGkf^&wC<6PkXK|lK(h<+6Hj)KGKBK>Y_9~i-nd-M69R$ zK$_*uN%s|{r(YJy3V}isqW4jUOELfWV@c}w(3Sn$g9~E#Cy;_L6?>qtSUk;u-oHbM z5%ALQBmG5TPV%4a;d{#>|Hj8+`i4sUe}C#H;7!=xvI$c)&*KT~T6VwlTrAYrGTwne zhWz!o4xhoP^6Y!62lcP{23iA?DSzj&G()^qf25)v&EYRCRV*@ndw*`{uCC`0+(Piz zJkEh9$vsnU2VD5DRabQJ)K@n%J+1-6V}E~LHl)LxN|wK)Yz)TvZ+m&$WZLJ6d12<~ zvqz0%+QE_U9PJ3)kPvD`-aB<@k7bx4r^*6>@O4Y5%g>?`cBjy`1h{$c3t3YBuXN0lbnb28$U$P4xsdA=H-!n z+wInsT9IQ@btm){Ax8KG9>1V5#w6ysW8SN#in~t}eR!<7LaP zCnRWk8XXSDXyW}B7S!yEcbl9}g`@rRGiAV}KO9>m)}v^`OKDhtk9_sGqV zgB5Z1>#DslSVM#dd{8m6C&EXqq6~puCfs@v5=>I-Hwy7T%Gl-x+#)dN-US4_Fsfg6 zIZo=kQlHO$@pQjcR|5i5_N{<=)RG5qEEm6s1m8&Debt!+BLw{vG7yrJ@k_{Mytg}d zsqiV_b>%BIHiNQ<_gJ?Pl1jAMv(2s)CHc?Ppx-CE>*>IPgUtcCtFgEb5ODbDTb=X* zyw0>GP_cb?l?I495fAL;Tw6VqY_qYJ6_~f%G$fwZV<9|FyWWFC(uc~!Ai!)TiNLBO zdz@9Z?+292J)VEQX%Tv~;Q?8~PN7>jGGQ^JDBdT;Gg!5rr>-IOs7qgZQO^j-(z1a& z`kLPkege738Byo@n$HBBYnEtHMqO=r@j7Xt0f=&JobEjTEKTn?`K{jvUFefaMZLzeccqSU8-?w9uP z0m@xJQYe=SdU$Z-x@;j<*Vcl_lT-lf?@N!Sg@iy);;PW1bp0EKBHV(T5MZsNFflQ~ zYQBktYFOQlxn$yQ4GcAsO;G5hiDoEecIvhL_2Z&CU{ErVJzg$AZzer};99O$!s>kX zJ7}Tp>BJhiiL>e#{h-_L^F)8G^^WZAF>!{I7<$12ma9#XvEd-zlnIwEq~UwX`zinR zH-KfM^8j8B{d3#XHq9nba@$c-w-OA9(ErmfiChEq?Op!kw%>m1JOOS;k9LahNm;}8 zV{%H$`J8@)E{l?iKe2dM7L8u5dqJh5^nN@xto<3~zv5qng+|3mt_&+y)2Sxk^ zn3?=pfHI&n^5ntuR)QedOL%y66#lJW;QuBtk@al@R9OLZS)GB5)G!c9plt%P$iIF1 zYWn}5l(h*lI`jiCp!3_UK2W;wR$#9)Q~9~a(GXOhrux^Q-hSH%zs>ZTxR_W6Ak!eD zqGD34|JI=C^Nn?gZ1n&0kF*|OKU6_F`QEz9#VX!_iYJQsOfjE}3)=)u!&l+{{iK|b zz}JL2*j*rsv6QAu+uMgZ0%A)@pv z;Gin4Z<&M8Vbii-YkjP2G|Zs0i*6sb_lB`m&@i?jdfQ5Q_LME!G3 z;skdRFIA#58e%hf)!YVQeq3Njg{CbrB4Wwv#YM1sb;zpzcjxB?vz1)y&a=a2u`5hQ z{rqWouHw}F)b&lZckKuJ`08o|pyUA^7A7S>9V+HNqDffKXt~dgI9S97o|G%3G&}ZU z{EP!Bx_T(+Re(Rq*n8k74^}lJu|oJcmI>|7_n%PkZGC6}Z!PnzrltmiAoslY2i0Jp zIyKO}E@u`<@zPhoJ)^4x_i^t9RI7h_K#O#1L1mlONP(;rz3}GI`a2MP-)bU`L&&0T?xiX7I)btF%^7x z@;o`@4GX1n?VR=BrvD%xbCMBrZUAApG}pBPrz(M@!tOl$Wexs6v-h@rTi^W7vzktC zjrN2CpZ7#~eAI?Gap8Z=Y?&&IzCk!Ce>jI@BAgKax-L}W&(+vR00u@KcP>IXdodZ2A|MQg~AurTQayLv* z$>o?oGLUH6ZWRr3N=gAhg~;dIQ_)aX1KH(mf`2_tByTDLFr7aUm5Llh1BEKBff65k z=htu%Le+l*gn!(jAFxBF$fV+FsFw7GK)}to+wjE)iv1=-h<@_st)+vZ{pYw03?Y{Q zShHWk;BMQI0%az4KG(s^|HhE}fN|uWvHa$ohFwnl-@rxjliwMu z3Qw-l{WrLGP^ljQ7iavQ9Z&2(%i;wa2j8m<&F#=f614$qz-A7fNA zV%J|`;rMw2wTFgGiWDdUjPm?WX)YH-0KeDtmzCsS$HI{EuI<~<(e3EUUylaNW%v8{ zYJH?4B47qh%AKF0{_cSPT9@ufAWRR%q+GBqM1*aEuXQugg`w7k5U{L9`5wgB3K^n1`QSUaRgFKL79!uIc2 z#JxP-?_Ci_-=6ILxZLu8BV_OaE*a`P48R`$&IvE)o4?qt>#F^~CxZkgk70wUD&~LR zJC_7Psm-@bK}oF*Y*-Y39in%?0v8x7CzqbC<&Wr1G0JN^Yq+mE8@8N2i?CBVogFP` z-xNtM&#Q83j>tg09j$)(9+J>09NqpI2=thJwYi%-9HHuq#gJl3@gk-e2^UR!9gy(E z1hP17iw&1xs|GAqKL0unHHynwEa{7NH4;xYeNOv&8uv`>y)Uk_^K_k7Y8`l-jtY)y zK#awA9nln?e4`~F{hgjQ&TL7^Bv`6&$QiKD{j_~0zjuGI#;2_k|=Au;KS=M!NFIWj(Se^zJ0o4$&t0!)!n~%1`$?@>?HFmblzy4Yvd`(O)T-q&6YPdRdAg>Fa2z9Bj)i*fmJvU=a|dn z;*;de{(^k+M)&nZdZqzc_@KR~Yqii#>z~4_73uy-2_OI47p z!)N1cPo%f%ppQ=1=*mmX%5b;P36-B*;YZyc|I7D&J`rli`A!#e> ziaxj&~uOp^bQP}o7*@IN*am9GU$o|U#a)U zFBEt85BleshY{1OKO3|)duL%>YdE>x^4GI(&i(#@o!&fvg3Jzs5x95u`1B+?Q~=S4u=UzHoiBr@*vL!hRA7FE%vw<^2<>fr1T6s^J-MEdr-3r9ViP|Jh;{`n)_{L zhJGoI+$}~5+5BFRAdxC0zXfc6?FN9;O0noH_7p}iLDMxvL9EoER4r7FH_G{~*4+U? z(nQi9>L3R*BeY>Azdo}Avk|D`L;Xef_hwD7p@!-o3u#;|1cizN1&S!>h(UuHBNdHE zym*Y%sBDM0Ky_j9amU?&ikiMx3y9LLxsb}*F{=)p=KWM{5 zA_u1;2F)3jufNiMjqhED3|5Xw1_p-4U=_3sk-eSagMdR3a}=ZMY$(a^88Q@@x=||r zGL;N|!U3NyN{z1d{Au!DLzdF!NNkoM^f8PCF8Xu{h~Gsuk^&6*b24?AYQ8)DiPR-d z?cBMekRh5Qdc|yQ(H+n1fgU+3E^67-C?*TxqMEB3%)KfdEAh5w2M>=Wkcl({^`$&& z3T7I)`l`l?j|fFvW(}@qyj)i4Y1SaOnh=SbHu$Ne8$s63ZBE&aW-iClWua(?UlPjH z$`m3kk^khH+Dp_SDtOkpmDbZd=SHaAo;`>hl!bF~X!~6`DGf1PTcT7faI%_q7@R@8 zZ9bCk--oynMLbz%`1DGxinv`oMy#cqD{W>LUeG!5^N8Yds#tUD^lCs^hnj;Opvu$H z%Ze>KXHo@#&p}KVZ7crnF%#%6VS7pzpmfa&Q@r6Djd0M^Ecq5LoFZ(tyMLlgmcwn# z_>5lA#*U?ktQq%7fd54X;;Gm0qHkO1!}%*xWz5l3H3@*aRl7S_ICCPQQ#*ndg==im z#4yS69&@7>m@yIUNiET}ZX~-CS2*N2e$8UJmvZ4+@(6zuAwZRieZw2&rMz@$a+6sz z{=wM(?w4J_o)7z>Q~tk@900$~fE`s{Ds}YVgYVmG)&*w`ut1OO=bpweZOn%I8)dgo zAqA%2bJj@jOp31g0&%fBZ59;89|D*YO*v-W>k7huuIbGHNFP#&(nj%eA|;-!4)Nl9 z0hJQEK()i!z1!HFFwm6*5Za^L8A*f50~)(}ojQu zKR(4pMKEp8$JXn&j}?Gs+t$_=Iv5od)f@m$tavP_$L$i)OT9BeMlm+&HH`{oqj)6SSvYz6U)X z9nryz1Fm%$WjdmJ*blj^CG+-qX9-LON=3q5hQF~#Xhgf;Gs*SOmbdoje;(i3T?EqA z1eh+(Z)|wOOLGD36L{WWrDC87$`utF!OrnMzx1;%V{;p939QKap%qK#DB=6SA57fl za!5yTWE%Ub;HzTn?$s_KE-u)XzH~V9lPAOY+t^7NmTOh@o{*= zJznlMh4V>*Ow?L_GQDX)0PWs|Db@3+HL!~~mK~<&&WC8mrYF3bgT)n6>!A1V4Q+CA zy1o%gZkj*3Yh5{1|0y~rKe(~#eYEEOl{w(gYW!ScW3+=YYg*ix$1aV=9bThzsZgii z$UXYCO@M*PbhPEd`dc~@gjnz7qK^98xq`tP3en(O^OR=6Oht7yBO?=2k|l5|W&L?Y zu2iDt4~VGshEhE4OM3?2U+zX|;eUK~KIPMYc6|2^i&0FFPa)`6R8&gDHp>!}la;LG zietZ2KMmi>lRfS3#PyjI6wP z8h6jKw4TGp#>XdnKLPa|Z<>H_x|g3WX;dr0f!ZY@TJ+cot*ojaS0VWF-U*5dq?J$3IyP09j1x8k z(42|2H4B)fa})40%vv?-w!_dx6Xsm%L(!BEDc1Tu+rV&hnam@2s95q!RP*b8Qn@P5 z9ty!uG<;I{4CS&N(~B$HCM=h0}El0)gU6j5X^U3X) ztP^&>rpKKFsx3Zb(W)=69XlrsHGjMNMR(jFH2ry$Dw}A6vxL+Na_2$meO2UkwXV52 z{0ypL2T4_or)@pd;ntnLVS{s30dgGu{?;Ij#M!KR(Qv|_yX;P-w^hx%ftX0kmutc} z)C0&O2EDZ~!h4+S4RxI$1ryVZ1#GlSUYg4vg+d9PV%|iSlud(N`-R|Wu@=e{6|M3T zy8JGaiPb{~9-9y>#t_x81Y0?+4U>suRiNWY{09qDW^Ky{k0J==%L)jYiU)Dl z;}5#5!jDISRCymNG72m^oM`$XxMuR`L^6_Z-#$nnNDNTgRvHplD)TzHB{32^-GxloLo9O{caHU7@ee#YWT^< z9#KbtUlsfq2BW3q#@dKABCv>{;apLXEX1C%SuL4{TY>p(=T zR5yK(AsnfRzg=5Q@c6OdKL z8Sbb+d--Zx)k1uEr<`!INjih9G);{CpB)p5`OSOc7I(v4HqL6}vol^^Jp@*wEOG|9 zh9a(5a27vt!bHrwqiwoXI(I0w!kh00%a4zhhb2d6x*nsHR6fZRlLjYYhZ#M@t$AZ=$6fB^?|vaho)Iv~Spaibpih;5d`+Obq=v|M6C(i2 zII@O~=+sV7tXW`M9=uIY zssHlO$gzI?BZ!=WcRKmn#yHRmw}XUbSi37f84uuH$-08Stl;{g<+Xn^qcjlnQPewA z<-l6!ZiadPD|j}>SnK7%q^iJEcBlQcA>AMZe^Oz2nWY>pA*WTlCc40Dac;@*BI0MW zaIq=we;X@eq6}Z|u#&8jqN1TjJZ3>#US4lt#nsi1{F)=lp2V2~ybWDxj(F;P!Dl*% zrHw+#x+Y!3qF{w!)vDd!tA~7IJ)G@vl=1PBcf=k?kEgBP!WHpxLj~Qf${GA>-?=LX zckrvKp;dG2*EF68s`eQ=TeYrk9sjhIVd++#^5>V}KKI@dEY12~r=>)_4#54e;-3Dg zZ(FY)SWj-7*Eteb7{PY9AL)jF2vMUZO4yJ5IS8u=OIt&Ra5GSDOJE@wRtjh5Lz9-D zx@fRgY(jYB3i3%=UyE_|Dg5T$h*QtEnea=`(~$E1rr`C4S+Ax!(NNIhDA}Z_YceC9GCYwej;Uzjo}T(Z+pXS6dsUj$Z5gpwFaV zGZ@ckLv^ttphq&D?XBrBiSCkoWvmij;=3(H>iHKukYx9ULN*`>A}poreM|i$Cu3qv zZqr*yz(NiByg#Ama%1{NqY=gl1(`zV`;4RazN$|JOJ6hU(buD_o2&@=c2o;{vEd`csyoWAwi88V zj}NMt*a7Jz6@}y2Oz#c1&qhrVU0ork-QZa3>M9vwsd~3Y0;2V^9X1k-u;=r8wgfj6 z=M~)S$0wB?*x&Y9u6tS`%P59HAxO4*NmYT73^VLb2fUsECzy{Ny#t>T@dE8cY97FL zd{s2nl8y2jLM7yVAJS9OjA|1O7C|(9*;ZwF5KN0J@%`wITS`N}D2T9_gGkVj%w;m_ z_okv<}x%uorUFL20G~_Ve2ka-uhIL<5SUPW?>7v#|uSx5xBi zWO6G87ym@lk?q;Y=ymv$H57_||H$W7e5+-YYYVOd)V4fLf{1HU3kKzkHLVtFhXt=^ z-&JB(cmn09M2?JVzIp!}HiiDWaGF8u-&g=#^2C5%zwrHsvPmCyISoLqJixCgY zgFaGlFu}~*qh%djMCeTty@oq^ULusfTq65ebf<{e@=+Nm%||AAE=-7YYt~DFZYU$v zZt{56u#jxcg5=Lp53Gbd^@qLM8Th3IHD3z`cT~1MIJdWaLuIXq6%3cQYbbR1o)E<@ z1>KiOEEPq5W=1!TT@yMl%-ophI&$>utvm0|?xnPRPR|sFESE1V zyS@wUYiuNjpqZ)Jtn8FLI{i{q9=k;G2y;nao|lC-Xg?7u!!gFRw!oP~X!P$Af%cyC zl=EySatITLy(&a42Q~KxT6=VM4jo5?o3NxsCLzuBTjY zBF{$a=hug`y+4fAx;v*g&vkYK5^PVBBi5RWtay#(aomoj_F{CZHHX7YidTMJ`KZ$4 zn&R8FmFiPY3FK3MCmn~pK4KI z-VX8MDjULv-wN86*F4S=bx*UTPjUW$Z74DRl^R5rtXAPUFS1Uf?cvzwZo`ulbEV;jdh`}YK z93zPHUZW_wQIt|52_YW{RGBOjC_7^|QCz}KG##FrZaFdiAp~e*$4V&TA}s2 z76^K%N1J93`>r6U7F8G=)SAK(ZFr-nkuRZF<9M`Mx-WVkUbE~jTwO#K(yNm<++0_R zB0GI7>$||6VoCPQ`8|2x{sr{Xu4}1U!V4P2NXVfZs~onJwGC)JgxVp(vwl=pkC5m816@2y{HsDQ-bgql`ZnZ(W41gOcj+;1?)5` zGt;L)aR#<20RaK^WUO^OpKlRNml5|L=)E^?d6SgV!9(?O&J3Wk{-S<~>=ik9PQF&_WoC z)rVDduDuY_2|7op6!1J649&^0_c&wY33u&vrh2OnS`#A_2rrdg5|e&W*gO+srk=1d z9jy_3354Nw>2jcLOo}bG_!I@_uH=-f$OjilVSjH;Y}{PSe6iT`+g?X++_YZ1wPJlc z&yUc{P6Y)08YXdQ7MqtowM>4eaFZyHK6^EnYxcc5`b6xXtdj=oTx~#63zeU!Hh0SI&b)J#$+e^BZHGROXf-YwWE%AF!!8$;gAR zS8wC;o!UOoKMr|iS;O>|xqDzb1K_0m?WvL^T0y!=(L21wUcDakXg52EgbOe| zxvKe`DHVyACvdgTO(Qdc?6mXBnBjih>6%9@xYzC%nVy>v@4usdE`pB~z5=UyPitoZ z27~>b$XYm0vB&sWYu~}wl8F*)Zy$d8E(X+Od_ou0F+Rtnn_z%7VNCCkJ_ZBni#gA* zEhy-934l)BggVtCn~T}FZ7_lbYa5gq)$&Cnwb6T;FG<)O9Ugz(>MGTGcz>2BXVA=s zMeeO!rVwSkUo}l%@~$*s4^mh!Zie3(k#-*NeIOGxCgmvS;?&mlGK_)7#e8OAy}EQ& zzghhX_G0E6a2%)PgAoZ18m}+z9-7v=-2U+nLAsJG-c#W}_Z10+*OnsaZ?LYg;xRL6zIRF>n(6}VrOT^^~cx5 z22TXmaGA5ZpU$eW7ZeCPJ=D^@b)qNc^W(-!43+^54ukyI z`RC(U#Ag_HEO*xB_VxPy$H_{DY#qIl`EptK=wcmi0C!y6&9i2LGn9)eIzu2bNIk}L z=K#&^y_HpCbx7`R!#vlo13gwamfa?Bfo|89+p9P)K05`j0rZY9ToBY`O!Z-vYDa}- zSe&tw`!iSJTeFC%jd@gq{Ov?>PfjS9ESzsc1)9MJZv$>)=0k#Bvh<`X*gy@kYVGOt zV|RfHbaQdieEZj(X#XbW% z^@y~RH-MB&$QF#gUlX`V222>ZU0>XG z3_+!AEho1N=bMzNEiN7z1y}+X9I{ntrDG}~+XlaaP+<85sTYfXJTAP@qPb_qw+f@n- z%tR1#KgqNZG(99D*!BlSgr)u2qRv^8C%jqr0jEJ#ji@Y4lk4s~Lr%H6t6|u9DUS%< zuGrl>PZ@J*mJFn)1}!f}P*u$P{*L_o#Y$#ZnV zy+_yYaoY;3>^mt>SUZcOW1=znU=p0>Y2F7)_%*{SCh+$T=SSmDddhr9$kE(2c zlV8gIw)dSaKKyVI&-Gas26fH{svgU1>Kin*{cQM~olR3cA$*wxaQsC*mY3%YK-KEx zLhXHbcV$MB$AO2nkRW>A68zvXcxWgwylccsB_&*%BS$9xPKGFKma%)rr|@ZIO2f)y z8>&{W#_W2W>iNy5LQOU>!l0pk*WI!;sN9chv!*5vI{|8AO`o|7&9tW!01XF_0O}8u zrD^GZ7&MHQ&?A~DA61F=kLm2XxpR%T9HO09D||afwp4KphZ9FC)s_deB3&w?BFAw~ zJd&JcB%L2TJ#1@}VvzUxAFOp^`5y9glrlamqxFih^xp3Q-H}*IfH#YbHnQo2f;`t|{bM-XU9Hkg7Gx!QVf&=;5NK&*_n|inz=2scbFHJ$8M7;oqQ- zf-vam_R~?YW!7Pwa}$)OSTR#2@v92X9T{5#UwL@AWUS^32zw6H7(5-s3N&mJQ02Bm zG(ZF~A?wjjqaHDy)LKvfWmNZag$@tI#YQlX`e6J{o$8f=dNGB&%&scK_H;*OWuTi8 z19tY<2Ux=Dr5e1O@+tD!E9{WeTA8J-aIQ{fQ#GpPcvtfAx@4}_t)140mBRYxI=3CP z=shVanT$uqg|xh|O4d}D8c9DOvy|`kEsNzr0YXJ{%%4=EQ0xh&Dr*!}AGl)k_jGYPu~s9B0(L}oihey$ zeCsflZ{=B0*+I-uxu;m?Xru||O65xPa@4!=8b%hDQG=qbTHQ|(4GO!EeZnrZ2bZ=_@dZ)Y@e=|j zZGG1%%$AYmspa*_VfVV5%w9^Lrrl<9su}UdNx3LrR@cT9GPD4wh>;t)wLn2l zPZ&pv;9_)wJ{)?X06!64)>r(^myR%8=jl;Q4=}RPyu!bg9NM^@>&N#?5 zB$%6bI@owVU!;Q05U=pm(qlDw(dc|elbR3VCrU-~n#^U|1~+k7ZfcIZ7W_*Q^#H-h zj{rYsYMU^ohMxEr3mOck{Ar%nJKqb`>{?h|2W$mudbp<69>vkuVJq!w0{06lUUCbF zXG(h@+-DW$@MZyCG3!srQb=YB6&YDuA*`CpL zpiLa*p0u(_+CM#ibTV{~uV5T3)ULPZZ27aY{qv0bM%`IvTcBA$XslT=g@Yt|}h)-{$*a1j7}DprZ49iEHTP zl;CFkM6h9w%{M)sxu0kE5#{@CkXj~p-^mJ*LGAKq8h)=_<%7%C>9l8zbFfMHKuGh< zLw!&%X8><|=Q=>$w-V~FEZsCELK%6;!!N3FkAA&gv#476B(eC@h(EXIF56nZ-53bb zza7S~TQ)REF|Lz`Vw_U2u&0p|`&OK69KE6+KU2FPeVa^huFaUUz35$YZ)4$?WGY|J zJ-I>Z{5Oyl&HYAH{|!+%qH_Nh8AX>6i9a9xla=^RnT7Bu>?1Cj9mk9I$f)Z6jTg)T zicH2^nze~#9;(+*EMkTR0!oEQVnlpK(Z|*spn2!5_A&dGOS}oFKbYSi=aasLozguy zu_8fi7a{tac`UXHz+`w#CeH5E7-$n$a3wtrSjFW?9^MF)xpHLG39SJ;Lum!i7J5qO zbYcr355y8V<_DbD{+$4~g|;a|Dd6Zj?EHV-PZq^-Wwi)_U;Mvd^gn&+P>}X}=`QJ^JEdDXr5i*-y1P4uM!FfgLrUt|c*pnt^LYV3 zJve3tX7;}JwXay`XPs+8733seA-_h3f`WSW@q?HW6cmgR6cn@u;tSw64vQY1U=ZH}7(3nuL&u;<#LqWfWg8%az3Q7u^@ZaZ3&@_L) z2L=i%*c=M(@Aqf{kI(-;06)N||9*tchW_6Xvtj;uH;hp>>_5+;HJ(5Ac}^DsJRsS9 z&~$`?Lcx0efrd&=$A^LvhWaQbqT&jDn1SGlBR<=g^(zzo!~6Fqt;Hd45Xs1{qFS&0 zTMZzpdcSJ3z5Q`;Q1qe2F;H^I-nCw5j=!hbYh5|vkF#oM%#T}IqA5ezM6I7o zI8FUOXGCUwK>g?Bz?-w9kbb-=h7e|t(EYEi9o1xT;6#S*;_|kz`c-ej_4W1qoBP{~ zvrYukd4+wzCZ%*@@1?+C~3Pu_6w@Hkxcu4jgai}h%r{wRjg zPp$48-oN*#Yb>Ub)wS*6Jv}{#+p5k>VHK04rtJ9ecU^uN8RLD*s(LxgX z`ud^#>hmF?p`AUUSZ6C9C!HfBBdT)JW1|0d$q!=~9Ib(TnH2v<#~s7%;gsHjD$7|$ ztJOB*S#8Hxzklro@HlSkpRRRE=vSg&pUhRl&g!@jOGJ}cUpZ#%0qwmR^LY%IlH+?t z>V5NV5aJ`9#Mm2xK^~KuYSFX$ifc*#Dj~u4^N+MdK&ufgq zy3*+SdY3bAbqxX`Z+?^EWCOWC{{(*3h{mpr3CDkK!Wuu!mev4G6iwZV=Y?#`)8idJ zmyPyW3Wx0q5uUc4-+bFnrbmQ$_{K){m>`=Q1_nl-MPFo03_AbKS^$;La+9+}iNLRM z(QIR|R87aS1DL^eFE0t5kT4wREc~ykYTha;@jUT6Kl7xM3|Y*kO&RX4PxL%V)O3}U zVk_S(vg^9<<#AsOv#lQ=M^&BEA{WSIgdHAQX?x#pJrywt2oT3n%lG}hJm|bSZo9L& zxxHQQC-q@>?(6L(fcChYRtN2lf15GazdD@1*)J|Xyi7<(ghnj*yf1$?QL@1ilg^7u2inH{q6ZrA*?!@(K-qil?sJ?r4b{27c1Npxf zngln5V}y+W>WdIDG|Z_a^Ew}-HrAym)u%V5M5YWw)bcVj$eI4pA_gs49Gh_e@X*;( zb#AU`sQtQ^SX^2&lyUOm?mBJkn`m%MN=hg&K%raRFIf{CfXgzlCW&3dr?N$a)YT!q2SQT?hgSYJXSs8YL109jV{--Sx}fl47C z9IN(5%OmIe_s9cgA)(bC&eofa@H}0XQqaredQ1kvmyf17_}}?1z)bBmpPwv0;uUO_ zRnJ@X1@;41w|AcVDbD(oi1vlh!!KnlIukt}2A3Ko&Arq0?rmN(ouR?OP9*AdeQh77 zvB}AuL-&>3LU%?J50l_yxm76~YI{6>vldP|st+t<7$N* zVnM!}eFPoil?vxkHl5>Rsb=C6a9G6K6IZ=tkRc%5;7 z7BTaYq=D}p-_t5YgHa`DSYtBF#;VRWsh1-o)^nIa@=99wB}T-O#e`EXt6rw`7HZKd z#oC%+UtcItA)U3*;y3XVU}$F_)Y`7Lt$7&~gaGRb$;I|acX|7xmQ^HODe8#wzpJ)( zmT(F#>x&)71{69?d&6O&%b&`T=-Iu&W#U?W`SMx1M2DkQSD|V&+bl2kz}jm3V%Js=#D$!)AJE=OS~3`_7Vd>~cHJmXr9^UAdy_cF4Q_dY6P{q1Lm^g%Ko>jTn785H6U1*IW=JuV7o=V&o8-$ z@VGS59`#F9@4sUZqN4+Adxw_CL|UbL;=_aR1kL|9=Ce zV~RzzKH)i##P#!sAv{MxjHe-Xgq-5975op_@3^Q%K&^wIQa+zM7+ul4b z&&$EZC7?Ntkbh};OS$2g@nHCxX2^wZ$R!RoWz1*Bei-uD#jm*|WWuWVn37kkQ}f*n zD{F-dR~Gg`mf%7DdFqUhBQ*>Xnh)x&1$pX zIL-Ip)6@2|YSNn~iZ7C-C);|_6w$P3jD|2_C}4Aw7;c?io_~>_2tHWJBssl0_l-7P z=e=ebvyyJBJ*ITib>L4LW|NN2F;*lg{h%AGzEH(HrgMce1NxE>e@&06VWQchLsRn$ zCFiecKT4hLKYTk}+iQWDJ@;{N;Jua!=VX;bOe!UKIES)c*1JwKKRiY%sfC?Z)F2^K zm8K$D5H7gqLzI6)%VK~UFI%YTsTnxO`zV^?GKTAMM@?Oc5&_2`9EAN7MQAXbZ z&97^)E^XG_&bH94CdvQn#E}8M$W?vzSvni<%&l{>rG^H?l-$)O+;L-#1yXMJQeu-L z<7MWlH^L4I#Sdz<6gT1S?%oW{B0zhum=Mq$h%snZH)i zsA%BwA&{MONjC3yj4U_^TUbdd4g3^fQL?rMujDT283JY!3`{e@^-gF+G$dh-7|#aA ztS)CC_E+azjKWFnb^;>*T<>KFa4dJHY9jfBZrUEIeEp{hqr-6d_g4NT{RL~n@2fNm z5J56-;p6&ZK`-7`eMHX*OB_jqOSNXCt()_ZkNbC9P~ZZV_32mFQuRX`CCkB>=#JbI zo>xR4dosyC&UvtZ)DGDrtMQ*`(nQo6EO6F9)M9@n0nV>t0Mp!7Txb2;|56>b&s&Dy zUAG7?Z9`o@N$*vFWaX6SMkG4Ow&M!p+qrqz=PE0(e1m6Ks_zU#B-p`^@JGQv>Tiu3 z_%xrKuc|=0-x=XmkHJ)%=ytX9lYtnioUnAIopUI%DD|yVltqx-SA$*r`JcbUN-PMq z{wF4X=sjP?#>0kizNJgQVQ<-kM)e)kj97mvt&Mwqq*(dP$i#PNxTg9r;r{Ir_Ml?i zlK{2Szqi4T>1Vmv$=BnCpnkX%9hmkRbT)&37!i)pJBviDWgr}kySvy1pDHac@xS2F z7qjAd9%V{!%L|@@Al`^>3S=dl%mPypQhy2^&;~|K^ z$+kyy85jqmy+4KKEnXWMWkumnwWnbi5RFOy@783)6#=7KQ`PL_e5412c^wRImjvBr zL*f=2QYm-(%dXszK}-8T8+1RSE6Jzn+AzcxAs>P^trln|T}NEG{hviS8%@9x`L7aA zAOmE!QnGI&UA_LwerYn_qdT!xZR~JO^1qE#;DOnp68n@B16AcB;E8 zC!Oc!E07|(4iMgc`E8fu>=jj=WYaU4@d*sKB5QG^0_d7xNm4ItK!A#b^1QQcy;KvE zkjOCxCq7wt++7_dbK8>vGC49i8Q<}~aVPWBhAYXhIZ*UB@o?O2gQs#S_HJWDPe9P% zb68-PwVX?(yYCkQ;sKVGl~o21o|w;CS0;_~)ym2WARhx7$6B6JQc_G-ncDCDd_q}{?*YAJce*ChO#alm zP_8F*VfS#IxiDz|*`wAGheMC; zf(&M8{HMMcT!Vvy+;@l72G#SYy?A=~Z%5BZ(zyBo9AS5JYC!%a)92A`I8$KJQ%{cn zOpJW3FM7e521~R>Wo8O;yqXAHYXq5j#M%(LhdX11<*_b5X^GAthwFHlP ztZ!BpDP!X%=5RVs^$lWKmdlD;_MH1phKt<@$1FYb+!b~%x7a$>)E-*e~oc)J7n7EHpL zb@wtJJxVQJE43J(vzZQEAzc~@%d!FIMRW14-T-q!YUly=T6 z65^7K+dMg%v?D9cbU?~#^ueCE=}(AYcKEFH`CN{B_6o9WRvK>YZhlS4i%hKDFmFY> ziW~Z&SvEncs;etMA8B3qy567lM;`cdeXBuuxI1aLg-JbW+#$Jmv4U@d3y;TuhpnEN z5Re$OH&p5|w2L8p1*Wr2OXidJmqlRRBT8cqvq*26tpM4WK^MC$Si6G*^q|R`P zb@Q!0X82UMRx>5XcIVc9TTvR}oab?Uyp4Y#)Fg%Q65kih*!&WZ!;OumH5)CbT__E} zkBFiv{13i5)9G*E_mx9;wWebv5SZMw=xczrjc8OjI5^mKAyH#jQ?O~(CEr{Vprh-5 zVJa<7vkVunFk$>u)#A8X?407K?1s5sA-__Ra>_>!i;Kqoc;=sha*v!l*cof`Z zSIRJHEpb$0UL(V_n~MB|;Yxu!cc<1E-}d(QN=_D&aKFb0XwVYAPC!j^Y-z&Hb(h#R zN2&5XVa{$HeL@7@9iZH0Jd>OwYK{0>gq+0HenvS*Jj8A+x)Zo=ewFMv(RI62V4fT* z`1p5hgF&MnqbNM_Ac68xTLsvioQvo%7o4k*J)qOKp^z8lj^zX+x@LAW5ZCIibRG_CiJFPj02Mm6jW5H z4R0;8j78Q1Zb$h}*zL{fMKL74ZYLLkbiUE(w@e|Bdg{Y*m$F!qQ&7Ow?2mVeDh?vF z=T{+}^666^*aj_np1GZNB19gXg;HmB=(sE!<8+S+Jy|`P>;~mqCSRwWWwk^D7>)Jq z3;x7Jjuiy&lAbr7VH9CBedP($Q4sr?Gpo2V#Yfa}CAoSIWz9=wlFQcX6*fktVpN?! zA>(TSXt#=_6pF-NDxvY-J4)ACD#KwbX(pz$7S%N8%AEOJylh!_t@)l%e(mEUE>QXUu! z%Jo>xgRFr7rJ#n6Q75f|(t5+NDin&%I*f9nVk-!-*07JBkc7krOWh7Bh^)!VFrg+C zz3MCZ0cLTUtYM^8N%%)?L(a;Wc`>Ur>qHFo6wM@r64@``G?RqwrhTmbl8VPVC^$N4f2s>L zo}|M4iFw!X7MCq8rS<>poP;Z>p95Cev8F@^-ed8-FSEo z0BctCtTh$@Tpw!*tfpE0Q3~bIhQvk^VY_)aVw{EFZPfb8u|v8^ac(NycG{`c?q%*I z%+L9UES+pZS^3WxxN0-vobHkOqn@!qKUjaq?}~Wy4PV38Su%B zWQTE25EyLK=qGq~(m{rCyAnqHc)^ktC6q+E0iulKU8EyykYQnyp5w! zcF5>gB*oxOWd9Pza=pd>5hIIe;k;p-1Psxd92LrmUd6BYAg`#z#G;yS#((tvU)wVf zz{L}as*y4Zk175q9=*&E&Z9TFd?3@=yPxeTF!Ygt?53|tEnRB=!AiJ(3bttJ3;aJ9 ze&%7?A;G*GNcSXsjFRuGx_`NOLqv!$G+2;5@+T?vngKeRKU+Bmxk};=-fkU5T|^Cm zi<)78c<+27_iyn_xt75Ii_*hWFKaD}q!Q#?YL#DCgd3y>~NhOX(N|6U>i@Zoo&AHg(!?sC}~&3J8y79hbagxbETM~q#_ z`X`Y3rMEs^`mW~fJbRPJO|s)xO-{>0q8hS4!^P`4117jCAmBo&@DYZD%rmvo!_fUR zrr>~-aB>yfFEj3Kk}m z33whe2Hfgm&-d#LT{MK8={v*`)vW>OYui!NZYjyJ1ku`qKAl3Cnl!?>Aq)icP+8&G zpAwV&-q58ZRbfMN%D;^!{Q@Y?An>10TyKM2)k$m7DD4m3J7~COe@rM8Xi$ znf-T0P?!aX?{U75<4}&DA}NTq;*7)0hBN=B<5~`3LC&*}ZKvmgovOmLPgRGqiF=S~ z74Vu+zIuvH3&Q>cZF9~*w0w`cYO=et9z0JrK1s1E1>0loR`9d-!~Uaq&zz1@SwRCe z?d&5Kx;ecATU9JNJub)JYRoReS8E`ua-4&5d<|)wH&HvrwnV+a{r0qen2iG6&+(~g2r0% zc~2Rq2Apoth)Id}4OC7)s;GahYuEL7i7Knc5htYGnn71$1$tcNgKvEJBJ)Ul)5K2c165T!$e3 zdRN3${3C;?@E`R@M4rtE2GKjoBC)%|So61ZkVGZjeCd$i=-3crwjKe$@GzKEou61H zG?lua#T}$$>fPK4!C~mo=wUoV6$$y-+taigWfU>@E>xUPeSe?q=qTa*maL00=7!Zq zkLt)$=?{hX1Ht`#|2ZPCjMndkv@i5;8Tnf-E-*P+vNyI1q#Sccym(q$(`SHbDTMvS zV|yHq?a*1fRWm*dU7XEu=!S!*xL|P4!>*bU^c^3Q&c19fgtg=a{Hjf5ycd%iPu*GB zPq*rx{7CGtpDW(r!IO=jmm)hCK6jkiCft%$>}#F?DV^t)tEZtF;d$kvQ*A4GZ)?38 zy?S5mmAn;HBV<3*`;F5f>`QiSw5_j`$F>$hlM0L+RmWg2 zLQmuRtsrswQWa+b+z@p(Zq@nit}f-c8KR1Kh^B%R7HFxz>72L+|H8QfMQQxcVsOI+ z9r^Z-3v1+$lKNX8D?ek5cQ)34Yt}z2&=W8#4_9T_CI2(|2g|;2n){{IV6f(}BH>)|Qr1+5EtIF!Ws+YyU4A5Y2AYIW9!4{%~<+XWidboOYE1ipi3$ED4WWcbSns zUJVdf{3(91kdOI;^%b}xHe@^S zAfWQ)Pa}8!PyUmE#0>FzLk_cV_rRc1^g;@o` zw_?9<@z2~tiEzjnQ&z>e?=cCZr5D7KqcCyQ^5KUlgv0SQAH8S>5tpg&YS`2US<%eI z_+VOnne{58;O{`LMl`G!=am{?=F>i14PLXL@6@7l8P;OFosd=q?q%XL9ipsItF1Zp z#PAwu@U}T73as1sJmusGx7*ax7*2Zgg5UA_ZHe56UR7eU%TA3~B}ns)H^L=RBVMh{ zx`7&jaJT-`hV(kM0K+ntIDF*?NTD^%S3WKEn(=%f40yk@Bwor^_~11xh1=D@b$&d?Y9lz98qe+ zR7o;0o{~cI?)*6ol3R?0K1TcPoqMk z*<0%V^ZRDrfypN-jm01C791~?ad`^3lc{jx`^aI~k=2c0~;w zMRa|SzYm!1uiKw`e-+$zE)7w$yAs5PvMh+#G}Y%H(D}2n>r7Z02*+Q_wj(qR%_SZ zw(NngI4SF$`>Ur&4qyVfi~y>+V1@)lsv%IRdyF3~H{*S(vno8roSK}hFzgLO1{2#t zYmqO$_-!#(ge?5{I!)hQPN|1PKIex!V4fH;y*XXqU8tp#6MAqW;&FicE)m%UBvQ=; zA$^f-Bd2`A((|xr{JsFzO64!R=T&%4J6k0FV^+}mLWmlIkx{oV1L=v#|9Tx41)O$a;Ut~i> zqeIbn1;>|+mohz$8xb;ionc6w0J9IO`_-X2NfnS+uBWwpxb8+1^4+;(g` z5VQ;)7+{`>1tM)6fJ$JR-KGh8@hT}R+jqj_t(}9JxcZ+RFd7YZZ&Nv~ElB17kU?Ko z{Ep74Q&yWaAcHkXje3uuppe4PD75-cIY`GX$E7)zFUs)%fRNo-^8CR=x8)o{$8zMRN~c&IxF6VOxV#Iz zyij(0p3NtbH@^YeXAjsnK#O(OeH&K*;e%9x8M^_R=bf&u^w2$KjT5vpE1C9|ReRal z4Y-x$)YJt%y}BMpwKo9G>ugtj9N{B3HZj>qvu%U+VUma<3Ka=>kz#Ujalr!WdwIA} zi&Bv8fDB;Nqll>q&UoPrOa&CpSCA)@F%0cV&ijTJ(VhUhh`@&wmVT;71&lx2(7^p5 zFxXxY#{0wKRT4=n;r2PoXg$0=w+L@l?_AjZL5^u881UxvKTuyYg z5ybJA=?PWf-Y-vQI&HAWw)4stbJSp$qG)Oc54FcbrkXYzR` z*lSvr2=QDgls1h)G{WpRm)|NHm7$#&qQ52cXw)jSxB4^Koq9vMouund+je)%heh}K ztQQXgm^Id7yVCAx5N|TF^TNyIn&@x6Dlpsm07sBmwaJLxirWssM4y+_ymF5`K;Z6m zB_$=(MDYu*wvzN-qhzQCS0@oMU&+|RjtQZk9Of4AJ25u1S+%m1YAbmCVX?R-2f!u+(_r0O~hry0Qsx?0Rzv>Uuwc zh8P+Jc$PWsb(|WFi>j12+O5d?tT0JUQ11X5X}z&hIk=d61h~uU++1DfDCGL7?D;tD z@#Z%Xrm0wX>jb@i&-J`Fh$B^B3?}t9Bjk6r3pLpiF~|C*l1`1Lkk+%4Y+b3H;=VQV zv(9{q>XWOht38jUI7vqxU~*d6jPCYqcm(F9X0!F)-d;W`MrfVCKg_3aTn4LRwbH7O zo@uiFt=7QHs!)#6nKmzv#dID=t28d#y3ijrgWdB~YFLYtdD7trMaM&6LPM)Gtf?Xo z*8qM-`Qu&)oy%Nom80da-*SStMrr)~;Rg|sk+q?SOe;3?Re47Me&SqgY;5GTH&~>S zN!D)zw>%k+aNLREW0Q6#Otuvm8gLl*_#3vd6|0wXu1*aM3}E)pOiR?I&wi)-JU8ih zvA>UPbwpVxi=`C*2#`(P$hI+;PHt!P&(C4~~Uf0W}i*=|*D zP2j(daSiivwpTwhzxmcc_Do^Q8d_(aTG(GDojCT81)^%n!8 zh?X-YB59n~&xmY%`r|<;I>@UT=Q-t zoJpo-6cjCBGIJYbO*zA&-vRaOWOcRS_00=Lp^Cl)X8>aRXJE|njZIBqkfm>3sXAR zHRLgRLJp`5R*3^f*h}-b-WOzb{x%$qwjN$Y`7H2DFT)tipmFMm?m}$wcwZ@_c|KNcbY;1kp#x?A8boh9NbP zu&O~}0@(v{ezLk>({mEk5|PqclYQ>uJHwXQf2J`)yf|%5xmElTE`w#c)WtT{T)uI?Q-lhOuw=EpVkdx!W|`~<^B8jht{4DNg)nQ87qj-$mwI?GBkxaaYY&xMi!u*+DVymsJ^yg#zUVVBDE-q_A zCiOh^3;k%cCZzYegklDFoM8-fQ{l5;SP zVix*>8kiWmuWu*&R&jzp#wX_F~GJ; zSy2~mDgi7-)>gEgd%hL1b#X8hsfC(hM{BXb?htZ~aSW$8!K$74G-Mo}C>E0LILacl zMkE==A`}6FL^B+$r?Fr3E}O5kX!f5`^j*{>`hm=G_FpSilWn?=9=Jw5ct0sx$rZM3 zZP}?Y!n7_`a^`K5*zB}i^8|4)&8H=!Y1q3E(lL}~Mi~x72SX@W0 zHqw1|wkVNWncK0jwOh(P-+u3nXm@TYhSNvg_oXtk3#0g|?&6Ozs?1HEo%$L3-|=12ByE zj8Ml^+js`9==K(hk+HIc!!DHBXt@ia9;&6TW~wb1!K{Wy05aRkRL?8%A{^D)F*-z= zcN?`RQ(L4RaTt}udD*uU!+#hlV7tOU#Wux@fhzF+s|+1YX=csbl)xYbG;jVjM=wq< zx5uPX_LNrNN(K>Upg=3-%(xTxb8hcVrR6qvvA51UzaS}qJiS_;CqGxPpu`GJNkWH)P}TkVqLPV$`qlg$+r+yD`1{uT^}TIBOOME2v?L!*@>#qUCS>YpQZ)k|3|1kC zTxASLZaf4MB=ZER@0!8JYJYikFm5E@Az4yAe`#cAsKrFSCD-h;1!P!Dki0 z=*MSolH!R#nk6_EmIh24fGq}4Ip6rwGm~t$OX$m+ej3@=vR`%&Mx!#6YXr=3y}%=< zYj{~=-50`w z8b3o17MD4|2Mx`!1W)N{-tq^X853ppOU;b)&u~Jhop z3&impPD$1#AIhXuKJ%{&CH!b(!7dEzDf;DQF1(hz`nK;j&>$X>DL=Z}2*%EDrfV6C z=|<8}*&BD#3f{Gg3FZtQp;EVw`i4ug;qXZsZlPDO^E3|OY?FSLbgc$@nKP*wThcNG zoROUwgK4G@H^jBaUJ*VGR)mT4^DPf4q;X*y9%Y=LvQ1Whb1s%5kU!;1P=uEeCk z1L5_zndK?GlMpD6PlApPN;2Lc{k+*9&ydFs2S5+nTXMT@G=8tiVklYz_i;$qnG&!#H&^kT{GV=w>>Y# z=;Yr_Bt|ES&oGlrzn{TEIsZy=JHwg8&>Ne`)C#BEGnxN)7Asv8a1l9jH+#|%$!$d6 zdG~CXdiPI61`i3Wdb)+|gf!F9QKJkJd<>Bn2K_C|Hs>V|&9(TMA(>Xw3t zRq5R5f+!))ujztDT9Vk3vC$_J>oKI8_`vU(XKI2tBh|JdGTY?i&iO29tY8+vRR*i8 zQhLj6fh>qelP~871MS6(iIbDE!ks6ID`?#_LRj`%slT^@$79Jl-Y9R*tsP+ba;_h- zRNSF|xe0uS<0j{}h`)j4fS6SSN8bd&ze}qsaiHsb)Vaab%%ugbM9s z$;v4FAU4bY9_9<&mmJA7-48Ny9c>NCFPyes?I_Xo9QGzZBoyLT7koST!|Qi26i`ww zG`K<%ySlp~FAvHu+jERvKe4~Ed11>$%3MZI$v{vkd9^OQA!uZ3O1?e7=wv%fs7tc) zYGdJ&>@QviRIuPaD`oLIznR54RlfU52f;cIW6;6GE5s{g@e11?!^=sw8@>D#X8avY zhz6Y)bM*Em0*jZDciY74$N7D8FMcPCgZ~Dquis?L55D%DOD@`-ZX?~8yfy$|MRMCY zF)dlMiur5wbN@7Zf3A2-^tHoVNGzzPr*3(%!uq8qTb$ufFWh5=>5f?oCBk@FoO}Jhvoiuk3_4Bcgm|1 z`OwbzcB(F>0X#R6+ufNKF8(b&B`M6`&WF*70upcd*)hF!+XhAkMeY)bzfyD?cwWrP z)F4`h8nliHn`OVaO+sqGIQsDMW9M8YXrk6q{kh_WTq2@F;Ce}!(GPGyJlnbHYKH;a zgCCH@N_DTZUJL@{e}h;fU?V{Sa0pNUBpc;d;hQwdhBL$`6L4xVBnf z9Oc>u0?Sq8M>OG9e4f0>2W)@{n$2VxXiro@raLmEKU&hzkj!K(GZLsEFaV4s5@N0A zLv+0bSAhIAJYH(tohm>Bc*Em{XBjp&_8TrPyywaoz;}ZJls_ml9oVe42>{lmppK3X z%>LcK8jthb_`v41uAS4_%q$k`HzPZsQ#q=x9N-1Xv2t70MGOehQ4>fz zvYoE_eo!`PjnKUEFR_hxV-Rvo&TXMWJOavr3bMSL3d3L?ftscsK=XxYR-5>h4FXmY zg147IvRi*Norl|D^Mif$82`mfnza>I$SZ9?oJcfi^3iSsMG%#MVM0t?{F}?kio_{^ zP+lZyJA{U@pr}l+zJ1$S!ePBo(?ina>)10yjE${A)?UYH#_|dkwXAf%R+mzN=^0+) z)eqiMH&UA;tmr+&hN5{`>^^<-GE;ZNd}w~vQx4uSfV9;PfJd+<5+ZNnziZUE3*y(G z92}w9+Au`lTJ}zP%v69wwdl|&( zO#)>aMXOi%%us-RtKnjlj|H&lJbQ%l9S4AHemKAxKWDR|tI}x3{+`TL7vF zZ)pL+x{mXjP$E|>H@iSe>sQ_{*0G9(hX~$1s5SOAQG^4wo|1H!e6q5P80h`*n_xotfIuf2+icb6Nnn&4^3oF!WH&(hg$&79WTly&=NbIu z)Kuh64mfrZD5yKVzUJyW8KlmFV_-@31*)oEAIt)_4JdCjB=S#9pZg;TO?f4l8KcSe zfXWn(0iY)D3jp4x?M(Z~qxlW%O69OOM;bbskDE|{MW$;wg{{)+9Xdr&vWRdusqX2AY2MstsQ~Jzfi4px0l?X9+HE>N!n__ht0)mh{|I z^oHZ5$!hf{mo*>rp1ze=oN4#*Ic?}mt+QQ4ZKC%0wQHaqP~*$;VoXZA;M1JLQGR~@ z>#ujfZF}9xZ#01ZY@f^i;RUe7$l~Ojqzrl**OXm}{OP#sBf#a<=ez{4?rK}0&{6-8 z6rOE)7=ZNY7{iCY21r8QcqBge_DcX_Dl7a$kHTFNRXl6JAOv|| z!JzqWvYMsb{5CF2T_Y4%*t9aD6kU2D+7P4lV^2x~3A)RcE`}Kj<<%jsy-Sr$Ndvzn zou*;<<&@z$fLd}ygF&mXcMn%P`b>R?7e}*~>s}Ermg}D#oWvCP#l83fpG&fP!$aTi zUoF~lRk|cvCb786L?CR%kku%h+ui|-08{xDF%en>8|Pmo&xK1 zLUN_Bo*8o%^Rjs%(w4t}4{8u!quK0UzX_@#QT@E`a8-l48^O6F6f(`1wEki8ZLV>i zl&5By#^BOc{}PsnV5b?z3Uccrn(zfxpwPLg3z4yZX??$KM-?o}+1@_&*SM@mky5$- zj>PT>fs(8}qP01zI+-yeEWd(6CzzU`tq^>Z4G{CHO`6-x&kq+4N*$OB;eSheFuyEbrPGb((&D#)_=-ZVEh_0;(+|dk>!B`8>ek zyJ!p2{Q;XS2p)8zT3pYbgl!kG{QXm$v8R{xW6%WV;GHBMJD&>wX$LI6peOenbbx4N zMHH}dqt!1tgzt%iHCT$h?=G5dx6?$V%{)E%0on%7To(cJRR9FW+_~yMXu|w42DjAH zrFe6olU3e@wBx;Xz{YZX*vXw|xv2EX!)4L?W%Nt&`k42#^5%iwb1rZmJzb72^=f%X zpS5)Teify)TXME7-H=FpZh%UO4I^jV)p@)toQw z$vf(wd}s$XBGx?6PVAC$%!O1xehpaH+f-VlJ+mM^;tvUh(@!@zTJKkBkt$e$Au2f|I}0C0_ez>&~u6Zzapplo!QhigxO^wRrZsqX{Ef z)qJrkXu?7@MQql3J2PkNA!|6PJbBh|OMeAeE} z)*aWRm#7a&$#Nf00$eQ?FaT`F*5_TxS%AORy829qo9*L8g^~;5av6+-;c#K->SBtT z2pkqWP=56*wKJ$c7^aq`=cYrw4{bM|i*!+I@s*SH*w{=gc*}pYS)@{E41R0J|Gp&M z!dYE_Og}VpDAU2sFv8hRhymoJ!^#uJvaPBT>`V`4)nu^<{PepW)2so=xNUsFiX@3jd?m;I99Hovf5iehB9%=iYGFl>$yhb z`f=unp()@sf6?M0UX=+Q!9po0rZ}-;sYv>z+c;FX=k^oB4~Pk;6~PN7m_Js5lTDx8 zsjtuPNDE)J5bLd_F_3~}b}Ae0a!uE^>`Pp<0&yCIp_}*-#4;=dzc=yw(h@!;4i39) zL>kNcC9?OWE2dwDaYJW{ck?!Mn9ttO{z6V8fZn)&0)fs zSr4ah6MQeCYe-}5L_?()_Ra27Up2XQWr-@P|c77lNj^6Hr!`JT??OcViNB11^ZjA;MUeSS` zSYeI=rk_N?`Q7VSuAHc$s)da`1^Ny^0DhzPKnh;C+pLCfk>cE zH&4@D-#vXzp{cz|)a($_C?DsMA2I90m^AfMNOJCxNlUd$Ucbrv8O5nWKYLTJRJ0N< z7H72bB|od?+tgH&md}|>e;93DSNlK*7wFwZL(^PzL{4 zL%bn6v3$J0UE94&e>4LM3f6v!KVADgsV}{x_SyOIoBm)9tEwSpc}QO9!Dzd8liP^n zD|ZTiKSwoY0cgY3^a>W~)16Zx+&($5n_ixk&1YP^C1|$XPgR$ppKgVv&X&A^YHn5i z#DLCnl{)Ovphs^V9bQ}VHt(}+lW$g~fUT&%HhDkqok9Q0mNqATcZqbf5>x6r{4jk2 z`e{|=vZXBR3;~0k6t`zqd0?mp)@tz*PDHjgd;|WOs&6SQ-Z=A zwX{NEYaMDlud+95J^=glg`R`W(7?b4HYA<{NK4$aott1T;lj{Cs<=?Ozz`sXCKgn3 zdc9vCQ@B-Uz93-@|I&yS{QU#Ny}b1*6~hZVH2v88XrWf(r+trilwRL2fUe^KsS;M$ z@zj?Ev#n(>a(EQXDnRWs&w-M3*@9#0+#(}U$HW5#Qe})JZ)s1q$3Hk{I}-{8 zTj-227;WkB_3QH$PZ@8=Q7Xfh@-)n8jB(R{C|>)VuMFj3Q-}D@3w`Z;f5uCy0|&{j zLUojSurQdroEnQ7x`6N$_|}LnASo5KxoHHl&)MBzm#m4g7xR)695s(9abq;+fWVy+ zkw#oZIbgcp@x0p^&G?ja?+=eM4iu)d^;7oKKtdjz;*??(vyT9u>#*gZ<2q3qb_lk9 zy6-*kJqg`_h1~3%=ZyQhT(kNGkaJ{Jrfnp%6riS5&;hQsNV*I)8e(=uTIPo1)w_J< z12Q45SEUxcmmACNH;8L^M|~qnCiZ1nWY2njX+&9K!G+jT#`?{5!d#WIR+fR_Ev9t+ z)~*&vz~gw#BcdaZnQ+dKyD8|Br5g2TACFmvRCXPbo!}tgF(4>Tq#VFUlc;0^Tn=ol z7~<$VSa}K%Yzb^3Z2PEC!^kNL`%x*aL8-LwvHc28_Eb=EDmJ|t_HaIOWTTx1N%Wfj zb8{LHhuq8X84hIr;{v;y?Ve4~Bia0y952oP0krh438*Z1d3+E5;&hmXQQ362hB;957l2dhY ziRS^g&WtS#HaC#+cL@y#!Z$~yw%_~3eZQT7oH(K7JdV1y!FHL^a3Y6W!-F68^EWP} zW5_xQ@s28*ClE91`=;Q=;}by z)X~VGfu=!j2bUq9%NUYsj|)e;>X485xRVnG7W$STBw4KDUGz#+LHh0tqS~#5)b_Ry zxk)af1fo~M&55snov=UCsC=P zW=I&-UtuL~T^TWI{1G{I9}BR1Hr_02)$CAvRvo{>n*BACJiiwIJ~dt5H^(v_(ZCzO zz5aMy3Co4ks~elZj%#QbTlm@}Ehdawp!}%XmbMy)V(z?Br9_Y6(1a16s@vbrHLjpn zAcFxcZ$vUR)e4J2E&3%sv0bow+(K({r}(m&%CD*ie=PC%g9l4rOVOy}AZQ41_UWbK zgS?;HMMbHw`V4I*_;ASsn%deea{eD}ZxvO?)`aaQNP>neAh^4`y9Xz@OK^90cPBVO zLVyHcxVyW%y9amqo1MMC|D3yXbH?a(*P~Z=&)GF=R@M6yXJbJ~vynSY!`^SUhRJi# zU_uxz%3Cq1_Ul_jqLJse!55y$CI1Y4yBXf%7dxk_UvzV;U7z|#t0xSmbYexrgJ?8p zjMa&HQfju1(m4eC0ul0dRBxazIsQga|0`*0d~a*rlZw64J^|Ufxxlx{(6r21y_h}Y ztp#ODsn^EOKYP`T^j`4>(~ixcb8#*UIqF$H0KULJ90!7*{$S;}61xE;)S+4j>)a z6C->JH@oC7l$>6~3>y!-@cGr9<0zR9?i?()d=c_&-iMq7`7%R~UCr}VS)?Z0vurbL zAnV5^B}R5VdBmj~1Ppf~o@DAEFa3dKfBEPdSR0&P;F9X3#;wxtsAiD2yS=?aD2`?~ zqwW9V6NlGmhdiaL(c+XrXOZ;=dJfPe#k_(?1l*(fd^!=?zhNrrerMMI(+!mOAmDI( zd?o0d02Ki!DWl*Xj!S3{TKgf!e4xf^IYSQMob1E80g9m%yLP&kTm48pUMxW77GpPC zYrVV>+6!!3Yz5Rmd>EXo48e2nn;QPg@+uUZJlX0`81}7{_$l~phf#+`?)mzp6Z*ZSi2H;yN7S@GO zm$_4(4+c)n&Oi9ukV2v2fxK%*S4 zPf76v&vpoE&#!!=R4ligX99vb?{PX_DLbLz;e`jkE!;@QC||S&P2Lg4=2T( z9&GfE(c8yj${HLd9mBxG^oAY3Cv1`++1WZ0)iTlOS?Y31rT2Pa)|280z06zfBrazC zD6bIfMY$1y|G**|{Kr*}Pa0KUg^GH0p=@x0R1c9@(1mo_9hH?em7-k6kqa#10)`wVc=Cjp;Dw)5R9(DkqD1_o;Ba}TROw>{TRcsG-2 z{7l(+Q;sTa7yLvZ}rT0 z52t=7q~4nXh^kLGIgN<|o5Wvo{UdF@BJ6GT4d9H$gc(eq(uQTFv9!+CY9^+*p~Ba; z2F@9R3P8yEnU&LX5p5a%v*~P z-5P`oG}NC?_`Lff)ZdS?Ew7w)~_7P@qla6pN8uTHsc}V;=)?>exOx~#pJoqLZ%SR z?t#LTIYz+9li=ZN86y>%WCvzj45rMCOd1R0p%LP>>c$XOpI8e*1E%I%Yd`%L| zb>7$-YepWf%Mh0W0ZbXi<<)98-2;bZR0HV@rZ75@-nS~awH5~&^Iz8i+r(NbC$%@N zw5$<>Y)S!TE)qMA)e~mw^Ki@#2(-|4GaRDBXv-TonA;LAQqFpPZH!nn*@LU-tW#4x z;&W?TnasJ8$Xxpz@#dq}C$6w8eBTrdRk&^Crq-qSdj{x9^$XY+BW4aabaKyO>*UOz zUL$>uc7X@P84mvWlLRF}K-Cy1A&abz{81v4&i3NYO#Og*xSC1K z#5&w-q1&yKnsHx)g7+CeHFDu+ATgZ}56 zH*6!)iHNx|+>&DDIwm1XOO`v|5`-Zf?S9lgT{FAamQB=VLcL%Q<>0X3NOWS~LX(=v z{3#c=kCocrdj3MOY%wTxb8{*V9T~uHZ;wl>Z?;+GE5~LH!t~f6At6awlXr1(ncQwL zFHo;w!B@e7$j<(y+1lv1k^E&cKIlL%;-tTfU8cJUm)Xd6?C@-ilD>b6lhuEYQZ<3T zedA@2C$i*jo>rF1bQ3#V!3TJ8tTro6#x`sx$v@6=J&W(tkTiL!cw$%w_&-O&i%=|DoXRu=HaN{e} zLmD9M?p-kq`4Dd~PD2iF;9#Y;gCFRZ`MgIJ&}Ofv_Q9<^tXnRr$-*#p&erWK2L(Oy z3;B0hu5i&yoYbc0{>uPU;=`Lkms^?sRU!!Oe>n+Lbbgy?h6oFmK@aqPKd5w>Jl`4}jR)8j~P1HYctP4i1t*yKKnlE{!0Qnq$RA zm*OPzRU)K|)cG)1N&>je?(M?gC$L(!1D}`(ipxB2*a=3Hh#|Y&i41n>>hNX#b<>l| z`}ZE%klgkuK0c&GHvKV9uujhO-kZ(m*Y|7&8_pxSZe%<#=mt;Rl96M&+_QBmU?Moz z!&G`arF|`{E8rjI@%QlTv@NkgX`_iU{{q-AzyXDVYUdUCi8||RY zaIhk(Fn`Kz{2=H7K;&tB9d&#jiN;`rz_Ds=Fav;VWL1HTIta9GK%{xRNR=J|n+*Zb zuQSun;KZ#;;+$oH+bnCDeiv?2D;6ZlLmp@YuCb+n zhTnthgvueEt{=122P)d$do^zpH2pI#Qhy{f{e)@wi^QR-A5Y{vM;xd{%4A}?{WmKQ z&xnr|?sPpFwmGTT6+>c$^~9QZ=9Pv7qtJ~l-P^o2qSDW>rjtKyJ+sVJ)J;N+;J6#8 z=)X}q-48%&Cs=$mMML$I3f2y&tega8xuepTtoVLIlkb~vQWD!;MPkQ?y}U`(abPmz z3~8~wK@v#!g`ts=>MC8Pj-7QQu!v){>1Z6CM>> zozfj%6XB1edLYgEYzO{k#>EE#)Y?Ns!xo@Y(c2A)g|n0OEZOsv10GOIlkiXrkO}k4 zI)G#9xg7bE z?mPh2;)4~Qp>C!yk^I`#@#1U-Jug|)380HlLwCU&+q-I_eQ%$^HYn$5~mTb<@=i)M(h%lRluW;iW?HNG$Q&M5hKZe(wzzFTUkarDbF%hkoCM6;Gm) zB!T(a5XuGHIO4%R=5$uc1?qPB!zrwYnyrIl_(6DE=*lVoS5zKh;kA_}-X)>5cA4U? zlT4g?U7Wbzu%U^WN$O1g#k9n*Ir=gq+0(@oXDv+763w*{pDcYt!6bJN*`z~~EzY`z zHjPdet#n0VzUw#{(&@Q#$v5j-u`_$OmVRiJ=L4D#rplGx7Ddj+L3wh#S4zx2q#>j~ z>T;Z-TPH8|o33Uw^U2BHf2$se%Dq+;IZLB!JYr&=qwdB5;%uumBi&S^hntUy0B@lu zFImTYz@f$$*zl*{t33k(a)#OAUFhD=9(UWxQMVod0%4dr$U#p50Voy!zLP3+#$mV7 z1=n5bL{8N#~O21fPk1!JXgs61{!a@jFdy{|Y(U0zb@+dUfK&ai*dW z)4H@uFY5S*y05z)nLUX>zv*{+h@GxC?Ok)X(cLdy4m@OP^_)nDUn1<(qP}Mp0EkI1 zF`2@iqO{ol@%Sfq#Sanc_)lmG^6DoqtuGJ!G`cM~sGN>c_qVqgH+!#wd@_{Xa#27h zlAJ0OhDM{&%&~U}d?_}8sP7%M>uhsC)<@4yVE<{0O=H2 z`5N!$!0f&π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 lyTj=G_^(_VXVK!rGi{J^( z;+3Km0s=Z7{OcA%OdJscf&hZJu;2&it*veYqSco-O4 zb*e;TV_Hd3V;+cy+xfW+yGKu3Nq8o^j~owXU;OTWz!IwUhjU z-}~k!omLYKx1)2 z5f(uD^GNap#|-bGOCSDsYD&Sh-Os4re;-3kx6q16oNpPa{XIwk>0$d3+20f5V7rn$ zrWBNGVif4{`+JbLK&IPPc7AQq7c9Q9mF{S~Z^tK-<`-;(QjmRNhdEai6YxXkT?*%) z^ESuB@{^&DB&biDXb)F5X8V(K)s5?rmPp54s>C30I!f2%!*srE-XG66@tY`()dYvUe9zSv z>nUM5SsbF!tK-q_wdA0(KK>hsS$U%KxuL^e1Iprz)Y6?k>mK$|qTT9@j3*&kALRaw zc7x1S2AR0gU~8<9L$5muHLmXFdeSc-Igq>a{CHEJvF0cglZdJQ`fQaV(d)wH`YfI5 zqs^o#r%U3Yfx|%uZLZ7BwavT-p(v7!vvaL!-POs-jKl7Dh2^42c5c~$7Lyvc^^D8S z)yZA)?S=%{*dCIzQ?o0bVGAFrX6%vQf4|i0YPx+T} zcJBCH1QRF+%)&9f-F8&f_RRKR!H;pmelvHqPQRqV>SNIAEOap-psKjI81uwpjsnwr zam`tj`~&TujVv92^!g}xf6=#o&MR>q;yJHH%x{9B&H^JQ;`at?xSH9qooW2~VwYmd z_ra{)DjCn*=iAhyanha?s?9{6UKmn}uulh+2-uID&W{RjV?p|_uTIrNuYwr)7Yer~ zjPpyM=T%T2pn1N*`Np$d5_S_Jro)2q>Vk-z!u`?q942h-yPqRBIX62{@%rI z-Rb%~|KVz1`9QMRMT&XtSu57@;EE`zsgA>TX(ZKH?bV6$?!Zd{4x^#=^ONmr&nV%q zOb_l#Ank+YrctclSGHX?**hvx$78d#*08E#zB=ozL^3%sc2g=U=32jz^ShGG2O<*{^*gC>hR@eLhQYwKJIN zx7vKFe}1$+^M0aOUy8A|Y{uT0@s(zy#mQkG|8C2Ne#uYVF9YZMuTCcWu756K@ho`L zILaMR(GmMD6WcwWdFm;4QoUPy2-%-O{!VcRgN!xj^=#wS5%RIvpD<$dS-^*!1qq4& z8l8ZyK-G47nA~m&r^x}gYfmAVu|VDVtc7S$cy6!B4s02u^4Aas)v6&94iln|FY;f$ zwL{l+g!?J^_T2ZrbTg4PdAcI_ejwm(cz&OpulewcWwWtcMg8p`neS=&A%3UGO`C2A zS_Z+ZO?wLQjt3oTDHdc>NFN!QV8X6RLLVq?aGarjHsiX4yFF;a!qRtK{o9`H{hSxS z0K2vZ1uKZGsR{bHkbqtZs_BP-4ha|JZNTYU?d93s+C97`B5%R-kru6(`t;-N_1Txp z2b|+Nc>Lx01qJ;hO2+i0{LYTuWpkcPLXK1m&~zsK9rEuug>5{>(^aK}ALcn;V5QSE z&-I)lFwV4x(9kq>q4t73Fg4m!z+r`Uc2AnWsdcF7)a@GSJ82;SDkrQ&kU#k%$@owD z%3wgWL?#yEh7$Y?X{B)!yLGFHNrA43hk%@=`2rgi4@TcT+z|FIhU!Ta76H)={@_9? z4Mqlq6iVyf)K2v-`TZaVVGOF5h>OI`FjEW>YI~09Pw)BJh`rf&P!f1N_YFveycY`Z z`fCmjVp!r5SDZW$x{p7V;D27y?I zi9eZju0M?JQP2BSU7v4me|;~BHtQR=Sg5sg?|U*^6HoIL&59gV;2z?9i%(=A%DsmA zjhF6thj~OY&3mEmO^NM@9ofGai2A-Lu5|b0abRZPu$v$|r=hRRS>^H91PjeGa zXI*9;0I&|jhZceLLT|K>V!z3*bW$ZKn$%-|QpEh$$0{B1 z%@ShkiY=VO%#Yd7(!c6SYPQzGgBX8iIo8EkXEHsdb!TN-M7bhy;PeyyAG9+pLYe2~ zZ^r`_LlpAg*M7zA=Bh~#;kjHp{L+DC&BP`;Q!sBx9l#~ijrP1FYO4qG*tz*^Kvw~~ z4`+EXmG!6$z=HG3%e6ZRF9t!%*tj4qA)YR`;6BapqHy$V->YDHNWg%{ht;WOzn-eb zMlD@cNpW58=TSf3boWCAvM$%1RY5YS-5z3t_q>`X15P9V)lr!BT7QGS5E9v^enDrd zTP9I`ca-Vm;=S3CP-a@xL2&1{n{hmR%Wp@{+{#2r&MJ)8NWyquD-i8cQ=5-!o5h^L zfX9*lg}xc_EMWpNj*mP>p)f!3hE5c52tkkQ!9ZW573(PWd{6%|$oZGSELYkY5nP(k zPsDonhF3?BQm*QZ=o<2R@TvW z3dZ<1(5@&Aa)mvELg%9|kix*P+V2pSQJKD{IPT{NnJ4ER%3w{+;MoU2j|*&w1S@ z2VYtSatBDyU>Cl`_RQ$2w-LZLy~tNdw#h~Eifp>B z4@%Mh0b~IrTmWt(m|n{M53csX38s|rPkjA9aJLa)VqDRTyZ;?Y$&84r~9IeX_O8*gq|36v3A@u)ivILa0T4cdoB{ASVVNlZ) zX=#xw(ekiVd%#Uw1C>3$t86{1nr|V{zIn46w8Q-sOKoRx(pQ!?n?d!wll3}pG&46f zbz|25x%hfMs<(hDE#O?EvjqwHt!VcN@RiL3zbzvtHooj)e4=Ehs-SbW!`-K9)onYv zwAh~hS$iOB(IwCC>I!kEn&YlKnctM%7F#5W;PMVlnwyo&r$(Q}yS5n0uV3GmFzm0F zc`q}izij8rL(6L|YyU-d9aBYc@JwAgkZmXbjn(R9knrI2%_Vb%nzi!!ww>7O7fsaos$}+dLDl$C)#(gVgm$EH77UyYl3nFI5}&swxFmi`nOO zi6y8UoGoS<)5g8R;`4syPIw0U`4RE1YuE-1qPT7tQMu7%C#saCo06`iH_>Ue6S9)8 zYHyLSGdQSf7npLUy^*z;#Rhw|&Okq6sjK8$U0y`an4@xCB8%8XK{NW?Bchh__YxkK z0^9vOI=kgAuD}+ZT7?&P-F4KW`-eaY<&6W%oR1&n@6ruo zYhq;T>Zd6;VVrh!TdW%HK$_z7VQSI6c2&C75XGG)W*(XzzvrELsrht?%YzkO881yN z$>KOsrv&jG_3-h2ZLtgru$MO493*|ynAO2rtrLv>rp~Abts<&RAj+_* zX{!a_!$;Y@`$|+FV>r4?9xFzVJmG1gAgw-pJRUvrqDxhbjFju!aC>SSH%rRn-{;15 z)u960na=z>!SR=QKBVEx)Gm{m(D1~$2k+Qjp1K)V($6jSaxqvg+|8Hy;i)(hCzYJj zZpUgno%60tYVm>QFk9@!0~{5_nfJ1O*qPaXw!1U~2rkQwvbL;?H8C{?nK#|4q1sji zm3<2jV!OPIZG|0sY$;aWP$flKOlNgu(X75D<$f1#O8=8h&2FhGl}Aj+@MqqRv&)gr z?-Txxm+FI&de=kU$Py-=7u_lq2QRwF^ttw1j!oPndGs5hlX?MH>2H6Cj-)Bl7*97l zy|7ITU&YMT4fAwHWm>0DA-n%OV!0{_gIh^Zle3nGE2(+z)^f5tC34aS^Wbo*ci3Oe!4sMJ+st&pm~DRT#HPOY?9r4E1!$HOreJM&*a_0$sh&;WpAqK&SfDq zUdTD)uscD#iDuDveH&fepVq6o=80_;*KcH`s>EL0yYnN}nssxmDAU?#J#V`3%SFMt z)Zdgw9Xti@a_HO@b_!ktyXLt{ER%NL)iVDf3|pIBe zuqbp6ISc*Iga=cC;EHrBqWlHkqDwT(59bU0h?~p(U6WWghg$28Kyf=$2p2^+T5~OaP(xP zT!LrwM`~{FXk~8hkG${|3)y)G>EXW@umvvv**<3B?i{Dfl`+LN#{l1rcF`5PRRUEl zhiY}PX_1ZCWPyX2@v0n4=l>)*c!GJ8jJRqte|Qpvw^h1(U66ls-ga)itucABZg$(= zw)B{%{4kbIK1m55=Wou*5QBf*&!Re8p#o9i z56>7mE;FW056R;ty7Dgm3>IW^>Br#4>o)3eoJ?AtOq{xmjrj%177Vknyyy6v-&~7u z`W2MNUyL8BUup@Vn9(!KiK=z}yD(`R#Dn1Q5ZMHD!vUt^jWVjLgU;vM<+IL*HHJW$ z*@hkV+BD;ceJ!;8pJQUt+Jzz>n(rnD@fE>!6Xv!D+BNpaMeilKS`q+Ld$vtxN)8yU z?1X5=fgfXSMQ7sEsf6A?X+Nn9JJ^fPXJ+UZXWp$Tzqvg6A$77C#Ba|y-spk8U3;-p z%ztzF;~w`K<)rnfs;Xo0{a?Zf5M7Gp)t!dbfda8Uk}QUGBizS(8dq~NVLX!dmXv4S z9WTdrcZS1iWIo_yiEs$m};xz5dc? z;4`K~fxJ+MNy^a;W{){B5M_I-xbFlJt%1#APJl5h!G7au z^_&~J|K;{XX)&42Sc6_)f+<{z0CLVmg3GlXV-mI%y>eLz@5xwGQBe_{8qcibVL<$+ zL2RCA;f`O20fltnlCef}XYMIX1V zqArHRnaFQKUiSIjA!6i)<~7F=tDc-FSmNTI6+h>_C|-Adcc4PV;`^CIW%bBjQKk`;0D?YhoEUSLt zymjTx^+io^z26sFgLvx^GH50oyDYS`8da<$zmUl2GOCTz=bh-~zj5T(&rPw%_J^MR$)q5H8RI?~5c2%2 zMTCKcNs-X}kz1f(~SyrbenASjFAr`#G1?$?f1Su2JyPUyDhb=rGQz zw=h*AQgkKQau>|%5#BNJ!~?F6DTMjm7up9dtG)48aV(wlieH}2WY=RGdOw_@+I_0V z^A#-;y_3~Fz+iQnW=jG3xg{IrTdzZNH3@2K5(C-aaK?xC#FDY=U9#wSg2RsC_GI~~ zKSRxt%*94_{#Ly0OksETn+u>NTn2GHKaDcs1Ddb#NKQ0GC*6}LdrbMZKp9Y}4-~sSp_GB` z$n=CHzW=TsS7AHUXa6XO?>qy`Sl|Vc+!$33_ouZvE9#`Qx3MdI``&ZBO{`5>wFPk1 zUyTjB*R?(!BfW3|YxnM9v$sdf(v5+`QivEVNxPSLo)p{F&dzRNd}G*J!5YKQ$EP!R^bGr6mQ{%T+E+XGen38_9+mc<87ua+s-IdJ{QQ` z`{vGk<_Hw+{rzljtCj+yusvcDbPVQtuS(HwJnfw^p!?5zEpSX(2)P7N^@23e5F5F{ueD# zhjbAi^-^VbVdd%n!)9=7EBzQtvFKA7!_lIboy69x?y-aAOI2u){T-YP3`C@F>$6pv zr9BLjAA&j!-dh9u`j8gjC?jXa#9n0`b$t5b%kJU*`m9QHBS|D-N^#T@HJy=M%LpXJ zP#BiA5Ry?S;IEkd>JtxJK2C{&%r0GrR?=a$&&CMWok+|KczKBqL97)*cJ_zhD}m4Q#3;@hkYLTnEvnW-^jXCB%#I88%B6 z5HDaF(KW%l5uLJbWQpUA6X_|Fd&|XLA13WHqisZ*Y;2}NUFb$nGv2g(760`SlxT1W z;m#}GC#KS7aWy2*_$NWO$?`}a0*W}b{u2Z27_!8 z^7(pWMLvI#?7e;Ru0h7(g}LkQF-~-k>FQDIOjEe&Q;w!#pZP29k?_s6jcXWXTSAYr z&Y|4>anDRe8%H?_ zamQEdqDrGOOh#|Cs$}R6<`%;$ZH8men((c~7ieWxhT>tC`}9kE@Etwr{yl zJPtnwbjF$ot_VshouY(^CbegQRCUVSaZV#~=3!dFtnS9j0tA3D16rtZVlvb7GCD zI$?EE-rta``n3}Twy7zx6u0fwH%xJ{iPn&C5+Bf3TtDk9c9>#%^nTxqG1fF)zr1XE zx@KH5MRhSR+9rthIsY>{7$LJ&8C?9 zeA4T8d}B7*E%sC9B2=qP(wMt2-r>*aoxhhKP0!1tlb2@_7XKDG1u2%F_G;(~-((gK z|8rg&_<7+oC@w}x*V;K)8R{+zVzTwqF%f~6V($w-ACct=fT@li`eNV)x>E#@b|x4s~9-EzHizAJzWL$($~ z3jG2?2z#BEDWILDk@~V$*}nqVQ?wFh<5*d)*dMgZhnere{nmvS-t|6&hgl}ey)~gR zmf;G|B={G1xdjER+BcewhlKtqdqaBgv7K#a?*3ja;9qOE&z^Lf&BiK+RC)}3#fn{r zrixUg2M=!+T#vrqHx3EWizn4plr#ExO*-#4?q`JD#a@S2m4%5kVm#8Wq*J8+5cJP;M1+bu%!s~lE#%~{IRcbD$3QCW!qDQ z9>*W~Wjb`E-p1(O7?09LSEbYr-9oIR?=DPRH^kMko>Sex5vF_xuGk0njoU$Dw~|5r z4bNzq$&c<{MHhNwRS9|1Wl(V4MgO>U_S7oJt`(8TX!~Sj$gVfE0lN&v);JPF^&Q0q zwrdMs+UU3Rfn<1!cuC3Syp3z;X0K8PZMoZI#cHaUaHT$*S9+~JPHeUoDw}bo#8HN& z$50UK5^F?zx@8bQC7lMw_)A3HU~yfFD|jF2Bfn5w^TIlip5aMJ@%g9BV=X%WN2!9h zCo_d4cuJI&t8FjYl%v!KPbTL>x&QD}*9ma}@}h~enXR@n36sn3x;A;F-*sdhMND_5 zDo=hc2Iaqlx#9`yC)lOcT%S}0+Ebv# zrDGGrZQ_(tq~-b6BT)VQxNQ>=J(txyHKii-5IGTx|FR$baRy~U?d5?4sO(4F(5cr> zHF2L#S(%O(>B21pBxi*v6psDQ!1@rSwFRovWweQogR9CgXkh>u&q!kAav#Tb%!LQq zY@f1B#8&6uaztq;JVNc2I&qp8TDSL>B?~S1p9WPRucI6B7RrW$a26X3=2kW1(qwn4WP`sDeJ9W8?@mkx>KsGTDsoF0)m z?ls(;1qbfw&Zt`x3r&uySOpL+01z9Zw;wYDNRka0Iq3~$Fg&aZI6X?D>QXvcIrQ~) z3PQV9isrCf5Wdmo(riRhH`UbqMp4yV?E%*r%D~dUIK-2D(cqWq?~lP)1TU1sRSZXG z=OwYg2kVC|7fpLQomn2Jz|(Tl^i^;MijFu@F=m7m6doRr&@>=MX8rYTEJu&$Ju)K< z3T-m(PX*3b=fr-TSxw~7xm(qj2VL70i-Ctille6#F}#<1O|7;jfDa$fjCx{{PCSk^ zSr8!>n*RkAGR%QeWi(Do3pM(Vcc#tD;Wr>BlXE1 zoL0Lvrzh)|l|Zq{bvWHoOZnxQ0b5}bnNS70l7jDBAY9*YP~T6XzOQK5MI8dD+_|RN z!H-Cw19iaHu!ZHXf|)=KB}gP)YF4uTEN|nvhx?XEIL%btMg0iqw}8}fDij8-A&PMX z;sVX7qFo2pHV~7Rf9yFU3B`0jLZAHRMZV$HLo^8Y!(cME6|AO+hxyM-G?RO_r9I4l zdyHA&;h=uni>AzCe`G+)=UBmP9yI?F36K04#K@gz+@!b%#w7HDDhXT1T|iMk-Wr0v zL$e3Hf!WF}wX#AoQJFEY3?wB3_f>_Ug&DVZpC`zy+`H2>vA-en3x5pBf)v5Nr8fDf39ao34Ii;4BlZVF zLu2RMz3+vnluQsqq8XfKMGXw&j;ut4gm)_kn!B*Wz#1^WYQfAwyTkJ8#|iI+NxnZV z09<$qy|8pdsY{aYOlK0XuP@3sTr!;B<2)WToFcf2qTWZE`1+KReGnr`<==b8=GB*k(v${AwyxmLZ~SV zXAXpbKzsRVIxJj*^11Qx$OrGd`q*RO-IxnMchI9vG2FU?A^7(3NNrejTT)JaV)8iI+O`*%bGzIBdI7q1{)qgxhp*rQh zaaSrUFDmN!`a1_H`t`h>VO_*-eDoD7C*YEEeu5`OpjH3^;egP7*z z2;WZtwQ)gwZh*AB1!}1K>)(#$jp?M>dvt8=;b@zz)!!5vvrx^jAyP{d7#%55}?J{1is)iJ-@RU>a+xfjuLN{N#++AFN9cy%E#rC?~)i+zOlu51U^bH+ApAr4lhgmq(71DDWOu# z&5=@ycuTKTV=CSDm908W)8Qib$!J90lQO@e$qCp3F^8>)X7^E|Dql2eGj&pUZehlg zw{YN-l?VXoF)O2$U%bqq>9sHQ#h_gschzBi*;{iHkFrLFu4qHMou9A57|OIowPO`k zh*+;ymvMD&@%)ubD2d@k=0#=2;q=of>4%BQtjal5?Grp$;}2JvyR5Y^NY$hCx2J;B zDj$(B|BxR}|MHh(3w*@wf7Z3+$oS~Q*G?NbyP1fXOUf1qm{zxt@_8&NAmjn>n=o0_yjH@F}*^SXfgHL|s0l~PXB7KhtYjNLQtF3sq zM`kbUTHdIu%IN<)uHzM`ixAJg{*ahpv*0H+w$mH0e_Dyspy za=hbiN;mIa^g@eo(Dix9U$}S+=M_0(j8Ft*mwMfS#dLyAxxzv-`kc#lXG0bFJ9>fg z=;hg=)4@WEU$Xh;-x~Y|8JGt9)6TA&dhf>^F}3Syu_jyNPovMF*rDA0z#3RBN^~J!o{g^&RIw8 zNHzOROfv2v^s+UUsy`+K*D5ewISjSKubtE2^$TFET{YHa-LUHAYU2R*GPp%|J4}kN z5Mv8w-@yFpHXR$TlaKRXe zZ-<7^MTW{HT;r*VeUdY4sz1gU>u|6dRGo^$f2xq06u82{WNqtmSEPf~2)x9CS_$(CsNEJ2bHagPL`+Ye&g(zlhpxDez{-#8WUHWdyLQga$S^!HkaM%aST!}R!-O)lW#+#1(UEbWcwnFQsfMK5+jI)yo2U3#UG0yuoNnX%J%05bJ9 z9M8ht*^wY$q}IWOeqd3$xzx6uvh-p%9_jY03?$>R#~NqtgDlpV<8OSzydMKp{N?3b zoo)-0CQnRb*&Abo=$PMSSp^ZW;Kl3ilBVb?_WEi$u$a4UuYKQF?=Q%$iLYx`YggA1 zDpDGcWFXoam5hoHneI#@z#mKQS{++g%-vqgS>b5($;VUe9}AnR;mcIym_#e}^=01E z(a{+L#WEvgWaNm1+K*k2<&=RZx!eYrgB{%9I1gSHiHM2W;8g+6a(Ag&;H18aW8FaY zhq$(33VOkbh{GW8J6*9a8^uyl&f0I%H~F;}JpbDVR5r7O}3h_$@vE|xy__6`V=CjmxKvzK2Ne_8o%~*GVR*#nDUrGFMFp{ zHmd^@`NF2W;67z4`4!W6XlAvp->&mn6C$&ysy8b{4OnE~rx+obCnnnOS^#t0T|J`u*m_ zD%Vn=ccEcNXYS81$oX+t!+L0j&(%pn7qF{s7y~TTQM2SMOngM#F72 zjvcG%jCVAQm+e9(oGZJjDJjr~2Q?aQ_WK3QL0E!bmJj1ah!v`BwsXXS$kmc?>TN-l zs-%mdy4zvF@y=i6^b=xXThy}}Vp#$@0OOUMLSlul2`UPzT!>7Zpy`=d^ zO?N8KwEg7ok2h7K$Gws$b|A4Wi=Tp&*iP@I=NzDJf%+=*bD@VKlOS&IcoFt-Z_@3` zYD0smlpbGeV;D+Cv$UXd>@ZKY_fsc4mn*y@T7d)61H3(3vuV zDvbxwAA29$fWUb%F9We~&8@pWhgXsLX|dmx12&)xh`Q;t^(gyBbMgr&R-=qt|Be?K zI*6E4Q=u9{){%_}Chw zw;-yTx9)owG_g`@O9m+G3c!!B};6LoIbGea`pblNY zbd69_ApWgN8S%ow57dLuw7)0UH(Q}e0{!mxH-7!Gel^u+a)M~7N_rcc(um~KxPLq} z&uEg==bj0X)-9ANW`9X(?Zdy2v@!BcO=Byt8OP73vFUk@|Ie)P6!EUZyZ1}Od4D0< zXVe_H;LGlUA5lToCZ$K8Q@>RhPS*3Bu1wcMUrsE&f;W^)#mHm_u zq0+di#Aj$vx?X-RD3l3x5X|u3tAVaI6VgQd5nU)N0Y;QPyik;p)-msnF)xmx#Xk6+ zI!T2ZWR^a&?kCdn{23s;$%d;x`xYR zaJ*sz(p=^vo^@sYd?vhW-VyQ26kP&8K<7|+M;L8>q54BLCjX=YlWceIbFhwRtb1bEyUh2TfT}YAnxM9m z&!l45I>e4>wfHCL=3TXK#G7R`gimJS1$lzEAO+T7-Ms*E*_k7f#}%MLTcEsKWLiEw zVxD{-BlFJk-!142QrvJKY>J*detgPPFPE!sGuU6xMkx8jIkB@;Zd+5lWq+`1I^*uw z*Pppmw{$!1OzRe|T~QO#D=qmUUr6A7Ed{0#z5vuK45?a>N<{f4?vh#!cwhFBM-ko9 zX^J(I<}+EM9U*p5C`x=hQ+ags36A6foS1cgPXoII2)=q}kz@9|LvN~U-ih(FZojS6 zRFZqRD=6uYX=C`q_ik=_mz7ZRz1EaV=z547cjgB~;Sv2;EHGLf*d1)4`77#i?NCh# z|DNhZ=mMHL)?u6d@y2rU@nWTxy79vVn?JqL`1$CAB=?6ao0*Sdm%));mTHk}40 z6oe~dWR+IAk$5_`>^nMFgGKae=U5(H5+-7t*%1gA@9%i-`OYxn-twUJ4-a>J@sdtc zco)n3OGyvMB$DhIO;g+$P-ZrQE(M>k(D`fwA_ z%lT8*VHX9`F^Q16ebX*JU1@eiPZ65PnX!&pWT;*p;mTPFnuwj;(h72^d9dF8;OLVa zKN4DO^SX8ce-9oa0`2*ugE)O%-7~bC0c#w-+l;ZlMa85Qc=z8W&l6j$!CY7TJYSvG zdv8Q`AU#(FtrCp3x1UL;qcTlZ0&~kqrv6|PoE`|M0>UDPKD!1;7BPlqnNhG2F{TPp zzyh^jq#8O!p_+BH_?4#ii~=k?$Z9o$pOVS4L!pM)5jDA?z)&23jV*SwHls)pB%o)j z)2Pd;3m0c~p1A1;n&Bl3_|bJvV9E9V@|RH(fRLu}Ar!Lhz)5QodDL1K9m{D0i=FBV zUhWg=qF1vI<(JIenUUhZ(or@k^Z-b&tg%mUPtG4dXbiL~%`N($`DO6yDhgoBHcKtl zf%XiOxq8>uDdv|tOzZp!aPyK4$V|DGJaW~j1PdwQIzQ5-)U}Uk?QqyY_EiyY8L4P{ zCP(my@`G3aNoi|MCvz@wEc zfqR1T5mOU>ksR)gCyaW%d>1C0QP;WVLdhS{DpC{SkMXc*!SB9jed|NC(x;w zYj?PE0wUwN1$7BN(Jo3gFs#)?#jxo5*6Gb7Ef5Q(Aa7IU;FQ3g&tUCF^BvT})i}6= z&B;PdUHX?FSpy%QtsCU$*I^%BT!GJM6@#n40kXn#@)Gh+Tpa>;?d zc0Qzo3)fU@jeeNzeO?xn-p_;|UTL;G(+c7fiKOY@0VcS4k!OA9K&2EGR>Tf2mxyHW z)Nlf%$!Qwn2X!3wIBG{dl>aLg0+Zcjsqw10$9NOOAV_~5Pz3Yc2xYVVm)uZw7<%uo zIF0=lP`j8{^i{o9VP~U9@wr=$K!Q3l2%nIJ@d#JwM+IW>r?6{6CHB1cwF5xoAU<2g?Tr!beL#m7+~ z*nf%YUq2_ZhJn~Rcu$i{Mn=YwKO^Wc-e#ghpO*28Cf?4_yA(9CUN{$qAtaP2+%kLW zRq$}@j##4=lleWy`@6KLt2jIFEqX(oX(slJ2Ap#~PNkEreBQ?(>cc}?67i>I;lKW= zJ*nwMcFFW?hGzzou4$JBiXuq%AbA{RyCD}84QgEiNZ1b&TIQVI<&~TPdk!dG4Do|R zdAu7xT1_izGUqW43o89%m~Q&Az}r>3iGB~d4xhSM|e9>B%Dyx7|ME6?1~63d7fQZ zF-2agr27=y_m)VDop6L=PS#XDUny@w+)|t9E!QlW^U;K{rQl&gK{Ttr{jT;4N=6tO za^orDz+DNLChAL~0Td)sQR!K@_<}O}2+By%!)Fj=nvDu`0QS7|Zwd#<6f!n7P6T>%jK@T?{#?;T#w2t+=-ZsfrQ%yDx-?Tq3f>h7RcpF5Ib`_0m zu6OSfKvD^wXx|aWN>rF(fN>2lw|2_V1O4T*cZ@|1bc$$4NAkl91ygB#*ooVxm8N;? zm;KD^6z@c57mt~r5Do>&WB18Gl6T)KP65BP+|S zSsQYTnBdW}9XY{WHnS-xCbQ@nn12Y13ZX)m7c}o$#FI$D&cNy>Zo?C2rhODsgqCd{RwyY z`~NIS!buN+4BUB3LQ#Y=rXFx@O#nwvt@6I_il|FPF;TII$2qv?KIs_Kh_f>vXx-p@ zd=NR>`21;?G6y$56<4Qr_b&A{!C{FvF9C;E9?o;RciMb}rXPmf^g&#TeWv8m`K!d| z0f+BIs>1{@pe$GCXew8yThfvaWF&8IQ6H+uO^=WpPPKUIm6p9JPt?6V>LD0SZ~9@e z_e40XbnB*Qvf_%ahv8FOmIC#yM;?&oIY)LQ*r~W>Tc|j?TTQI~Gr_5FS7~tnRtmuXX0+IUAh(q3TGQkLsUmGD3GKtN6C1K#lP<9u|iugQ#6fJ5Tqdj~YqNrU=0m z8AQAdF@%p~&DSxY7>%VML0qA=N7bsZ_Xgv6t36}MTQ0ZS#^22Y;o<-Tvlz;0sRHS2 z+&)wB#Qs`~(A303b*@>_m8UkiuKfJzEH;T#t)AYSt0kjGmf4s*RJD1s&FD@OFD=H@g=w!6y8L(rwo?Q7=MP`d zy_`$>a<2$p%4x$%X8J~oO(Nupp(un}aD}b40+dvaMuE9`JCK$!u&}I)IzyPS9^i20 zaELexN1}7T;z6Z;Y3m5+6<@*gg)iq%g`S|mT$^QtE|F}2&)c5a7Qp-qfm|f1)Efwv z11GNU?R=uiJC;2o;;6!O*wMnJwEoC1H$mGfv+ztfLjm1(6KYeKCuMUl*Xjd`hY?kV z=pkP4bXB{%_2KhpnmxLgeg#CJ9UrEDw+-anNru{=T8w-_JUcIFzKUSW-R{$cow^ky zn}B+@lf&=6$8ZsWu=D4BI`~7Z&unXJR+|ZG3)Cdzrb`?H&5^$ivp;Hbw$U>6$J5GW zC>1mET;?$sKrbKvDS_;_tz1649K0oWBL6O-W_u$zS3IdmPN?YhKCtv3GFPFlD1{bo z+{424+|%;Loc!2DkNHmMzCGjxv>p3F^I7BGN8m(0)|{)M=G|M9#(L>`j;1Ndzh{H9 zP0@#CT1XNMRY4(#CItnFoFzS2B~p6^QTi%Up}FPi!|8p+h-2&huo<;*2vK{P(p6=@ z9>*9X|GqNmKEx4mK;)Wo3AGwm11MaDSYOd^k6~B);eSPy_NOeLkJ8~|K0?{IhZ`p- zb05+K`oxQ>Hs2Rg7_@CB)`X0G_qjZZE`lPBuYbm-JmNK(KXub+{vt-H#P_>0X#%<# zWH|<2=P>RW;a5<+ILX1tu?Vk2Hy@ie8Ex zHsc$=CVsmuvidgLxD`UxjM600fMt@Sztr~CPKwCwR$qr+tf`z9@kY}R_jKABweS*B zVO4!~kuuSjAKbkT8?PD`TP!FBW^o8HkQXYopqSd;SXhKw0h;`<7sB59KSN$!EiK!X zk7=RvA9>0LRB8#s^oas78*w~QQOfAGgv`(TJV#0b$~OVDJe{ckcOwV`Yw+GS6*-QD zHy6bC2w4xqkHs9FiiD^!w9H%G^VCN{4g9K=Z$afPh)BYkdvOrXzAhCG>IrQOS*@+% zj)En?N4INCQB@|ew)%yzj<2+ThQ%XezeiQTc=wvLS*}T0>_(%F>1khQAgcGUv9kmOu)hyh zcrhKkIu9&?Av;z-Lo>@BF6sI?Z%q(oQb?gTQY9exI=3FE6{|0J^(uey%E}2j@0t|V zUD3aJT_*i9sz8vl@wFTm(w-7aTxV?}QEcI2?wg_enf&kEo-ra?djWHj_&LL=DuipW z_;mUK6Q3)lA~*eu(%Xbmg&3T4(WLu9(E-+4bOp?I=mAoyY%m2VHzK3Bc%QdEor&(# zCMG5EgmMd~4vXHYr;5Ya0*>>@ziJ8svhWVAXGM>Ox-KKXejm1qdEKs*rhF#ppZfKw zK3ep%e4a;aGL_{-y%X9&yq8Rx;_Ni7QRSru1JsF_jADw^X~l-t(Ds}Zj!#m5Qadh{ zG$S&xWw=5OeqWS#H_}E{!H3o1j%Q{XPPDlRDe4I}{ckHpS|Z|O3XqhO$Nl{$PGvP- zg`6p*663W;UoPe$HCt#6n#n3wZ(&qhhLPjvIa@k^o4%a#ACsBjS_DSLKp*NlvmO){=^?R9baz22(N=X=iY-`{_~?_bV6&UxMUc#Y@t zu`a3ii#-juagZSqkY+@ET{g5jhEuSs9O(mj12}ys`qUMgQS5?UFuArWIIj}9>b(bv zKgr$WLLRX%Fa^JX-@{HxEqp3o3}w(-Df|j+LSE9-r~Qq$vYDn+J3C?RUnmfh@Z5Xb zFsI_1)PlDwr-E6R>cOh7osL2u)(#~(iXj&QK=wR>kcZD@L+4!+#La*5_RlHyC7r{rb252r}{%ORf= z23V{Dei?vZ#xe|v%A6)9+3-GAeX1p5lNB0CGF z0d-6~=fE9TyltxYx!}{7LGI7EsAI!yg+F>gya2apqu5uzOEWQ+i6 z#9!FXBNAE7e9vhdG91;icdSe_5>*=)6Ivuh^(>1Mal^us?~P;c-Y}q}Y%ojN8%<;6 z=P1{Be|N%bw0QwrozE7*V3BYR@lXD*%bSTFWHr;h4jkxjqQ~9d zBsI{AzuX->_eFsEmQKpgbb;gxL8CW*rmo2&_vx|QR)L&?XI@JpT#HwB#N++5tGKSP zaCfz}ttNXWnXI>CoTBAi$EvQI6cxo&taZ~&4=%sl@v{;4ylU~o?(LrVZ8gAxk6)?& z>x%_Tl{=&d#OQR5piw zfCZO1_?C4FUM$KUnVHayq};EDaFWdxQq(>8W=#KfW=RS$!svSc##lLU!nCU4 z)ZkV?JX(MXR>KC&2yZR)cTs+TWN3h^pIRUS{A0hGL0hKB%zJ_?lZGjEB>)1J#%+E> z5+VibCsHuENIEB`TdHn@b%s4{I^0T*bh97_m*zZwEQ zuqe5eDg#rGgz;OC4}iLJQx)+yf^0`+A5JNB}sXf{@lf;(PU&3v=cwFFY@095DT-L}G%z`F~- z70yECz7AnnP3M3XwG!2hB1hrlSNgcu3Lw)_5*O{n#qi|*Y;A=6a_k2psE~3Iaa8^F zKX0;dNY;$k3uyI5*lmFm*yq+WgI6W>PssPUR6IXeuoXgRAFToRDTkNd4v-jj`*IDy z$ILnkdy9dnvxa?_WrF~~oI>m9Yt51T^Y!7?pk(#nAFBrng?>MVLG5^ck`0DvsIEp8 z{>)G!M=YHHAs7&bxvQ9NMp=ZG_1g`?F9WUQ*xmYr#7`w>CEYA;R~>5c&q)NS#0D6} z6srdP#lyW(gPLD)h70jm7LpR3|6tHJdFo^YtJJ+CcD`|bxOursT^ZN1LNYxwW2~>A zD4KQC6bgRY7IK##Yd9fsr)Bb~TO*|k-1^x~>mLfT!J;PZXQix?ElCw-5a)#K6|(3~ zL{*vv24;R`lOUzPdu_s*M@RT=BjHQKZTSU4`tEcKiW_}1FG5@{Qr^K4Z^ z^UamjO&-|lTQ1hYb=^P0v!~ErQFZS?JP0I;?M);A3mV~?T-(~(xS*kKz(L87P-U*62pX-duG2#L1nE zFHdNsTK%v)`GuAfVRn&tti6c6*azC!4FC!FST?OVSSX|oX1^pj zf~>NNZU0;7Yp;PKB8~dYWvpM@fc(~K3&Py`ZBRGO`Y7ak6&a&9)q!tl{_!nPld@I> z{rHJtIp%$NMKv_)hsD06rG_F6`SLmZ{}95N=nuRX`C80&u-_86tnVodHU`RJx$0PI z$^B!NecStbBLHTh-eY4g71McBK z&o6Zhnrj!(5&fE-n6%+$h!=;_WWTv>ZIi;wpZiaIj%)D13Noj1nDXvQNd>t@C7p8B zv#=3X3w)*usBuTARTu@CXJfideGF%PB+#P!{`IoaC0*?Xa)mDrMNV>*8g4J#9{Mk1 zi>JArG?t52Ar(-x*bGV#y!|CH(b9~1-TJptv2Ew?(VNdVfK#YAlkFSUSp0hFiJe&i435=F8B1W&ch-_*Wydh`n)bU1e*6<%j+_x zg;Xb3u`GnlVN@Q^PS~wSU-FR>;C}N-wi<8pRs-Ey!kO7CwEU6Op};{Xa(t zm(7*9wr4z7ZKX2Ym!nI3;HP-3;2m|cJcRuxjOpv$dBsd`J+V9aE^K|)sYw z+B5Y+6erbLNF>=p3)fmAFkiGW3Ey=tO&Hg>7Vcz* z8?WKe`Oj$lu)YN@^^kjV>m6cpA0;zjFpC>h=Xtlj{-Jq~x{NQdzPk#|o)?wL_+X1W ztCPgAfXxA=m=805>|aOBHpmj&^lV)NTB%Kii-XK=7<}1!)oR@4(&+HO@a;cdt)tAJ zA1di%r-~rCSs5@WV?cD&Vzl&9!FlyW$b}3kuYWYvU_J932FBJ*kdZVOxr5MbssWwO zL4ER{Gd6E_mMoiC3_v!rn!7eWini)(F=O3DCM5@HCc7{IIaCfh@4uhg#^B?lTb*2z zE2CPvI$uvb`0xG1#UiWOi>kn8g9j3dZL3AV7m7((m;s7qpSRPg!Q^|Hf^p*Kq&GJC z(p+T?#O07@&H){T%xlbpbuW0!GBCAy40d5Q;^khWyi=$z7KNCKjpHs|Us0zXET#j( z_wnA@$*p>Sv7iX7p=Pa4smNb>+<7>dzfQlg5rGvCfWMZbQ-#^|9#DRlnmgZ+DJryX zNqqci*Ch(XQy8Sa+O4Dbhhh5glPJu_gU5@nJUZDzUwNXs>^32JGX+@_oE`hPJB=am=lF!l%kdDp>HyilJ+ zw+qHKx3+(q^*E?D(`P%Bl8{wDZL2Q%KuC-~^CFx*YLlDg%pTVv`~ z;bc569iP^7We}l4{Oe5(_SH-`)0!U#&<}CtUba@M6XdJ_8JI@y?uFE6CA&e$0-trD z(PhIifqa&i+l@>nV)2#9$yc}Teb3uMvDIK7>QBjKS7x;1Moq+?3EX{`HJJV>F%Uf% z7n3AxlJ+m}0eDFhp|uYfi6f+L*=P_%H{A6a^{D3L86k6T1L>8z#jZ`IHOs%-V&$rq zLmAWRo(ZKgr3?i}W*a_ZOYESIC@XXsGqSK=V`4=ZZNhEw=6{09E+ zRgOUrK~M)GR~N&1qF1C9mAAvwv7dH`po+x*dO}+UBnPrmkw;q^l63w8)S0wloFFIm zN97lmSkArL!#(-h-d?`GIQb4p-)7v4mm2Pb@-2YAa5fDkdutiUzy*P8oBMNca{o3c zhJ4+h%_=??RgM-ms~Rv1*wjmw^($kxfyANO{fHw6Tkx(zx|wgQ@fsdv1A7YN=wfiZ9X9-D<2F*oPork})XGX$v2Kmpu$MPqM|t zz3p<~kNF8R?oi$SGb@63l>qGeX58cD#+~76)32w>-{7z#xQ9%GH0;KADxwX^bfuea z>KR`-j%C3sN>niLm~eXDU6p4~lbf&ro|1ZdfZ1j90aK%xuHD zU69-iN&q$Wo_HEKo3al=VsCeRNw{#du5_**sa*V=I8zi+SOIb`}oouTNN0k9C4wJ9na?50{{%i4I8m6=`^ z3{1VUj;1JD_9f#TDs*-AB?O$>cML;tk|Nb|;BiHxB>Ev^_J zRrCTBc?ra*y92HxfI3_!COR&T)JJnbQ81s&hT4nghs*Qpqa+{Hi!uC4+IE{xF!0qc zAb_&Te>TnnHS&u%do*=cVXaC`s29B|oF|V^dWlukDm2xtfx;}E z>~+L9)WEN>v$21Ap*6tP_;mrGxcwG~Kbh+g?**M$!3(w8w25`bBKgcMczu=5)yhr@d~xFjKq8N_rhLZWCOeXR#!JU0+_ z!uClSUqKGe9*!G51Z0y7O`||UXO8S%!uim)PIRil$+g z+S%)is>n1IlH85d>kq$5%G6ajXq#-5tN(f5dFWRP!F40mj(drfLr5mDj}dFevq6sM z49tnFaFy|sq($@1Ux;AXtP8%xb9Q^^zKFSbw|R7U9@HbjYd6khx_DcA6Dnv}dRhvO zz1Mb|xaM7kG(i9vUQN}(5nN|P0i5%nvf{N#t>C{}&d@TLW%g2OGo!f!D^{5-_g~rB z+Ol#mS6vN{pES|9ETiOY3n!)Gf*g5%(G^``dsKEsn!1LZPRmttRPNlIt=pjWRhE%} ziDJ)4lXdedhRIl3OEQXvUZq&2D^cV4)^8pZum=)=qcRMhO|Nv5ZSP0yJ;BkqvML2Y zW=HM!`Bb+qpKDz~5G{&5NN~MLb?^wP8%0s46`!Zl!8PMiWpR>RcLqm@pwVAZ`W$|- z%5MUGu8$cu0P5c>+;LAlNhB;!f*z)x=*If6cjZN4giHu4`sj$dKpA{;Nq#1`MY{d= zTlCB|5M9D1<#rTZ5=GB>`>?ZCv(%C;-!zl>VX0XjU0F9X!#Hr{-^bdY(8)ET^0ZdzDUq{u`kp&&eN#?AT+c|&tWs{>Ft=LwZc%n9iY%y zZCA#rY=l15cEBg_HqRP3_%z@le~8~sgF_!(fTnRt!cQ$p`7TD{Vm&c#o?l%)#P_Du z<-#e3AVxU12%(*xUDzgtkfa9JYm+ohXM3&N9>=f3pG#2{*@wl0hN@wjG+M-fkEeWCik0iDguM6f$Hte!Xds)g{A|D}IE0 z>KH%=T*B2H+y^F-Pdku~#0d!YwhQZSI+pNqZ_2OKoshG4yg~dpD;vsyIURrRyvm1c z*TPTS0laVI>#YT?NFPm)wn7~W=W9qyf4Q1^^ZXn|$1BlBHBUQqx0W=1s!CO6dtqLhi;CqjDY zC(srju*2MU$ho9nl>`F0k`JvOygF@R7Ph&_3Xhkaic#`sp(W`rq8A;pty>0_*w$(f zJg_Hrb5(-g>cjzdhkHf9QY`S0=yk~9{c|One1izlp1B5e7RobrY9UaH7{YP`oI0wW zB$B{vvajr~h`NNsXT8)~8wCc@H2+I?72OIJNP;a+Sl(bGeM-Hoh+HgL`34I;|L0gY z0=vCF(@o$9&xOIc0znefW?|7=YvY8IIa1u4;J~5}c_L{G|$QJw_`wHI|oPGQ&;k!Ar^PaxbrCIoALekqH(?CEc#IcW~@kk+Ec zdXS#9nU;DCCfMMqzGx3O6aSib0wzMrYDHf!;k{ykXgHz3QcZcBZjUa${u`{u`VZ-B z1KDU#UT^0nu_S@9%iMJGy2HWqUSCgbK3g6pP{yHX2uE%K15<&v905xyPSVjE24c^A zgH_!6!ErX;!k-!BBwhmamb=a&P=?TU*SV@@P()WWr+jwX2ppoq>PRZe`njqm*({kp zN{+Yt%DbylRbmKU-xSv;*sb6KY(qf0iFeBh^i#X@TW1j9Sw^RqE^^lGQ7)6#aiFo( zN^V@cB$;L*9iE^9gnfz(qs~y1w?9F-tO&0bQ`A90Kq$8kD_9!6u(=voDD0B5O3Zf( z2HqWn7wJi};vz$M4kF_LBn#pu)rw-w0j&0VU%0(?Rv`C&@gX<2Alz6vU(F(vnZ*rt zecQWwASPKj0Df`N{Kj1>J$jq8x_1!$&CC?ewdIPHlmns|xzx`oD{n*>BPuAYe8>Vg z<#8q2p}yP`JY{fc!wR7WDlRNKHvF|)a$o(kQSV>BBEx7=EQ<6!p^(3QEb^q1jBZar zcvBBE716Svr0j!L%duxNPg0MqpzA4IoH9(*J8%T@kfm*-95vio6c6mL-QyJ-0^Z%8$+U<+m2 zVZORQWhDNyxVVNDQSN+ogmK$!gZe77qspVeywvjZQun9c?8Qfx#kG@e1K3;;5}7h; zDewH&$|8J8!SUTrWnhhcs8!+lRv<3%<;(RnIW?Cr419|ElJzAG_=L)ah$=>{6cv{i zLAFubth$d3eD-f&?t8456uKlf_c))cY49o6udr-o)DqeicsuNlE;+nI9l0V+ndHt< z&*&nyE$$s#TY{rx^>N!TVXW;ir#G1gRhABlA}hhDk{{qXNDY$U>~k}nAFzh8Q~U^# zdAX)aM6SsVn-D)OmH|NLI72X#tfkhSN2c|OHx&#r^H<{&pv??rAn_$?cK3v<$s^wt zlb$(~q~=v%{$Asdneig4cg!5F*JX0EI_?Nd>^6y*U@A~vQdLWkQ%g7H zO&RljIewUVLY23N8VM;3e&ITjQ}6>zqT=IY$HC_kT_opyyHWg`qfh_$f9v|qN{W{} zt2Kj5@6rYNE{{ko+eiiPQTmJ4p3aY^9S@4j1%oJpK~!EluiYXG+-_LiU{FBqURcup zs6!O{aNvnu95=b-C8&BYnRc=;z*^WY zcwKt=_ZH0RvV|f=V#(+^kv|KG3u--rDF`;>BuJU=x2on35Q{cegg>z|c`v{(Qe0MqBd%^})JR1nclqf5kP zmE%3#pEXKa#>*Mw+{teSBRY?wiR_d`}a>_>|H_OSj#jJII ztw-eSG@6e^7c=KKxtax?4ckVI5tbYn&M=^ykrReWZ@bzEruJNAO z$(Y$WD173+o3qM-;PCDcTwVElkvZTgGURovwLAL9pjG^~N2X`I5BGm~FYhN98kt7n zqB+8GG})7_!IB>Lf>Jc<@pG%9T_0p8SP2i0M)-9D?1tLL`*#n_4g!m5MKrL7x`xtz zbH)$-AI_|FO-ZWF_uGfAfmEqUo^Ll)wud7H~zVdIu|;4>#6*{ zp`p)`K><>0*;4WtsmdO$CLF^{cNZ(EH8Gc#Eflu!1dqE+soM6tgM*3pvQiSK!_>mw zVseXDOpQ5?riFd^V`SOa1^L>Nv$%ZCrpgVCp{EOCIkjVfvAcx*wZ15pS$ssJb>ke% z3m*P-b}a?G&Tc_{#t4Gl2^}mQGuHUCvL%e#lORw2l@Hq6O$9h(@VyPrc7ufJ?#P#7 z?hX$mE^1B3NU$07y7NCR75ttfFUxG;+MyEUWx(*QS?%QSx^Co@r@warK>)R%@kFM~ z^@DsWE!M)k%QMm9;-9(ehBzL)C@1NRxq|U7rm#1#o3Y|%Pj+6?&Z?6T6+`s9bhK;^ z5?-l44Ew&Z9Q(`vS<>ov(aQYk9xOS2>dkWucW_}%Wo~t*|X&mj}E6` z@>8&TwC65Qn2`{e%h$wQ`*o2R2~0uHx0b#UMUD6CZNo!3{<5h!LMl6ZCpn$!Z9}%f z;bGE>{rXVF4aG^RQP<3uDV!LGfU zwsv%>PDOWFI_FS46m#&mwdA+$C3G}cjZ|c&1$m3tnn?BaCkK*QW@-}8{(Q6AN0YVi z#K9>&ALDaqBGy5}WKQR{b8~O$yDNMMN;c;u+}?C0;dQ&pu(%Wqywxl)c1V>k7CBN6sxpOIHHx%q0>ddmJolhMw? zL37vs7FWcAz1dc$2yy0qC0=8BVeiY~<_>ye(Xu8HH&wHJ7%-U@%>ed<#SdUYXQptx zs3VfOytgPjGxFx3{pN^?SyXb4>COHJK@Javh`vfR4}8WR%wNUJeoHdwe`D_3>MW<9 z>?s~Kz3x9g-2C(Bo?wotQ8nZJO6T4CIYA3$fj|v3@AxIL<>8^e<8qZpR^89g(z64- zu?NHU4-b=ZotqoSl0_JBm4rmw&*jPa9Ihtb3sL532U1K|!Bv$gfbvW!0UujuP2Xzi zEc~?8f69)nf7pKLiraAMW}%Fo*w1P3%Wh~Kp_9;DSHEHEgHE`AeIIo!mbV+w3 zozneo&U4Orp7#%Ue|o<%d}idc=ic|e_gd?|*1E2>Lp9WtNC@u}VqsyCJX4m}#KOWc z!@|Obfo=nTxs;hZ2HvopG?iqr3VUhSfd2%V!=72Zc!9+Md%#3 zt$#ja!*0IjI%c>Cyb(Ak>pEd!5s}~gVq<+urN+XN#(E|%^U582GYv2G)$nt+}B;(jVu4pOB|bke;V}fA`sY!;o*avqVR@o*zxxS2!-Vp6>K~5-628 z8f%UcU4O{=GApn^udK6I@_ci(lH~r=qS9W`F4q~4mDS?ikVGTj@haD?Ps_(IzbKA3 z_}?lpX%2QBc*d@q%x`|dmQ0tyXBzBtG;RsaQK1l9K(e4b57*}(40!kE?WDT5Q0RArtEoxd4l%+r9)VI8Bg>g}p7{pPP~X`h0(c&axMZFFv_)1DgzM~l%?6UVcD z_D0@&3J0ljq!L3!g;$s7Uj7GtQrGf+i_I$;es*G8KR+C<4|Dc7%8!Yxq?#U2yJh%X z?6nY+rdT|ah?C8uEcG|qiwtP*wFrzs8!tO%z4)E*9dTf-|W;Lr&Il` zkvg7oIsz8uJOlC_m}@=5%BYc_Eoi)31?6;ob#5=k+bBTJt`<=)VcdXa|2eysf)k4S zO@7wo{kzsb?tK!+W37=iU+UN1{~dYnvf(^qYIk=qb!?Ii+V#9V9DS1ZrOIW))8uf{ zzFwhEhBe~elh*JUQI~aCB9B2<{oZ`}q}@Jqmd$v{o2Y08sTt3M)%ob*A4ap)+}}C# z7X_?GeyZ};4prY5b6Gd@Hmdb3+u6^4_F-Ts<4X0c&a^`o>khs6*zw-QexJ}8^4;eP zVBrjRKXPbyMz8%GR4bLbI%%flg2l8Fwt9fH;Te(l1xk*#CcQ>^To@Ve_3^dQnz~In zhSUOgoi<7rkv55TH0Awzb$M*$N74k@Q;-0yeul|S(s@uouv$R6HYkkNCx1`x?`G&1}Vj7y#iYkW&5VgirZP?JbwzuGYgBf zNv+|G@}*>`#xgF?hfq{fMb$h{pgor=<%*>XPq7>NHRL_))Zv;(zr361<$4YYJR4N* z&}a~frj_vgN#}bquN&5}>vG2R_rCpIG4mG@KRlBB!SkX=T3^Rdx}`Qpo8zvHcvNN% z`ef&U)|)l^z56ofn8+Mn401U4Wpg#w;5FsOIW|7+oPm9cpzR+%Gt?C8GH2-`GAvs1 ztey7(qhSQ>2PL=O3A&8R$h%)Z98vbcU{*Kzr2hJ{Z@Xq+jfI}rq$2>2kcha*kX!F( zdoc061s&u<0){_Gfzafs^Qs1Km~aNg2aq0NQ=C(Zko~rTS&mA4jd|Dg$*f-yA+t)U zs9XKz(SE>IFpb^r2p`Y1ZN+pAmR#!5+F%=zwmd?EVI|d}iJ;thO;gUn$f-xb*M?RH z@*e=;&#crS!Aj)fNLh?jb&35NEp>h2l>PR1CxmL3e%vy{hq)!3Dq6Vs?wg69Z!iU4 zBhbT9R~NwFN-=y3D8>E_gY^icDm&zo{%Q^$0bx(g3YoI%Mv@yrER(~8nW!9j-Es{MpN}Us@1BSmL+CwYcFupnFZ?aCp#_&{_t3z#&szsaQph)a%HdQ+V7$#(CHg(eQimFvEn@|uKVQv9d3c_2neBZ{O$|ScQouK%oEMyH zqE_DV$J12!8^VP#`)`GPei$X$%eS~3uFWqN^;*Tq^;N`62JGv3GLZbb8gHvGuOVM+ z$Zpe*|gsL7r_MuG(?^LB5VN<5&RczD%%0zu|vXd zz4jlVD@_QFVN~^hHU$0`r^clK;P7og9l(Y6;HBKZ(E9(T^na`Lf3_su(KK|~ zvLQ6FSw=&sl{iEN0sD(T(5QU%%-ZlfoPIQK{l+~3hq}ulBj|g2-^*==c~TP^T)k9R zFysYk4{TUQmOa#MEqpU7{DIsVcH@F!5Bz1>+LHpbDZ(aeM9It)_Fac^wbG<3%k&Gz zOO*3SwHC>N=b(ohdoz)kHv@&y0!cWg*IAK>1!EQ5Ie`Z9A&1rQeg zBz&{F8RqYO1Q?95>;KciGJlz`_f5`!|7&g!t8fKv#*D+Mc*_;SDaY4`^9!8U2B6ih zw$?+rvGEUIW~~PFw<~0V$$*qN@Iw|)D3Di6+YxjpKWPglWw4VACN91~=oUSn%sHW` zqMj5X{bEE5N+q6Sq}WtR?0mCy3&|2y^!E49elI)S4N*wDDozV?;gWffnC2+yexmMm zyz1MU#NW%>`L-8qqq<-A&-Kdar?U)T659+ZM-Aj7NAqGR=brohi)&IBPM2vTbKT?x zi0Y9wzs@5s@zKHziP5i87pQpafnT2t9evAPmX`wEC;FcG=%$ISL>?EsU5SEz*Q#E9 z!+Cw*TD6YB!hC(Stg4O9uBGeaUVV#b-J9{ZDI4n#C()mWMb5x}^cAzIILsWj=`b@enb=Fjl(py}4+e9IxTbj>XUP7`F(mPfhJulhq zwZg*rvd-I?Rt)O2nZIvJT&&-j@`b35#+vggJ>J~Br9u(4kbr=G+bln4?fP(NI)w|Q zRtwz5T?yR#I{@_IznYym>V!oOnnP>c9rJZd6M!VFF{8p|14>knPS}~;AQ+|cwYlqb zt^Voynyhg}va(8~)oX86ETf`UMR)_gTZyh1qTr#$dJQvx&ddlYOVq&XENvwND3U-!qJ$Nr?h@J^M^? z)K;Nfrh6)%a`d|s3SkUiNGAj1KiIzUBf9fVqUusVa}ZwprVDx;uk$DIh{T%xn(=9X z>@!9-TwUq%=hJ#eJA=F;oI`km0PM8cXnk=pPI+O|<$F54Tz~xCR=2j*if&|boz^Mo z+IDe)t$esePXii#-L_nJ=x=LSJYYpXFloi$`c6vna^4a(ptfb(k;zanY#;>Ni<|s~ zH);nfYPYCA3D(}OD)oxFQ{Gva~1^UScaORdfar2)zqW@b`$7Xio%IAn;@-XGNdARk0cKqkKVE6P9 zbu_wuVx{I!)QU!yES|MWIj)#+Rt>WuETp zZ2~2Q^B7&4(zG)B@#uQp?^fEVy%tOTQ;QcD-}j|1rV@y+I`W*SJ9NpS4}8+D+Dq+x z*(Wghc4ZvXt{smn<^`dV^!EERmt$d-QiAIlo;BJI$Am$A#$|B+C3em=E;^E4(H4EK z#As@B0n#ZU&+FDI$$T$Cal7qOca>TeQT?=AViq1&<1YHPqZB!tSx}M^adjy>_9Bli zN}$q_!wp9_Ecd3Zz+SnnUT(?p4IZ$vwf97fD>lJ(wC@`$`gx1U4Vjv&Q zHId8LuP7WwX%BWLaBplnPhM~JbrmP@YKijZYZ)+u*Z3_J^D~fjuI7rJBP;2E8g(N4clz|A?zf@kBM!TsAJyHh>2C4; zE5X~?VjC@^ks+4NrRt$0+By1`vq70YQcf@V}n$tC9U0D(HqVf`(UGHqX2AjcS zzWW4c!{Sr$6xGhQ_xUYrk8=UTSEepD$E#`OW0k6HsV>Pb*Djd_v;q^OJ>D%GoQe?# zJj2p4OuhM49z5DUTIEjoI}QwpVbaMr$KuPVKy~3g@%F=wx061r>~`J^lM!v{6$urF zwyJ(7!>y@KK`!2V5cUZ%5r3gsE81UOoq~B8CU)-y!PPKk{VC@l@{Qk{(YMZF(NZC> z?|Jc;K9voXRw;1LLhg$Tn)C0M=_9)}Pf!!-)sw<*q}o?oH1<9bE)t6!+vz0RrJ20C zwTWCis3$cg56wGm$~t2;M=}-Txq3OOqzd#adY5}rEVaHqF9s@$DbUvsxkHBn3V2suF6=6|<`eJU(q<2*_5Vm_ zMltcT=(dk~`Mejc&7r|_YG~eT$70SjL!SW&@BH!Bpm2D%7M=bgN*h#?$#wn)9nNBH z9?2`-#jqfQo&$`9aZx%2-~QOHeD304CkLLY_brirKSU?$VzPSM{e%TtbX(gI%7Lp} z`yr}WddaweV;N-&Tj~_BwXtSbKOPZ9S$SRjiPwHT-ITXkRa%j|Cz6}LPG9}?jbwFQ zg^SOR5hpjJ*)gXdVTRSim$&LyyLP_Jz9;>eY;ZB0AYh#)J$8k~vyH)_%tM>=uib8YuGVv5i7TH|tD@Xiw_=9U_cU$TnVAzDOeA$a5m{PUy+i30zPgz>>q;8D z(5qKo>h%5EuI$eE>}bmP6wjq2`rNefvSp`md>vkrTJd`B7<#>Adg)@jUEkAZ3xq)1 z>H5-wo?4;vMJFS_QD_A1*3LKBC<|!uo?F8Ek!Ue_tgg|a?^;{YQdhe_icQ-@H%5u= zAuJ$81(|)&iUg{)E>`l;2FBQ+#bFA z^_cN%q+}yI9QLfrxDkiuiA6;83)88_&H_8+U z{?t=giP1MHQVi^BWm8SHUZvbA%v*wsx2T{$i$TCVFuSH=vz$C=@e9=i1$Ba{kNvmS zB=0);qhuZ#=KZ81Zam)g5_YFkB_-7jm4mtZ|I zR^@&1$yTqfiHHyLLrZ%SlTFkVRlzt?$$NRYopswXEp?eRbahI!&}4&KHlwn4{j7%C zt!D9;$5bAqeti$9BbI%Z3z^udzqT9vre0BIJ*wEE;~5)ES79}rH~vzI&fGH9G1z5o zpvB=OGlriNs1}u~2gOn$P!al=W{wwJT4;jPD3Gjtp;7$|?_=X2_Jn%*cFiPSQuT ztRIPVRzFfYuEk`8w+N)ijUUqXp|W>WEmqdty>T5x?$8K!*PSd7WyIken}Uyn-nGB@ z4zDbs1B%nG+m$PxGX9S{c`B$c-7g#~c3VTUQ}3>~ZjEOt5Lr)_7nIqI4}5z1X2Izb z6R5bCsTIeX*0iZM?3Wn|`8mV)tRvbFpg-<$=?fT$!{n%L1#8GYU(hosvx?_-^iwW< z>kN=7hTY5Aee+I`4A9RaKyyu}V?w>emD-ge> zOMBsv_-mt-Q%v|#S7EKeg{BLYvw^^i2C30SSu5w6HNl#;&%H4(yE$BKEPH;`I(rQ# z3oJ&Rj|DnN2@CZcU-K-F`L#JZ_WzhYl9*_VjkoU~YAfzHZlhvwaWvDJkQ$wyU(6G& z{S&x@PXtlS@CY^X{&hNibwypAU%7o=et+TG{`K=n-c{=^KYEkqPp-uaJY(h4TF0k# z7Ots^g2LGRD~HE66*4?_-4vK9G*P+k6EX4YA}PV<9`b~A14;LBKlSU3vu}sR9YWK# zPKI=I3x8x~mYB*9)x~BMGkjw!V0dZ1EzlO-(NZp7zg)Hn8-yIr&C>s1t@{?IvGV+zhPVl8TI`t!og8t+*90Bx%LISn>y zulJKxl-`f|@It75-cf1iiC^3mIWM++M~2_kUqnvyq%4xL3Cxj9fqIIhU&ur<$vw@k zNHXyk-7IR}4C5>;vYW2*2#2}KMjRE9O*=G`2wDy0=05H~G5nN~s&d=0^V+WbHow5a zL!wG;yC=4DQBPij7!Cq66L34)EQwd2EQD`eU+rAiHlqO!_|7Sv=Ct z(q$1diM$zL&CntF%4K0Jz6U!6hjHOZ2O`S81mfMlq!xLbeF-4Zqk}>9NqVnMlN*Z4 zGGgrDS`s&Hpc=Hq;{UN-j*^$*ik-ENfb)e$c~$)3U`2TGx##TWv2NG2M*Clr-2>b}CYlqJt_y^!gwvxZz0NW^THOCl~tS8Of6cg?HrP zcAZg%87YE;Mp|}T&`BrVN7aRw<-_0B{M6%jFoB0Vv$Ohv0mc`w1%K885G0U77Hj^! zwELe9_N~%B$u8rLCjOvYk;{X@+IFN8vhnWTTY#mRe20Cj=J%r~y|CIlk|%SyImj!M zLqaa2WCN-lN9vm0CL%*>#Az0I@Tir>-rZUs<%z!SNP`({3^A)fdpVvXJi^Ugh}M~d zi3^disXP|Nh+Uir(SdM-LK76M-Qi8TQ?H2YLMRXYxGsyfJYzjUc5o1vnhGfRpve*= zsido&_*`&vqDfS%`%*hTH?B^7-qne@70uJ{^R1^FSJtAf@&SC{2MV*U-ItRD>g=p< z^WfAg-6+@Rbd%TEYA=(?DDmXg&C%@67$o|c#BS~wQyH1~24&@Xa0Ua&JUyKKmA>PE z#T!O+ywtMoXE5Y>)X9W>{pE#MsYOo~lm{hMG4(bavQlP2a&NMnLcV3Mjlo{W&?Co4 zBKKpjrY@UNKN8KgKSe_zwgo0G(9XzXt9d+tAM2Y zpUA&5`TnJkJ5` z4gUQb0I)w9d`}wnKQ~eGalJraf$DaK^Ao8gKt%Glx1|XAEYNo$I7npX97oN1UVcqZ zu+PKy`|oE~E9pJ_122CDAF-!r(pOqsRwtp4x(M6S3mxvH1Q9FC~M0ECpCoyU=fC6AsWFZ7}j~5MU&oJlC@q8je)9=elpzj zCy!v}cD0Al`uj1%AJ%?!*(~JV5}K1Zo-%y`zaQz4HgC;?p2Ml$DxXBDrHML@($z^; z_sP&sTmPuF02bo2`ZEZn7`!jZb>aS)TTZ+yFYXM6g?0fFL@MRVuTpDtd@Bvs71z$koi z2g;goh_V7uE4^^9J{VBlYGd$=kUa5lU%X--=)_-D>rUdd9hID z(8ZjDLuG#Ew0Ify_(9C|wA*Z18@*Te*B2?2F6IOD%)5Y8;HT@>gu=>gnKqY$Ez^&z1_nbwnM=#<8$oI5G z|2OzO8W-XP5cUU`ApMrtA=Hlp)#pY?xb#_D6);TM4xbl#yCV!-F9T?x3OHxa-ZX}3 z2QvG7mOz;yQ#b<+=E9+^fJ%xniNbireeg{S>n z5Cw>nPL>M{9}3NFr1J#))$5pbyIEQs;UNbD&jx#a6dY%Wvo5;Ll%7kp7dR*P5R%jv zfCvAKq%h>7%``xn)->U8QB&=pZ6SFWPl-S6Ecc+XZ||74B0?Bh`tHk;ahj^30*A-! zuivn#{<3Owz-s^TC<(Azu$c0@zVuNEn}b>G;EtOr$fn{34JYD`nd*isMUXH^PNjP+ z-#cH=|51aMAr2zq)5IWSW9j##?TQ@+w0hg#%1gn5LRaU5x+q@Wr8GkY5@RT3@tBai z3r~J@6UyQ@I!(O!HqO_E&Ti*1B-u;S{cJeVbQt#9Yb__S#+bFv29Rh7LUUTl)RTwX z99#WQs?N8oeSC!m;(ockO`U(MxQhoZagcy3HR(}m$57qLzkk_$Us=|WpyV;P&&*4J zEEH4G7zHT4ySg~A@TNyJ%J0JBxzYo`a>TeJ9Jtt|rw-4xP@WE@ki^4I&L8eN?7Ex9 zQ-MSyB3uY61Ls(y{?K;WIpTZ#tX6b{y-LQoqxhzcWRxIT-@Z3Y^u&8@%gd~R)8>f= z-n4Yg(Rg6knnU94pt`pt&zx6!(}0|gu^TLt{j;H<>-IbvR=mo@579I`RT6H|0>96u z^H(x%X)Z||rk@Dblyr-dLxfH)xj(K+gd=EN|*LxS|J$Hwk=QSsDo z63X7{6I?9w#*7obryQ6>2 z?Dt9Sw9(TlVQE%`ftJ|(WvPa)uj+}WuVH%T$%!9ORq~ld;IZ`@qaKcgviu1F9xj84 z&%V2v?8O|Mw>*Ba7=ohMp`q?YDEbNXeFDlhiVzyI{(#?jGQqHBoZzC*Gtz;W5{+2r@_RMEIkQP^ql` z94;&7pGh0hjwH;$4d_7Jnqcpe^go{UIZmUBJm9P*qkNZ2Q~}!@yL{(u23m#TQKGWU zqq~gr*_VTp#K@BYB8@^chCP!f z!3mvn;(Cqz3TwQAbrhKy?}4V?>K+E#ejK|+{#hx4dV!;8fRS+weGbUqjsiGq*@)a2 zIe8$DL60d}HNavZaV{scG2}J+PtpD2i8xVRZEDv;rqoY@w)Z0^Wu=)kz&Id|K-$H| z!%z^T;hp10Jg|iZFr{u}q9h*=yu#<~VDHfbaOK_B7HV)j>#%wKGs6!LUi>-aHK-a2 zuPAai^BxMxCBi%i2u5ANsMnk{V6Xkd69Y@on$3qr(*BXN$@phUs{z&tW@RwqN9gam z;6@2WnFeOfN>Wn-{xK(phA=OrcK+Q3vf@8veM$yX_)9jXdo5c$M=?!1yDTIGV$#Mv z@+d@53-f5bpPyg!u2|};w=xaWsedb%#iScTQingjJ($83xCZM5L3E zB7lPGkfnkO!a{I3>J>(U^~a!_b*0NOA=TyZFG6oPiqa>8wFSlKo_50W+1M`{x~3+tW_mUbFLk$6k{+#SlaxOL0Ayi-kq87bo2ikHvlPj*`zCLYLcreU|fK zNX-pHA235IUN`Qm%<{3LE^4ZzXqka3k_|3pkrUBFW`N0!7N&B;gytjl??N2+T+^A3 zoitLDqJ=jyuh*efitZwA_PF#1&6O@bbZVIM^QUOFojvloA9xi1iMMpD4b45aT=b5G zQoLWAvT$BD%hCI{>;M%?cMRT!7n47-av_Y9x%d8E3Zh=kdA#&eXZh4gK2O76E%%;S z$fs)aEKGU+C4bsbKbUZ+?!_T<+*5;ChK4g52P~kJAr-M6n4ActhXFcj*V1w=98LXz zw<@6O?U|aCJCbD#Yy~1pjAL2g(u7#1g$j4+-*ya!Ey?U~x%qY@i2}KBhFd&x)?_uL zvIN|j=nZW2?yDg+D?ls@ZzB{^%h(qvEwfK0sD)&y__k1Yb%dD>`X+%{E>sjM@% zJPkv8zcGxcQUE6t@>i^~OlZMG^Q|zyd&ALi*ZxJ2_A<`Plz2v`N3XI*g*i7)u zGA{XQb%jwh0XojCS-mh}MR*g32n!&IdSWQ5e|$K+d+9x( zLw|xhf**uW%coHTrUnH=SQOp;$ta0ZLvmRZLxlN!O0>y3gxD_1>V9w!5H+D z(oZB)_{tHJ$x&cTA#Q<>SzHMnm1hGs4~Cj=Wk|bQ_N(rL`%sbY(Ja5fUN!9)bwhqv z2?sl4hQO$k?7-7Kx(C^%i~=A83)r*9iHA4vUd;(DkN*h?1CieYIjKFZ%}-!T{&^>| z%VZB(`48`s=_B!Uu+ovxTz+KBW2jMrkYbgwC1YfZ10Za;P#>%B| zm$3;)CJ5cx&CwzP6LoL+N<}`e7K`80l6*>$h)?Gn(-*FIzIT^?wWf%_UuvB|o>(?G zK1$rdqd^NC+v{V=bGsXV;zOtuXFruX!$8LSq^#=${4P?T>g7+?H85pAp4m0_A9Rl% z%QuvS3TGt-teTj}nLtbrLWfwE%$qgC#=Ze)@e}o3lop7Y(k_q)?h!;}S`Db7Yg