diff --git a/api/go.mod b/api/go.mod
index 94d58cde289cf..733cc580d378f 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -7,7 +7,7 @@ require (
github.com/golang/protobuf v1.5.2
github.com/google/go-cmp v0.5.7
github.com/gravitational/trace v1.1.17
- github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
+ github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28
github.com/sirupsen/logrus v1.8.1
github.com/stretchr/testify v1.7.1
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.31.0
@@ -15,6 +15,5 @@ require (
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
google.golang.org/grpc v1.45.0
- gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/yaml.v2 v2.4.0
)
diff --git a/api/go.sum b/api/go.sum
index 788681d46e4df..da574cadfa641 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -3,6 +3,8 @@ cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
+github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -12,6 +14,7 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -63,20 +66,34 @@ github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9q
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
+github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28 h1:659ZmS9riGgajUnT9ym74yQSug2KZyvVHi3EmIqASnQ=
+github.com/russellhaering/gosaml2 v0.6.1-0.20210916051624-757d23f1bc28/go.mod h1:PiLt5KX4EMjlMIq3WLRR/xb5yqhiwtQhGr8wmU0b08M=
+github.com/russellhaering/goxmldsig v1.1.1 h1:vI0r2osGF1A9PLvsGdPUAGwEIrKa4Pj5sesSBsebIxM=
+github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -191,13 +208,16 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/api/types/assertion_info.go b/api/types/assertion_info.go
new file mode 100644
index 0000000000000..d4ce560b3f713
--- /dev/null
+++ b/api/types/assertion_info.go
@@ -0,0 +1,56 @@
+/*
+Copyright 2022 Gravitational, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package types
+
+import (
+ "encoding/json"
+
+ "github.com/gravitational/trace"
+
+ saml2 "github.com/russellhaering/gosaml2"
+)
+
+// AssertionInfo is an alias for saml2.AssertionInfo with additional methods, required for serialization to/from protobuf.
+// With those we can reference it with an option like so: `(gogoproto.customtype) = "AssertionInfo"`
+type AssertionInfo saml2.AssertionInfo
+
+func (a *AssertionInfo) Size() int {
+ bytes, err := json.Marshal(a)
+ if err != nil {
+ return 0
+ }
+ return len(bytes)
+}
+
+func (a *AssertionInfo) Unmarshal(bytes []byte) error {
+ return trace.Wrap(json.Unmarshal(bytes, a))
+}
+
+func (a *AssertionInfo) MarshalTo(bytes []byte) (int, error) {
+ out, err := json.Marshal(a)
+ if err != nil {
+ return 0, trace.Wrap(err)
+ }
+
+ if len(out) > cap(bytes) {
+ return 0, trace.BadParameter("capacity too low: %v, need %v", cap(bytes), len(out))
+ }
+
+ copy(bytes, out)
+
+ return len(out), nil
+}
diff --git a/api/types/assertion_info_test.go b/api/types/assertion_info_test.go
new file mode 100644
index 0000000000000..19e8419ae5513
--- /dev/null
+++ b/api/types/assertion_info_test.go
@@ -0,0 +1,81 @@
+/*
+Copyright 2022 Gravitational, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package types
+
+import (
+ "encoding/xml"
+ "testing"
+ "time"
+
+ saml2 "github.com/russellhaering/gosaml2"
+ samltypes "github.com/russellhaering/gosaml2/types"
+ "github.com/stretchr/testify/require"
+)
+
+func TestAssertionInfo_RoundTrip(t *testing.T) {
+ tests := []struct {
+ name string
+ src AssertionInfo
+ }{
+ {name: "empty", src: AssertionInfo{}},
+ {name: "full", src: (AssertionInfo)(saml2.AssertionInfo{
+ NameID: "zz",
+ Values: map[string]samltypes.Attribute{
+ "foo": {
+ XMLName: xml.Name{
+ Space: "ddd",
+ Local: "aaa",
+ },
+ FriendlyName: "aaa",
+ Name: "aaa",
+ NameFormat: "",
+ Values: nil,
+ },
+ },
+ WarningInfo: &saml2.WarningInfo{
+ OneTimeUse: true,
+ ProxyRestriction: &saml2.ProxyRestriction{
+ Count: 1,
+ Audience: []string{"foo"},
+ },
+ NotInAudience: true,
+ InvalidTime: true,
+ },
+ SessionIndex: "aaa",
+ AuthnInstant: new(time.Time),
+ SessionNotOnOrAfter: new(time.Time),
+ Assertions: []samltypes.Assertion{
+ {XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"}},
+ },
+ ResponseSignatureValidated: true,
+ })},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ buf := make([]byte, tt.src.Size())
+ count, err := tt.src.MarshalTo(buf)
+ require.NoError(t, err)
+ require.Equal(t, tt.src.Size(), count)
+
+ dst := &AssertionInfo{}
+ err = dst.Unmarshal(buf)
+ require.NoError(t, err)
+ require.Equal(t, &tt.src, dst)
+ })
+ }
+}
diff --git a/api/types/traits.go b/api/types/traits.go
index e6700728ebd4f..388d054dd38a9 100644
--- a/api/types/traits.go
+++ b/api/types/traits.go
@@ -16,16 +16,5 @@ limitations under the License.
package types
-// TraitMapping is a mapping that maps a trait to one or
-// more teleport roles.
-type TraitMapping struct {
- // Trait is a teleport trait name
- Trait string `json:"trait"`
- // Value is trait value to match
- Value string `json:"value"`
- // Roles is a list of static teleport roles to map to
- Roles []string `json:"roles,omitempty"`
-}
-
// TraitMappingSet is a set of trait mappings
type TraitMappingSet []TraitMapping
diff --git a/api/types/types.pb.go b/api/types/types.pb.go
index 67528eb62b338..97793f10f5d4d 100644
--- a/api/types/types.pb.go
+++ b/api/types/types.pb.go
@@ -4928,6 +4928,52 @@ func (m *ClaimMapping) XXX_DiscardUnknown() {
var xxx_messageInfo_ClaimMapping proto.InternalMessageInfo
+// TraitMapping maps a trait to teleport roles.
+type TraitMapping struct {
+ // Trait is a trait name.
+ Trait string `protobuf:"bytes,1,opt,name=Trait,proto3" json:"trait"`
+ // Value is a trait value to match.
+ Value string `protobuf:"bytes,2,opt,name=Value,proto3" json:"value"`
+ // Roles is a list of static teleport roles to match.
+ Roles []string `protobuf:"bytes,3,rep,name=Roles,proto3" json:"roles,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *TraitMapping) Reset() { *m = TraitMapping{} }
+func (m *TraitMapping) String() string { return proto.CompactTextString(m) }
+func (*TraitMapping) ProtoMessage() {}
+func (*TraitMapping) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d938547f84707355, []int{89}
+}
+func (m *TraitMapping) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *TraitMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_TraitMapping.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 *TraitMapping) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_TraitMapping.Merge(m, src)
+}
+func (m *TraitMapping) XXX_Size() int {
+ return m.Size()
+}
+func (m *TraitMapping) XXX_DiscardUnknown() {
+ xxx_messageInfo_TraitMapping.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TraitMapping proto.InternalMessageInfo
+
// Rule represents allow or deny rule that is executed to check
// if user or service have access to resource
type Rule struct {
@@ -4948,7 +4994,7 @@ func (m *Rule) Reset() { *m = Rule{} }
func (m *Rule) String() string { return proto.CompactTextString(m) }
func (*Rule) ProtoMessage() {}
func (*Rule) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{89}
+ return fileDescriptor_d938547f84707355, []int{90}
}
func (m *Rule) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4996,7 +5042,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} }
func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) }
func (*ImpersonateConditions) ProtoMessage() {}
func (*ImpersonateConditions) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{90}
+ return fileDescriptor_d938547f84707355, []int{91}
}
func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5038,7 +5084,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} }
func (m *BoolValue) String() string { return proto.CompactTextString(m) }
func (*BoolValue) ProtoMessage() {}
func (*BoolValue) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{91}
+ return fileDescriptor_d938547f84707355, []int{92}
}
func (m *BoolValue) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5087,7 +5133,7 @@ type UserV2 struct {
func (m *UserV2) Reset() { *m = UserV2{} }
func (*UserV2) ProtoMessage() {}
func (*UserV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{92}
+ return fileDescriptor_d938547f84707355, []int{93}
}
func (m *UserV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5151,7 +5197,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} }
func (m *UserSpecV2) String() string { return proto.CompactTextString(m) }
func (*UserSpecV2) ProtoMessage() {}
func (*UserSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{93}
+ return fileDescriptor_d938547f84707355, []int{94}
}
func (m *UserSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5196,7 +5242,7 @@ type ExternalIdentity struct {
func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} }
func (*ExternalIdentity) ProtoMessage() {}
func (*ExternalIdentity) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{94}
+ return fileDescriptor_d938547f84707355, []int{95}
}
func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5248,7 +5294,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} }
func (m *LoginStatus) String() string { return proto.CompactTextString(m) }
func (*LoginStatus) ProtoMessage() {}
func (*LoginStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{95}
+ return fileDescriptor_d938547f84707355, []int{96}
}
func (m *LoginStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5293,7 +5339,7 @@ type CreatedBy struct {
func (m *CreatedBy) Reset() { *m = CreatedBy{} }
func (*CreatedBy) ProtoMessage() {}
func (*CreatedBy) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{96}
+ return fileDescriptor_d938547f84707355, []int{97}
}
func (m *CreatedBy) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5342,7 +5388,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} }
func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) }
func (*LocalAuthSecrets) ProtoMessage() {}
func (*LocalAuthSecrets) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{97}
+ return fileDescriptor_d938547f84707355, []int{98}
}
func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5397,7 +5443,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} }
func (m *MFADevice) String() string { return proto.CompactTextString(m) }
func (*MFADevice) ProtoMessage() {}
func (*MFADevice) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{98}
+ return fileDescriptor_d938547f84707355, []int{99}
}
func (m *MFADevice) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5495,7 +5541,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} }
func (m *TOTPDevice) String() string { return proto.CompactTextString(m) }
func (*TOTPDevice) ProtoMessage() {}
func (*TOTPDevice) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{99}
+ return fileDescriptor_d938547f84707355, []int{100}
}
func (m *TOTPDevice) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5541,7 +5587,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} }
func (m *U2FDevice) String() string { return proto.CompactTextString(m) }
func (*U2FDevice) ProtoMessage() {}
func (*U2FDevice) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{100}
+ return fileDescriptor_d938547f84707355, []int{101}
}
func (m *U2FDevice) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5608,7 +5654,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} }
func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) }
func (*WebauthnDevice) ProtoMessage() {}
func (*WebauthnDevice) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{101}
+ return fileDescriptor_d938547f84707355, []int{102}
}
func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5651,7 +5697,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} }
func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) }
func (*WebauthnLocalAuth) ProtoMessage() {}
func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{102}
+ return fileDescriptor_d938547f84707355, []int{103}
}
func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5697,7 +5743,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} }
func (m *ConnectorRef) String() string { return proto.CompactTextString(m) }
func (*ConnectorRef) ProtoMessage() {}
func (*ConnectorRef) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{103}
+ return fileDescriptor_d938547f84707355, []int{104}
}
func (m *ConnectorRef) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5739,7 +5785,7 @@ func (m *UserRef) Reset() { *m = UserRef{} }
func (m *UserRef) String() string { return proto.CompactTextString(m) }
func (*UserRef) ProtoMessage() {}
func (*UserRef) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{104}
+ return fileDescriptor_d938547f84707355, []int{105}
}
func (m *UserRef) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5789,7 +5835,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} }
func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) }
func (*ReverseTunnelV2) ProtoMessage() {}
func (*ReverseTunnelV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{105}
+ return fileDescriptor_d938547f84707355, []int{106}
}
func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5836,7 +5882,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} }
func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) }
func (*ReverseTunnelSpecV2) ProtoMessage() {}
func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{106}
+ return fileDescriptor_d938547f84707355, []int{107}
}
func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5885,7 +5931,7 @@ type TunnelConnectionV2 struct {
func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} }
func (*TunnelConnectionV2) ProtoMessage() {}
func (*TunnelConnectionV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{107}
+ return fileDescriptor_d938547f84707355, []int{108}
}
func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5933,7 +5979,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{}
func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) }
func (*TunnelConnectionSpecV2) ProtoMessage() {}
func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{108}
+ return fileDescriptor_d938547f84707355, []int{109}
}
func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -5981,7 +6027,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} }
func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) }
func (*SemaphoreFilter) ProtoMessage() {}
func (*SemaphoreFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{109}
+ return fileDescriptor_d938547f84707355, []int{110}
}
func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6032,7 +6078,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest
func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) }
func (*AcquireSemaphoreRequest) ProtoMessage() {}
func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{110}
+ return fileDescriptor_d938547f84707355, []int{111}
}
func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6080,7 +6126,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} }
func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) }
func (*SemaphoreLease) ProtoMessage() {}
func (*SemaphoreLease) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{111}
+ return fileDescriptor_d938547f84707355, []int{112}
}
func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6126,7 +6172,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} }
func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) }
func (*SemaphoreLeaseRef) ProtoMessage() {}
func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{112}
+ return fileDescriptor_d938547f84707355, []int{113}
}
func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6175,7 +6221,7 @@ type SemaphoreV3 struct {
func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} }
func (*SemaphoreV3) ProtoMessage() {}
func (*SemaphoreV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{113}
+ return fileDescriptor_d938547f84707355, []int{114}
}
func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6217,7 +6263,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} }
func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) }
func (*SemaphoreSpecV3) ProtoMessage() {}
func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{114}
+ return fileDescriptor_d938547f84707355, []int{115}
}
func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6266,7 +6312,7 @@ type WebSessionV2 struct {
func (m *WebSessionV2) Reset() { *m = WebSessionV2{} }
func (*WebSessionV2) ProtoMessage() {}
func (*WebSessionV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{115}
+ return fileDescriptor_d938547f84707355, []int{116}
}
func (m *WebSessionV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6327,7 +6373,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} }
func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) }
func (*WebSessionSpecV2) ProtoMessage() {}
func (*WebSessionSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{116}
+ return fileDescriptor_d938547f84707355, []int{117}
}
func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6369,7 +6415,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} }
func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) }
func (*WebSessionFilter) ProtoMessage() {}
func (*WebSessionFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{117}
+ return fileDescriptor_d938547f84707355, []int{118}
}
func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6418,7 +6464,7 @@ type RemoteClusterV3 struct {
func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} }
func (*RemoteClusterV3) ProtoMessage() {}
func (*RemoteClusterV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{118}
+ return fileDescriptor_d938547f84707355, []int{119}
}
func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6462,7 +6508,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} }
func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) }
func (*RemoteClusterStatusV3) ProtoMessage() {}
func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{119}
+ return fileDescriptor_d938547f84707355, []int{120}
}
func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6512,7 +6558,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} }
func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) }
func (*KubernetesCluster) ProtoMessage() {}
func (*KubernetesCluster) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{120}
+ return fileDescriptor_d938547f84707355, []int{121}
}
func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6561,7 +6607,7 @@ type KubernetesClusterV3 struct {
func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} }
func (*KubernetesClusterV3) ProtoMessage() {}
func (*KubernetesClusterV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{121}
+ return fileDescriptor_d938547f84707355, []int{122}
}
func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6603,7 +6649,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3
func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) }
func (*KubernetesClusterSpecV3) ProtoMessage() {}
func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{122}
+ return fileDescriptor_d938547f84707355, []int{123}
}
func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6655,7 +6701,7 @@ type WebTokenV3 struct {
func (m *WebTokenV3) Reset() { *m = WebTokenV3{} }
func (*WebTokenV3) ProtoMessage() {}
func (*WebTokenV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{123}
+ return fileDescriptor_d938547f84707355, []int{124}
}
func (m *WebTokenV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6699,7 +6745,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} }
func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) }
func (*WebTokenSpecV3) ProtoMessage() {}
func (*WebTokenSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{124}
+ return fileDescriptor_d938547f84707355, []int{125}
}
func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6743,7 +6789,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} }
func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) }
func (*GetWebSessionRequest) ProtoMessage() {}
func (*GetWebSessionRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{125}
+ return fileDescriptor_d938547f84707355, []int{126}
}
func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6787,7 +6833,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest
func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteWebSessionRequest) ProtoMessage() {}
func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{126}
+ return fileDescriptor_d938547f84707355, []int{127}
}
func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6831,7 +6877,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} }
func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) }
func (*GetWebTokenRequest) ProtoMessage() {}
func (*GetWebTokenRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{127}
+ return fileDescriptor_d938547f84707355, []int{128}
}
func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6875,7 +6921,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} }
func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteWebTokenRequest) ProtoMessage() {}
func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{128}
+ return fileDescriptor_d938547f84707355, []int{129}
}
func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6917,7 +6963,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} }
func (m *ResourceRequest) String() string { return proto.CompactTextString(m) }
func (*ResourceRequest) ProtoMessage() {}
func (*ResourceRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{129}
+ return fileDescriptor_d938547f84707355, []int{130}
}
func (m *ResourceRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6961,7 +7007,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR
func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) }
func (*ResourceWithSecretsRequest) ProtoMessage() {}
func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{130}
+ return fileDescriptor_d938547f84707355, []int{131}
}
func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7003,7 +7049,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret
func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) }
func (*ResourcesWithSecretsRequest) ProtoMessage() {}
func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{131}
+ return fileDescriptor_d938547f84707355, []int{132}
}
func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7047,7 +7093,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR
func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) }
func (*ResourceInNamespaceRequest) ProtoMessage() {}
func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{132}
+ return fileDescriptor_d938547f84707355, []int{133}
}
func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7089,7 +7135,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac
func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) }
func (*ResourcesInNamespaceRequest) ProtoMessage() {}
func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{133}
+ return fileDescriptor_d938547f84707355, []int{134}
}
func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7139,7 +7185,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} }
func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) }
func (*OIDCConnectorV3) ProtoMessage() {}
func (*OIDCConnectorV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{134}
+ return fileDescriptor_d938547f84707355, []int{135}
}
func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7181,7 +7227,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} }
func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) }
func (*OIDCConnectorV3List) ProtoMessage() {}
func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{135}
+ return fileDescriptor_d938547f84707355, []int{136}
}
func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7254,7 +7300,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} }
func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) }
func (*OIDCConnectorSpecV3) ProtoMessage() {}
func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{136}
+ return fileDescriptor_d938547f84707355, []int{137}
}
func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7304,7 +7350,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} }
func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) }
func (*SAMLConnectorV2) ProtoMessage() {}
func (*SAMLConnectorV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{137}
+ return fileDescriptor_d938547f84707355, []int{138}
}
func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7346,7 +7392,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} }
func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) }
func (*SAMLConnectorV2List) ProtoMessage() {}
func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{138}
+ return fileDescriptor_d938547f84707355, []int{139}
}
func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7415,7 +7461,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} }
func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) }
func (*SAMLConnectorSpecV2) ProtoMessage() {}
func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{139}
+ return fileDescriptor_d938547f84707355, []int{140}
}
func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7461,7 +7507,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} }
func (m *AttributeMapping) String() string { return proto.CompactTextString(m) }
func (*AttributeMapping) ProtoMessage() {}
func (*AttributeMapping) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{140}
+ return fileDescriptor_d938547f84707355, []int{141}
}
func (m *AttributeMapping) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7506,7 +7552,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} }
func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) }
func (*AsymmetricKeyPair) ProtoMessage() {}
func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{141}
+ return fileDescriptor_d938547f84707355, []int{142}
}
func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7556,7 +7602,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} }
func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) }
func (*GithubConnectorV3) ProtoMessage() {}
func (*GithubConnectorV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{142}
+ return fileDescriptor_d938547f84707355, []int{143}
}
func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7598,7 +7644,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} }
func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) }
func (*GithubConnectorV3List) ProtoMessage() {}
func (*GithubConnectorV3List) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{143}
+ return fileDescriptor_d938547f84707355, []int{144}
}
func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7648,7 +7694,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} }
func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) }
func (*GithubConnectorSpecV3) ProtoMessage() {}
func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{144}
+ return fileDescriptor_d938547f84707355, []int{145}
}
func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7677,6 +7723,168 @@ func (m *GithubConnectorSpecV3) XXX_DiscardUnknown() {
var xxx_messageInfo_GithubConnectorSpecV3 proto.InternalMessageInfo
+// SSOWarnings conveys a user-facing main message along with auxiliary warnings.
+type SSOWarnings struct {
+ // Message is main user-facing message to be shown.
+ Message string `protobuf:"bytes,1,opt,name=Message,proto3" json:"message,omitempty"`
+ // Warnings is a set of distinct warnings to be reported.
+ Warnings []string `protobuf:"bytes,2,rep,name=Warnings,proto3" json:"warnings,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SSOWarnings) Reset() { *m = SSOWarnings{} }
+func (m *SSOWarnings) String() string { return proto.CompactTextString(m) }
+func (*SSOWarnings) ProtoMessage() {}
+func (*SSOWarnings) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d938547f84707355, []int{146}
+}
+func (m *SSOWarnings) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *SSOWarnings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_SSOWarnings.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 *SSOWarnings) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SSOWarnings.Merge(m, src)
+}
+func (m *SSOWarnings) XXX_Size() int {
+ return m.Size()
+}
+func (m *SSOWarnings) XXX_DiscardUnknown() {
+ xxx_messageInfo_SSOWarnings.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SSOWarnings proto.InternalMessageInfo
+
+// CreateUserParams represents the user creation parameters as called during SSO login flow.
+type CreateUserParams struct {
+ // ConnectorName is the name of the connector used for SSO login flow.
+ ConnectorName string `protobuf:"bytes,1,opt,name=ConnectorName,proto3" json:"connector_name,omitempty"`
+ // Username is the name of the user to be created.
+ Username string `protobuf:"bytes,2,opt,name=Username,proto3" json:"username,omitempty"`
+ // Logins is a list of available unix logins.
+ Logins []string `protobuf:"bytes,3,rep,name=Logins,proto3" json:"logins,omitempty"`
+ // KubeGroups is a list of assigned kube groups.
+ KubeGroups []string `protobuf:"bytes,4,rep,name=KubeGroups,proto3" json:"kube_groups,omitempty"`
+ // KubeUsers is a list of available kube users.
+ KubeUsers []string `protobuf:"bytes,5,rep,name=KubeUsers,proto3" json:"kube_users,omitempty"`
+ // Roles is a list of assigned roles.
+ Roles []string `protobuf:"bytes,6,rep,name=Roles,proto3" json:"roles,omitempty"`
+ // Traits is the set of traits the user is assigned.
+ Traits github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=Traits,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"traits,omitempty"`
+ // SessionTTL determines the TTL.
+ SessionTTL Duration `protobuf:"varint,8,opt,name=SessionTTL,proto3,casttype=Duration" json:"session_ttl,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *CreateUserParams) Reset() { *m = CreateUserParams{} }
+func (m *CreateUserParams) String() string { return proto.CompactTextString(m) }
+func (*CreateUserParams) ProtoMessage() {}
+func (*CreateUserParams) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d938547f84707355, []int{147}
+}
+func (m *CreateUserParams) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *CreateUserParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_CreateUserParams.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 *CreateUserParams) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_CreateUserParams.Merge(m, src)
+}
+func (m *CreateUserParams) XXX_Size() int {
+ return m.Size()
+}
+func (m *CreateUserParams) XXX_DiscardUnknown() {
+ xxx_messageInfo_CreateUserParams.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateUserParams proto.InternalMessageInfo
+
+// SSODiagnosticInfo is a single SSO diagnostic info entry.
+type SSODiagnosticInfo struct {
+ // TestFlow indicates the SSO flow was a test one.
+ TestFlow bool `protobuf:"varint,1,opt,name=TestFlow,proto3" json:"test_flow"`
+ // Error stores user-friendly error message.
+ Error string `protobuf:"bytes,2,opt,name=Error,proto3" json:"error"`
+ // Success if present, marks the flow as finished with success.
+ Success bool `protobuf:"varint,3,opt,name=Success,proto3" json:"success"`
+ // CreateUserParams represents the user creation parameters as called during SSO login flow.
+ CreateUserParams *CreateUserParams `protobuf:"bytes,4,opt,name=CreateUserParams,proto3" json:"create_user_params,omitempty"`
+ // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login
+ // flow.
+ SAMLAttributesToRoles []AttributeMapping `protobuf:"bytes,5,rep,name=SAMLAttributesToRoles,proto3" json:"attributes_to_roles,omitempty"`
+ // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the
+ // SAML attributes to roles.
+ SAMLAttributesToRolesWarnings *SSOWarnings `protobuf:"bytes,6,opt,name=SAMLAttributesToRolesWarnings,proto3" json:"saml_attributes_to_roles_warnings,omitempty"`
+ // SAMLAttributeStatements represents SAML attribute statements.
+ SAMLAttributeStatements github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,7,opt,name=SAMLAttributeStatements,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_attribute_statements,omitempty"`
+ // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow.
+ SAMLAssertionInfo *AssertionInfo `protobuf:"bytes,8,opt,name=SAMLAssertionInfo,proto3,customtype=AssertionInfo" json:"saml_assertion_info,omitempty"`
+ // SAMLTraitsFromAssertions represents traits translated from SAML assertions.
+ SAMLTraitsFromAssertions github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,9,opt,name=SAMLTraitsFromAssertions,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"saml_traits_from_assertions,omitempty"`
+ // SAMLConnectorTraitMapping represents connector-specific trait mapping.
+ SAMLConnectorTraitMapping []TraitMapping `protobuf:"bytes,10,rep,name=SAMLConnectorTraitMapping,proto3" json:"saml_connector_trait_mapping,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} }
+func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) }
+func (*SSODiagnosticInfo) ProtoMessage() {}
+func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) {
+ return fileDescriptor_d938547f84707355, []int{148}
+}
+func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *SSODiagnosticInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_SSODiagnosticInfo.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 *SSODiagnosticInfo) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SSODiagnosticInfo.Merge(m, src)
+}
+func (m *SSODiagnosticInfo) XXX_Size() int {
+ return m.Size()
+}
+func (m *SSODiagnosticInfo) XXX_DiscardUnknown() {
+ xxx_messageInfo_SSODiagnosticInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SSODiagnosticInfo proto.InternalMessageInfo
+
// TeamMapping represents a single team membership mapping.
type TeamMapping struct {
// Organization is a Github organization a user belongs to.
@@ -7698,7 +7906,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} }
func (m *TeamMapping) String() string { return proto.CompactTextString(m) }
func (*TeamMapping) ProtoMessage() {}
func (*TeamMapping) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{145}
+ return fileDescriptor_d938547f84707355, []int{149}
}
func (m *TeamMapping) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7747,7 +7955,7 @@ type TrustedClusterV2 struct {
func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} }
func (*TrustedClusterV2) ProtoMessage() {}
func (*TrustedClusterV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{146}
+ return fileDescriptor_d938547f84707355, []int{150}
}
func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7789,7 +7997,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} }
func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) }
func (*TrustedClusterV2List) ProtoMessage() {}
func (*TrustedClusterV2List) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{147}
+ return fileDescriptor_d938547f84707355, []int{151}
}
func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7845,7 +8053,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} }
func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) }
func (*TrustedClusterSpecV2) ProtoMessage() {}
func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{148}
+ return fileDescriptor_d938547f84707355, []int{152}
}
func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7898,7 +8106,7 @@ func (m *LockV2) Reset() { *m = LockV2{} }
func (m *LockV2) String() string { return proto.CompactTextString(m) }
func (*LockV2) ProtoMessage() {}
func (*LockV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{149}
+ return fileDescriptor_d938547f84707355, []int{153}
}
func (m *LockV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7944,7 +8152,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} }
func (m *LockSpecV2) String() string { return proto.CompactTextString(m) }
func (*LockSpecV2) ProtoMessage() {}
func (*LockSpecV2) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{150}
+ return fileDescriptor_d938547f84707355, []int{154}
}
func (m *LockSpecV2) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -7999,7 +8207,7 @@ type LockTarget struct {
func (m *LockTarget) Reset() { *m = LockTarget{} }
func (*LockTarget) ProtoMessage() {}
func (*LockTarget) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{151}
+ return fileDescriptor_d938547f84707355, []int{155}
}
func (m *LockTarget) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8043,7 +8251,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} }
func (m *AddressCondition) String() string { return proto.CompactTextString(m) }
func (*AddressCondition) ProtoMessage() {}
func (*AddressCondition) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{152}
+ return fileDescriptor_d938547f84707355, []int{156}
}
func (m *AddressCondition) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8086,7 +8294,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp
func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) }
func (*NetworkRestrictionsSpecV4) ProtoMessage() {}
func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{153}
+ return fileDescriptor_d938547f84707355, []int{157}
}
func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8139,7 +8347,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} }
func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) }
func (*NetworkRestrictionsV4) ProtoMessage() {}
func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{154}
+ return fileDescriptor_d938547f84707355, []int{158}
}
func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8183,7 +8391,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3
func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) }
func (*WindowsDesktopServiceV3) ProtoMessage() {}
func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{155}
+ return fileDescriptor_d938547f84707355, []int{159}
}
func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8229,7 +8437,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi
func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) }
func (*WindowsDesktopServiceSpecV3) ProtoMessage() {}
func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{156}
+ return fileDescriptor_d938547f84707355, []int{160}
}
func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8273,7 +8481,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} }
func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) }
func (*WindowsDesktopFilter) ProtoMessage() {}
func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{157}
+ return fileDescriptor_d938547f84707355, []int{161}
}
func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8317,7 +8525,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} }
func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) }
func (*WindowsDesktopV3) ProtoMessage() {}
func (*WindowsDesktopV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{158}
+ return fileDescriptor_d938547f84707355, []int{162}
}
func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8363,7 +8571,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} }
func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) }
func (*WindowsDesktopSpecV3) ProtoMessage() {}
func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{159}
+ return fileDescriptor_d938547f84707355, []int{163}
}
func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8429,7 +8637,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq
func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) }
func (*RegisterUsingTokenRequest) ProtoMessage() {}
func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{160}
+ return fileDescriptor_d938547f84707355, []int{164}
}
func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8483,7 +8691,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} }
func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) }
func (*RecoveryCodesV1) ProtoMessage() {}
func (*RecoveryCodesV1) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{161}
+ return fileDescriptor_d938547f84707355, []int{165}
}
func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8528,7 +8736,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} }
func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) }
func (*RecoveryCodesSpecV1) ProtoMessage() {}
func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{162}
+ return fileDescriptor_d938547f84707355, []int{166}
}
func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8572,7 +8780,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} }
func (m *RecoveryCode) String() string { return proto.CompactTextString(m) }
func (*RecoveryCode) ProtoMessage() {}
func (*RecoveryCode) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{163}
+ return fileDescriptor_d938547f84707355, []int{167}
}
func (m *RecoveryCode) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8616,7 +8824,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} }
func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) }
func (*SessionTrackerV1) ProtoMessage() {}
func (*SessionTrackerV1) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{164}
+ return fileDescriptor_d938547f84707355, []int{168}
}
func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8698,7 +8906,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} }
func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) }
func (*SessionTrackerSpecV1) ProtoMessage() {}
func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{165}
+ return fileDescriptor_d938547f84707355, []int{169}
}
func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8745,7 +8953,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet
func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) }
func (*SessionTrackerPolicySet) ProtoMessage() {}
func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{166}
+ return fileDescriptor_d938547f84707355, []int{170}
}
func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8793,7 +9001,7 @@ func (m *Participant) Reset() { *m = Participant{} }
func (m *Participant) String() string { return proto.CompactTextString(m) }
func (*Participant) ProtoMessage() {}
func (*Participant) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{167}
+ return fileDescriptor_d938547f84707355, []int{171}
}
func (m *Participant) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8837,7 +9045,7 @@ func (m *SortBy) Reset() { *m = SortBy{} }
func (m *SortBy) String() string { return proto.CompactTextString(m) }
func (*SortBy) ProtoMessage() {}
func (*SortBy) Descriptor() ([]byte, []int) {
- return fileDescriptor_d938547f84707355, []int{168}
+ return fileDescriptor_d938547f84707355, []int{172}
}
func (m *SortBy) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8979,6 +9187,7 @@ func init() {
proto.RegisterType((*AccessRequestConditions)(nil), "types.AccessRequestConditions")
proto.RegisterType((*AccessReviewConditions)(nil), "types.AccessReviewConditions")
proto.RegisterType((*ClaimMapping)(nil), "types.ClaimMapping")
+ proto.RegisterType((*TraitMapping)(nil), "types.TraitMapping")
proto.RegisterType((*Rule)(nil), "types.Rule")
proto.RegisterType((*ImpersonateConditions)(nil), "types.ImpersonateConditions")
proto.RegisterType((*BoolValue)(nil), "types.BoolValue")
@@ -9038,6 +9247,9 @@ func init() {
proto.RegisterType((*GithubConnectorV3)(nil), "types.GithubConnectorV3")
proto.RegisterType((*GithubConnectorV3List)(nil), "types.GithubConnectorV3List")
proto.RegisterType((*GithubConnectorSpecV3)(nil), "types.GithubConnectorSpecV3")
+ proto.RegisterType((*SSOWarnings)(nil), "types.SSOWarnings")
+ proto.RegisterType((*CreateUserParams)(nil), "types.CreateUserParams")
+ proto.RegisterType((*SSODiagnosticInfo)(nil), "types.SSODiagnosticInfo")
proto.RegisterType((*TeamMapping)(nil), "types.TeamMapping")
proto.RegisterType((*TrustedClusterV2)(nil), "types.TrustedClusterV2")
proto.RegisterType((*TrustedClusterV2List)(nil), "types.TrustedClusterV2List")
@@ -9067,743 +9279,772 @@ func init() {
func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) }
var fileDescriptor_d938547f84707355 = []byte{
- // 11761 bytes of a gzipped FileDescriptorProto
+ // 12230 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x6f, 0x6c, 0x1c, 0x49,
- 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xa2, 0x24, 0x4a, 0xab, 0xdd,
- 0xd1, 0xf5, 0xee, 0x6a, 0x25, 0xdd, 0xae, 0x78, 0xa2, 0x6e, 0x75, 0xde, 0xdb, 0x7f, 0x37, 0x43,
- 0x52, 0x12, 0x57, 0x14, 0xc9, 0xed, 0xe1, 0x9f, 0x3b, 0xdf, 0xad, 0xdb, 0xcd, 0xe9, 0x12, 0xd9,
- 0xcb, 0x99, 0xe9, 0xb9, 0xee, 0x1e, 0x49, 0xb4, 0x7f, 0x86, 0xfd, 0x43, 0xe0, 0x18, 0x86, 0xe1,
- 0x3b, 0x9f, 0x71, 0x8e, 0xed, 0xc0, 0x81, 0x1d, 0x23, 0x46, 0xe2, 0x04, 0x67, 0x04, 0x4e, 0x80,
- 0x24, 0x40, 0x10, 0xc0, 0x40, 0x60, 0xdc, 0x87, 0x18, 0xf1, 0xb7, 0xc0, 0x4e, 0xc0, 0xc4, 0x77,
- 0xf9, 0x12, 0x02, 0x01, 0x02, 0x18, 0x08, 0xe0, 0x4b, 0x0c, 0x04, 0xf5, 0xaa, 0xaa, 0xbb, 0xaa,
- 0xa7, 0x87, 0x1c, 0xad, 0xb4, 0xc0, 0x69, 0x3f, 0x91, 0xf3, 0xea, 0xbd, 0xd7, 0xf5, 0xe7, 0xd5,
- 0xab, 0x57, 0x55, 0xef, 0xbd, 0x82, 0xf1, 0xe8, 0xa0, 0x4b, 0xc3, 0xeb, 0xdd, 0xc0, 0x8f, 0x7c,
- 0x32, 0x82, 0x3f, 0x2e, 0xcc, 0xec, 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd8, 0x7f, 0xbc, 0xf0, 0x42,
- 0x75, 0xd7, 0xf7, 0x77, 0x5b, 0x74, 0x0e, 0x7f, 0xed, 0xf4, 0x1e, 0xcc, 0x45, 0x5e, 0x9b, 0x86,
- 0x91, 0xd3, 0xee, 0x0a, 0x84, 0x85, 0x5d, 0x2f, 0xda, 0xeb, 0xed, 0x5c, 0x6f, 0xfa, 0xed, 0xb9,
- 0xdd, 0xc0, 0x79, 0xe8, 0x45, 0x4e, 0xe4, 0xf9, 0x1d, 0xa7, 0x35, 0x17, 0xd1, 0x16, 0xed, 0xfa,
- 0x41, 0x34, 0xe7, 0x74, 0xbd, 0x39, 0xfc, 0xc6, 0xdc, 0xa3, 0xc0, 0xe9, 0x76, 0x69, 0x90, 0xfc,
- 0xc3, 0x99, 0x98, 0xff, 0x30, 0x0f, 0xa5, 0x7b, 0x94, 0x76, 0x6b, 0x2d, 0xef, 0x21, 0x25, 0x2f,
- 0x43, 0x61, 0xd5, 0x69, 0xd3, 0x59, 0xe3, 0x92, 0x71, 0xa5, 0x54, 0x9f, 0x3a, 0x3a, 0xac, 0x8e,
- 0x87, 0x34, 0x78, 0x48, 0x03, 0xbb, 0xe3, 0xb4, 0xa9, 0x85, 0x85, 0xe4, 0xf3, 0x50, 0x62, 0x7f,
- 0xc3, 0xae, 0xd3, 0xa4, 0xb3, 0x39, 0xc4, 0x9c, 0x38, 0x3a, 0xac, 0x96, 0x3a, 0x12, 0x68, 0x25,
- 0xe5, 0xe4, 0x32, 0x8c, 0xad, 0x50, 0x27, 0xa4, 0xcb, 0x8b, 0xb3, 0xf9, 0x4b, 0xc6, 0x95, 0x7c,
- 0xbd, 0x7c, 0x74, 0x58, 0x2d, 0xb6, 0x18, 0xc8, 0xf6, 0x5c, 0x4b, 0x16, 0x92, 0x65, 0x18, 0x5b,
- 0x7a, 0xdc, 0xf5, 0x02, 0x1a, 0xce, 0x16, 0x2e, 0x19, 0x57, 0xc6, 0xe7, 0x2f, 0x5c, 0xe7, 0xed,
- 0xbf, 0x2e, 0xdb, 0x7f, 0x7d, 0x43, 0xb6, 0xbf, 0x7e, 0xfa, 0xfb, 0x87, 0xd5, 0x53, 0x47, 0x87,
- 0xd5, 0x31, 0xca, 0x49, 0x7e, 0xed, 0xbf, 0x56, 0x0d, 0x4b, 0xd2, 0x93, 0x77, 0xa0, 0xb0, 0x71,
- 0xd0, 0xa5, 0xb3, 0xa5, 0x4b, 0xc6, 0x95, 0xc9, 0xf9, 0x97, 0xae, 0xf3, 0x1e, 0x8f, 0x1b, 0x99,
- 0xfc, 0xc7, 0xb0, 0xea, 0xc5, 0xa3, 0xc3, 0x6a, 0x81, 0xa1, 0x58, 0x48, 0x45, 0xde, 0x80, 0xd1,
- 0xbb, 0x7e, 0x18, 0x2d, 0x2f, 0xce, 0x02, 0x36, 0xed, 0xcc, 0xd1, 0x61, 0x75, 0x7a, 0xcf, 0x0f,
- 0x23, 0xdb, 0x73, 0x5f, 0xf7, 0xdb, 0x5e, 0x44, 0xdb, 0xdd, 0xe8, 0xc0, 0x12, 0x48, 0xe6, 0x0e,
- 0x4c, 0x68, 0xfc, 0xc8, 0x38, 0x8c, 0x6d, 0xae, 0xde, 0x5b, 0x5d, 0xdb, 0x5e, 0xad, 0x9c, 0x22,
- 0x45, 0x28, 0xac, 0xae, 0x2d, 0x2e, 0x55, 0x0c, 0x32, 0x06, 0xf9, 0xda, 0xfa, 0x7a, 0x25, 0x47,
- 0xca, 0x50, 0x5c, 0xac, 0x6d, 0xd4, 0xea, 0xb5, 0xc6, 0x52, 0x25, 0x4f, 0x4e, 0xc3, 0xd4, 0xf6,
- 0xf2, 0xea, 0xe2, 0xda, 0x76, 0xc3, 0x5e, 0x5c, 0x6a, 0xdc, 0xdb, 0x58, 0x5b, 0xaf, 0x14, 0xc8,
- 0x24, 0xc0, 0xbd, 0xcd, 0xfa, 0x92, 0xb5, 0xba, 0xb4, 0xb1, 0xd4, 0xa8, 0x8c, 0x98, 0xbf, 0x94,
- 0x87, 0xe2, 0x7d, 0x1a, 0x39, 0xae, 0x13, 0x39, 0xe4, 0xa2, 0x36, 0x44, 0x58, 0x7b, 0x65, 0x6c,
- 0x5e, 0xee, 0x1f, 0x9b, 0x91, 0xa3, 0xc3, 0xaa, 0xf1, 0x86, 0x3a, 0x26, 0x6f, 0xc3, 0xf8, 0x22,
- 0x0d, 0x9b, 0x81, 0xd7, 0x65, 0xf2, 0x82, 0xe3, 0x52, 0xaa, 0x9f, 0x3f, 0x3a, 0xac, 0x9e, 0x71,
- 0x13, 0xb0, 0xd2, 0x56, 0x15, 0x9b, 0x2c, 0xc3, 0xe8, 0x8a, 0xb3, 0x43, 0x5b, 0xe1, 0xec, 0xc8,
- 0xa5, 0xfc, 0x95, 0xf1, 0xf9, 0x17, 0x44, 0xff, 0xca, 0x0a, 0x5e, 0xe7, 0xa5, 0x4b, 0x9d, 0x28,
- 0x38, 0xa8, 0xcf, 0x1c, 0x1d, 0x56, 0x2b, 0x2d, 0x04, 0xa8, 0x7d, 0xc7, 0x51, 0x48, 0x23, 0x19,
- 0xf3, 0xd1, 0x13, 0xc7, 0xfc, 0xc5, 0xef, 0x1f, 0x56, 0x0d, 0x36, 0x16, 0x62, 0xcc, 0x13, 0x7e,
- 0xfa, 0xe8, 0x5f, 0x82, 0xdc, 0xf2, 0xe2, 0xec, 0x18, 0xca, 0x5a, 0xe5, 0xe8, 0xb0, 0x5a, 0xd6,
- 0x86, 0x2d, 0xb7, 0xbc, 0x78, 0xe1, 0x2d, 0x18, 0x57, 0xea, 0x48, 0x2a, 0x90, 0xdf, 0xa7, 0x07,
- 0xbc, 0x3f, 0x2d, 0xf6, 0x2f, 0x99, 0x81, 0x91, 0x87, 0x4e, 0xab, 0x27, 0x3a, 0xd0, 0xe2, 0x3f,
- 0xbe, 0x9c, 0xfb, 0x09, 0xc3, 0xfc, 0xf5, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0x72, 0x15, 0x46,
- 0x1a, 0x91, 0x13, 0xc9, 0xa1, 0x38, 0x7d, 0x74, 0x58, 0x9d, 0x0a, 0x19, 0x40, 0xf9, 0x1e, 0xc7,
- 0x60, 0xa8, 0xeb, 0x7b, 0x4e, 0x28, 0x87, 0x04, 0x51, 0xbb, 0x0c, 0xa0, 0xa2, 0x22, 0x06, 0xb9,
- 0x0c, 0x85, 0xfb, 0xbe, 0x4b, 0xc5, 0xa8, 0x90, 0xa3, 0xc3, 0xea, 0x64, 0xdb, 0x77, 0x55, 0x44,
- 0x2c, 0x27, 0xaf, 0x43, 0x69, 0xa1, 0x17, 0x04, 0xb4, 0xc3, 0x44, 0xb5, 0x80, 0xc8, 0x93, 0x47,
- 0x87, 0x55, 0x68, 0x72, 0x20, 0x9b, 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x46, 0xe4, 0x04, 0x11, 0x75,
- 0x67, 0x47, 0x86, 0xea, 0x6a, 0x36, 0xbd, 0xa6, 0x43, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, 0xdc,
- 0x85, 0xf1, 0x3b, 0x81, 0xd3, 0xa4, 0xeb, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0xbf, 0x7c,
- 0x74, 0x58, 0x3d, 0xbb, 0xcb, 0xc0, 0x76, 0x17, 0xe1, 0x09, 0xf5, 0x8f, 0x0e, 0xab, 0xc5, 0xc5,
- 0x5e, 0x80, 0xbd, 0x67, 0xa9, 0xa4, 0xe4, 0xa7, 0xd9, 0x90, 0x84, 0x11, 0x76, 0x2d, 0x75, 0x71,
- 0xf4, 0x8e, 0xaf, 0xa2, 0x29, 0xaa, 0x78, 0xb6, 0xe5, 0x84, 0x91, 0x1d, 0x70, 0xba, 0x54, 0x3d,
- 0x55, 0x96, 0x64, 0x0d, 0x8a, 0x8d, 0xe6, 0x1e, 0x75, 0x7b, 0x2d, 0x3a, 0x5b, 0x44, 0xf6, 0xe7,
- 0x84, 0xe0, 0xca, 0xf1, 0x94, 0xc5, 0xf5, 0x0b, 0x82, 0x37, 0x09, 0x05, 0x44, 0xe9, 0xfb, 0x98,
- 0xc9, 0x97, 0x8b, 0xbf, 0xf5, 0x7b, 0xd5, 0x53, 0xbf, 0xf0, 0x5f, 0x2e, 0x9d, 0x32, 0xff, 0x55,
- 0x0e, 0x2a, 0x69, 0x26, 0xe4, 0x01, 0x4c, 0x6c, 0x76, 0x5d, 0x27, 0xa2, 0x0b, 0x2d, 0x8f, 0x76,
- 0xa2, 0x10, 0x85, 0xe4, 0xf8, 0x36, 0xbd, 0x22, 0xbe, 0x3b, 0xdb, 0x43, 0x42, 0xbb, 0xc9, 0x29,
- 0x53, 0xad, 0xd2, 0xd9, 0x26, 0xdf, 0x69, 0xa0, 0x9e, 0x0e, 0x51, 0xc2, 0x9e, 0xec, 0x3b, 0x5c,
- 0xc3, 0x0f, 0xf8, 0x8e, 0x60, 0x2b, 0x04, 0xa8, 0xe3, 0xee, 0x1c, 0xa0, 0x64, 0x0e, 0x2f, 0x40,
- 0x8c, 0x24, 0x43, 0x80, 0x18, 0xd8, 0xfc, 0xef, 0x06, 0x4c, 0x5a, 0x34, 0xf4, 0x7b, 0x41, 0x93,
- 0xde, 0xa5, 0x8e, 0x4b, 0x03, 0x26, 0xfe, 0xf7, 0xbc, 0x8e, 0x2b, 0xe6, 0x14, 0x8a, 0xff, 0xbe,
- 0xd7, 0x51, 0xa7, 0x30, 0x96, 0x93, 0x2f, 0xc0, 0x58, 0xa3, 0xb7, 0x83, 0xa8, 0x7c, 0x4e, 0x9d,
- 0xc5, 0x11, 0xeb, 0xed, 0xd8, 0x29, 0x74, 0x89, 0x46, 0xe6, 0x60, 0x6c, 0x8b, 0x06, 0x61, 0xa2,
- 0xf1, 0x50, 0xb3, 0x3f, 0xe4, 0x20, 0x95, 0x40, 0x60, 0x91, 0x3b, 0x89, 0xd6, 0x15, 0x6b, 0xd2,
- 0x54, 0x4a, 0xd7, 0x25, 0xa2, 0xd2, 0x16, 0x10, 0x55, 0x54, 0x24, 0x96, 0xf9, 0x9d, 0x1c, 0x54,
- 0x16, 0x9d, 0xc8, 0xd9, 0x71, 0x42, 0xd1, 0x9f, 0x5b, 0x37, 0x99, 0x1e, 0x57, 0x1a, 0x8a, 0x7a,
- 0x9c, 0xd5, 0xfc, 0x13, 0x37, 0xef, 0xd5, 0x74, 0xf3, 0xc6, 0xd9, 0x02, 0x29, 0x9a, 0x97, 0x34,
- 0xea, 0xdd, 0x93, 0x1b, 0x55, 0x11, 0x8d, 0x2a, 0xca, 0x46, 0x25, 0x4d, 0x21, 0xef, 0x42, 0xa1,
- 0xd1, 0xa5, 0x4d, 0xa1, 0x44, 0xa4, 0xee, 0xd7, 0x1b, 0xc7, 0x10, 0xb6, 0x6e, 0xd6, 0xcb, 0x82,
- 0x4d, 0x21, 0xec, 0xd2, 0xa6, 0x85, 0x64, 0xca, 0xa4, 0xf9, 0xee, 0x28, 0xcc, 0x64, 0x91, 0x91,
- 0x77, 0xf5, 0xc5, 0x89, 0x77, 0xcf, 0x0b, 0x03, 0x17, 0xa7, 0x59, 0x43, 0x5f, 0x9e, 0xae, 0x41,
- 0x71, 0x9d, 0x09, 0x64, 0xd3, 0x6f, 0x89, 0x9e, 0x63, 0x5a, 0xb1, 0xd8, 0x95, 0x30, 0xc3, 0x8a,
- 0xcb, 0xc9, 0x0b, 0x90, 0xdf, 0xb4, 0x96, 0x45, 0x77, 0x95, 0x8e, 0x0e, 0xab, 0xf9, 0x5e, 0xe0,
- 0xcd, 0x1a, 0x16, 0x83, 0x92, 0x39, 0x18, 0x5d, 0xa8, 0x2d, 0xd0, 0x20, 0xc2, 0x6e, 0x2a, 0xd7,
- 0xcf, 0x31, 0x69, 0x69, 0x3a, 0x76, 0x93, 0x06, 0x91, 0xf6, 0x79, 0x81, 0x46, 0x3e, 0x0f, 0xf9,
- 0xda, 0x76, 0x43, 0xf4, 0x0c, 0x88, 0x9e, 0xa9, 0x6d, 0x37, 0xea, 0x13, 0xa2, 0x23, 0xf2, 0xce,
- 0xa3, 0x90, 0x71, 0xaf, 0x6d, 0x37, 0xd4, 0xd1, 0x1a, 0x3d, 0x66, 0xb4, 0xae, 0x40, 0x91, 0xd9,
- 0x19, 0x6c, 0x81, 0x47, 0xa5, 0x58, 0xe2, 0xe6, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x39,
- 0x36, 0x5b, 0x8a, 0x09, 0x3f, 0x61, 0xb6, 0x48, 0x63, 0x85, 0x3c, 0x86, 0x89, 0xc5, 0x83, 0x8e,
- 0xd3, 0xf6, 0x9a, 0x62, 0x09, 0x2f, 0xe1, 0x12, 0x7e, 0xfd, 0x98, 0x61, 0xbc, 0xae, 0x11, 0xf0,
- 0x55, 0x5d, 0x2a, 0xdf, 0x59, 0x97, 0x97, 0xd9, 0xe9, 0x15, 0x7e, 0xd6, 0xb0, 0xf4, 0x0f, 0xb1,
- 0xb9, 0x24, 0x55, 0x24, 0xda, 0x55, 0x89, 0xd8, 0x49, 0x70, 0x32, 0x97, 0x02, 0x01, 0x51, 0xe7,
- 0x52, 0xbc, 0xe8, 0xbe, 0x0b, 0xf9, 0x3b, 0x0b, 0xeb, 0xb3, 0xe3, 0xc8, 0x83, 0x08, 0x1e, 0x77,
- 0x16, 0xd6, 0x17, 0x5a, 0x7e, 0xcf, 0x6d, 0x7c, 0xb8, 0x52, 0x3f, 0x27, 0xd8, 0x4c, 0xec, 0x36,
- 0xbb, 0x5a, 0x8d, 0x18, 0x1d, 0x59, 0x82, 0xa2, 0x6c, 0xe5, 0x6c, 0x19, 0x79, 0x4c, 0xa7, 0x1a,
- 0xbf, 0x75, 0x93, 0xcf, 0x35, 0x57, 0xfc, 0x56, 0x6b, 0x21, 0x71, 0x2e, 0x6c, 0x03, 0xe9, 0xef,
- 0x97, 0x0c, 0x4b, 0xe2, 0xf3, 0xaa, 0x25, 0x31, 0x3e, 0x7f, 0x46, 0x7c, 0x6b, 0xc1, 0x6f, 0xb7,
- 0x9d, 0x8e, 0x8b, 0xb4, 0x5b, 0xf3, 0xaa, 0x81, 0x51, 0x83, 0xc9, 0xa4, 0x22, 0x2b, 0x5e, 0x18,
- 0x91, 0x39, 0x28, 0x49, 0x08, 0x5b, 0x44, 0xf2, 0x99, 0x55, 0xb6, 0x12, 0x1c, 0xf3, 0x4f, 0x73,
- 0x00, 0x49, 0xc9, 0x73, 0xaa, 0x67, 0xbe, 0xa4, 0xe9, 0x99, 0x33, 0x69, 0x01, 0x1d, 0xa8, 0x61,
- 0xc8, 0xfb, 0x30, 0xca, 0x4c, 0xae, 0x9e, 0x34, 0x29, 0xcf, 0xa5, 0x49, 0xb1, 0x70, 0xeb, 0x66,
- 0x7d, 0x52, 0x10, 0x8f, 0x86, 0x08, 0xb1, 0x04, 0x99, 0xa2, 0xa2, 0xfe, 0x78, 0x24, 0x19, 0x0c,
- 0xa1, 0x9c, 0xae, 0x28, 0xda, 0xc5, 0x48, 0xe6, 0xa3, 0xd4, 0x2e, 0x8a, 0x6e, 0x39, 0xcf, 0x75,
- 0x0b, 0xef, 0xd4, 0x31, 0xa1, 0x5b, 0xd2, 0x9a, 0x85, 0x77, 0xe0, 0x89, 0x9a, 0xa5, 0x9b, 0x9e,
- 0xb6, 0x05, 0x14, 0x83, 0x2b, 0x99, 0xbd, 0x92, 0x35, 0x61, 0x2f, 0x9d, 0x34, 0x61, 0xd3, 0xd3,
- 0xf5, 0xe6, 0x20, 0x5d, 0x76, 0x46, 0xce, 0x2e, 0xe7, 0x91, 0x4a, 0x8e, 0x3a, 0xed, 0x6d, 0x3e,
- 0x35, 0x47, 0x07, 0x4e, 0xcd, 0x33, 0x99, 0x53, 0x93, 0x4f, 0xcc, 0xb7, 0x61, 0xa4, 0xf6, 0x33,
- 0xbd, 0x80, 0x0a, 0xdb, 0xaf, 0x2c, 0xbf, 0xc9, 0x60, 0xf1, 0x9c, 0x9e, 0x72, 0xd8, 0x4f, 0xd5,
- 0x66, 0xc6, 0x72, 0xf6, 0xe5, 0x8d, 0x95, 0x86, 0xb0, 0xeb, 0x48, 0xaa, 0x5b, 0x36, 0x56, 0x94,
- 0x6a, 0x47, 0x5a, 0xab, 0x19, 0x15, 0x99, 0x83, 0x5c, 0x6d, 0x11, 0x37, 0x8b, 0xe3, 0xf3, 0x25,
- 0xf9, 0xd9, 0xc5, 0xfa, 0x8c, 0x20, 0x29, 0x3b, 0xda, 0xfe, 0xa1, 0xb6, 0x48, 0xea, 0x30, 0x72,
- 0xff, 0xa0, 0xf1, 0xe1, 0x8a, 0x50, 0x64, 0xa7, 0xa5, 0x5c, 0x33, 0xd8, 0x1a, 0xae, 0x42, 0x61,
- 0x52, 0xe3, 0xf6, 0x41, 0xf8, 0xcd, 0x96, 0x5a, 0x63, 0x44, 0xfb, 0xf4, 0x14, 0xc8, 0x3f, 0x37,
- 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x4f, 0xe2, 0x62,
- 0x79, 0xbb, 0xca, 0x47, 0x3f, 0xd7, 0x37, 0xfa, 0xe3, 0xca, 0x4a, 0xc6, 0xc7, 0x3c, 0xee, 0x8b,
- 0xfc, 0x27, 0xee, 0x0b, 0xf3, 0x7f, 0x18, 0xf8, 0x3d, 0xf2, 0x3a, 0x8c, 0x5a, 0x74, 0x37, 0x59,
- 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0xad, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, 0x9e, 0xf7,
- 0x20, 0x12, 0x35, 0x8d, 0x57, 0x14, 0x01, 0x56, 0x56, 0x14, 0x01, 0xd1, 0x56, 0x14, 0x01, 0x63,
- 0xb2, 0x6e, 0x2d, 0x36, 0x44, 0x03, 0x64, 0x6b, 0xad, 0x45, 0x45, 0x68, 0x02, 0x57, 0x13, 0x1a,
- 0x6b, 0xb1, 0x41, 0x6e, 0x41, 0xa9, 0xd6, 0x6c, 0xfa, 0x3d, 0x65, 0xf7, 0x35, 0x7b, 0x74, 0x58,
- 0x9d, 0x71, 0x38, 0x50, 0x3f, 0x2b, 0x48, 0x50, 0xcd, 0x7a, 0x52, 0x6b, 0xc6, 0x63, 0xa1, 0xd5,
- 0x0b, 0x23, 0x1a, 0x2c, 0x2f, 0x8a, 0x26, 0x23, 0x8f, 0x26, 0x07, 0xa6, 0x78, 0xc4, 0xa8, 0xe6,
- 0x7f, 0x36, 0xb0, 0xc6, 0xe4, 0x2d, 0x80, 0xe5, 0x0e, 0xb3, 0xb0, 0x9b, 0x34, 0x66, 0x80, 0xbb,
- 0x78, 0x4f, 0x40, 0x75, 0x0e, 0x0a, 0xb2, 0xfe, 0xe9, 0xdc, 0xd0, 0x9f, 0x66, 0x9f, 0x94, 0xf6,
- 0xba, 0x38, 0xd0, 0x11, 0x9f, 0x0c, 0x04, 0x34, 0xf5, 0xc9, 0x04, 0x99, 0x5c, 0x86, 0xb1, 0xe5,
- 0xda, 0xfd, 0x5a, 0x2f, 0xda, 0xc3, 0xfe, 0x2a, 0x72, 0xcd, 0xe9, 0x39, 0x6d, 0xdb, 0xe9, 0x45,
- 0x7b, 0x96, 0x2c, 0x34, 0x7f, 0xc1, 0x80, 0x71, 0x45, 0x69, 0xb0, 0xaa, 0xae, 0x07, 0xfe, 0xc7,
- 0xb4, 0x19, 0xe9, 0xbd, 0xd4, 0xe5, 0xc0, 0x54, 0x55, 0x63, 0xd4, 0x54, 0xef, 0xe4, 0x9e, 0xa0,
- 0x77, 0xcc, 0x39, 0xa1, 0x8b, 0xd8, 0x66, 0x44, 0x39, 0x6b, 0xc1, 0xcd, 0x08, 0x33, 0xb6, 0xd4,
- 0xcd, 0x08, 0x2b, 0x37, 0xff, 0xd0, 0x60, 0x3a, 0x84, 0xcc, 0x01, 0xdc, 0xa3, 0x07, 0x91, 0xb3,
- 0x73, 0xdb, 0x6b, 0x69, 0x67, 0x68, 0xfb, 0x08, 0xb5, 0x1f, 0x78, 0x2d, 0x6a, 0x29, 0x28, 0xe4,
- 0x26, 0x14, 0xef, 0x05, 0x3b, 0x6f, 0x22, 0x7a, 0x2e, 0x5e, 0x0b, 0x4e, 0xef, 0x07, 0x3b, 0x6f,
- 0x22, 0xb2, 0x2a, 0xaf, 0x12, 0x91, 0x98, 0x30, 0xba, 0xe8, 0xb7, 0x1d, 0x4f, 0xae, 0xbf, 0xc0,
- 0x16, 0x31, 0x17, 0x21, 0x96, 0x28, 0x61, 0xab, 0x4f, 0x63, 0x7d, 0x55, 0x08, 0x26, 0xae, 0x3e,
- 0x61, 0xb7, 0x63, 0x31, 0x98, 0xf9, 0x3d, 0x03, 0xc6, 0x15, 0xd5, 0x48, 0xbe, 0x28, 0xce, 0x1b,
- 0x0c, 0x3c, 0x2d, 0x3b, 0xdb, 0xaf, 0x3c, 0x59, 0x29, 0xb7, 0x1b, 0xda, 0xbe, 0x4b, 0xc5, 0xe9,
+ 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xfa, 0x47, 0x69, 0xb5, 0x3b,
+ 0xba, 0xde, 0x5d, 0xad, 0x56, 0xb7, 0x2b, 0x9e, 0xa8, 0xdb, 0x3d, 0xef, 0xed, 0xbf, 0x9b, 0x21,
+ 0x29, 0x89, 0x2b, 0x8a, 0xe4, 0xf6, 0xf0, 0xcf, 0x9d, 0xef, 0xce, 0xed, 0xe6, 0x74, 0x91, 0xec,
+ 0xe5, 0xcc, 0xf4, 0x5c, 0x77, 0x8f, 0x24, 0xda, 0x3f, 0xc3, 0x36, 0x7e, 0x70, 0x0c, 0xc3, 0xf0,
+ 0x9d, 0xcf, 0x38, 0xc7, 0x76, 0xe0, 0xc0, 0x8e, 0x11, 0x27, 0x71, 0x82, 0x33, 0x02, 0x27, 0x40,
+ 0x12, 0x24, 0x48, 0x60, 0x20, 0x30, 0xee, 0x43, 0x8c, 0xf8, 0x4b, 0x10, 0xd8, 0x09, 0x98, 0xf8,
+ 0x2e, 0x5f, 0x42, 0x20, 0x40, 0x00, 0x03, 0x01, 0x7c, 0x89, 0x81, 0xa0, 0x5e, 0x55, 0x75, 0x57,
+ 0xf5, 0xf4, 0x90, 0xc3, 0x95, 0x16, 0xb1, 0xf6, 0x13, 0x39, 0xaf, 0xde, 0x7b, 0x5d, 0x7f, 0x5e,
+ 0xbd, 0x7a, 0xf5, 0xea, 0xd5, 0x2b, 0x18, 0x8f, 0x0e, 0xba, 0x34, 0xbc, 0xd9, 0x0d, 0xfc, 0xc8,
+ 0x27, 0x23, 0xf8, 0xe3, 0xf2, 0xb9, 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x2c, 0xfb, 0x8f, 0x17, 0x5e,
+ 0xae, 0xee, 0xfa, 0xfe, 0x6e, 0x8b, 0xce, 0xe2, 0xaf, 0xed, 0xde, 0xce, 0x6c, 0xe4, 0xb5, 0x69,
+ 0x18, 0x39, 0xed, 0xae, 0x40, 0x98, 0xdf, 0xf5, 0xa2, 0xbd, 0xde, 0xf6, 0xcd, 0xa6, 0xdf, 0x9e,
+ 0xdd, 0x0d, 0x9c, 0x87, 0x5e, 0xe4, 0x44, 0x9e, 0xdf, 0x71, 0x5a, 0xb3, 0x11, 0x6d, 0xd1, 0xae,
+ 0x1f, 0x44, 0xb3, 0x4e, 0xd7, 0x9b, 0xc5, 0x6f, 0xcc, 0x3e, 0x0a, 0x9c, 0x6e, 0x97, 0x06, 0xc9,
+ 0x3f, 0x9c, 0x89, 0xf9, 0x77, 0xf2, 0x50, 0xba, 0x4f, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x52, 0xf2,
+ 0x22, 0x14, 0x56, 0x9c, 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, 0xea,
+ 0x78, 0x48, 0x83, 0x87, 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x58, 0x48, 0x3e, 0x0b, 0x25, 0xf6,
+ 0x37, 0xec, 0x3a, 0x4d, 0x3a, 0x93, 0x43, 0xcc, 0x89, 0xa3, 0xc3, 0x6a, 0xa9, 0x23, 0x81, 0x56,
+ 0x52, 0x4e, 0xae, 0xc1, 0xd8, 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, 0xcf,
+ 0xd7, 0xcb, 0x47, 0x87, 0xd5, 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, 0xb1,
+ 0xc5, 0xc7, 0x5d, 0x2f, 0xa0, 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x7d, 0x7c, 0xee, 0xf2, 0x4d, 0xde,
+ 0xfe, 0x9b, 0xb2, 0xfd, 0x37, 0xd7, 0x65, 0xfb, 0xeb, 0x67, 0xbf, 0x77, 0x58, 0x3d, 0x73, 0x74,
+ 0x58, 0x1d, 0xa3, 0x9c, 0xe4, 0x97, 0xff, 0x4b, 0xd5, 0xb0, 0x24, 0x3d, 0x79, 0x07, 0x0a, 0xeb,
+ 0x07, 0x5d, 0x3a, 0x53, 0xba, 0x6a, 0x5c, 0x9f, 0x9c, 0x7b, 0xe1, 0x26, 0xef, 0xf1, 0xb8, 0x91,
+ 0xc9, 0x7f, 0x0c, 0xab, 0x5e, 0x3c, 0x3a, 0xac, 0x16, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x75, 0x18,
+ 0xbd, 0xe7, 0x87, 0xd1, 0xd2, 0xc2, 0x0c, 0x60, 0xd3, 0xce, 0x1f, 0x1d, 0x56, 0xa7, 0xf7, 0xfc,
+ 0x30, 0xb2, 0x3d, 0xf7, 0x35, 0xbf, 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, 0x6e,
+ 0xc3, 0x84, 0xc6, 0x8f, 0x8c, 0xc3, 0xd8, 0xc6, 0xca, 0xfd, 0x95, 0xd5, 0xad, 0x95, 0xca, 0x19,
+ 0x52, 0x84, 0xc2, 0xca, 0xea, 0xc2, 0x62, 0xc5, 0x20, 0x63, 0x90, 0xaf, 0xad, 0xad, 0x55, 0x72,
+ 0xa4, 0x0c, 0xc5, 0x85, 0xda, 0x7a, 0xad, 0x5e, 0x6b, 0x2c, 0x56, 0xf2, 0xe4, 0x2c, 0x4c, 0x6d,
+ 0x2d, 0xad, 0x2c, 0xac, 0x6e, 0x35, 0xec, 0x85, 0xc5, 0xc6, 0xfd, 0xf5, 0xd5, 0xb5, 0x4a, 0x81,
+ 0x4c, 0x02, 0xdc, 0xdf, 0xa8, 0x2f, 0x5a, 0x2b, 0x8b, 0xeb, 0x8b, 0x8d, 0xca, 0x88, 0xf9, 0xf3,
+ 0x79, 0x28, 0x3e, 0xa0, 0x91, 0xe3, 0x3a, 0x91, 0x43, 0xae, 0x68, 0x43, 0x84, 0xb5, 0x57, 0xc6,
+ 0xe6, 0xc5, 0xfe, 0xb1, 0x19, 0x39, 0x3a, 0xac, 0x1a, 0xaf, 0xab, 0x63, 0xf2, 0x36, 0x8c, 0x2f,
+ 0xd0, 0xb0, 0x19, 0x78, 0x5d, 0x26, 0x2f, 0x38, 0x2e, 0xa5, 0xfa, 0xa5, 0xa3, 0xc3, 0xea, 0x79,
+ 0x37, 0x01, 0x2b, 0x6d, 0x55, 0xb1, 0xc9, 0x12, 0x8c, 0x2e, 0x3b, 0xdb, 0xb4, 0x15, 0xce, 0x8c,
+ 0x5c, 0xcd, 0x5f, 0x1f, 0x9f, 0x7b, 0x4e, 0xf4, 0xaf, 0xac, 0xe0, 0x4d, 0x5e, 0xba, 0xd8, 0x89,
+ 0x82, 0x83, 0xfa, 0xb9, 0xa3, 0xc3, 0x6a, 0xa5, 0x85, 0x00, 0xb5, 0xef, 0x38, 0x0a, 0x69, 0x24,
+ 0x63, 0x3e, 0x7a, 0xe2, 0x98, 0x3f, 0xff, 0xbd, 0xc3, 0xaa, 0xc1, 0xc6, 0x42, 0x8c, 0x79, 0xc2,
+ 0x4f, 0x1f, 0xfd, 0xab, 0x90, 0x5b, 0x5a, 0x98, 0x19, 0x43, 0x59, 0xab, 0x1c, 0x1d, 0x56, 0xcb,
+ 0xda, 0xb0, 0xe5, 0x96, 0x16, 0x2e, 0xbf, 0x05, 0xe3, 0x4a, 0x1d, 0x49, 0x05, 0xf2, 0xfb, 0xf4,
+ 0x80, 0xf7, 0xa7, 0xc5, 0xfe, 0x25, 0xe7, 0x60, 0xe4, 0xa1, 0xd3, 0xea, 0x89, 0x0e, 0xb4, 0xf8,
+ 0x8f, 0x2f, 0xe6, 0x7e, 0xc4, 0x30, 0x7f, 0xa5, 0x00, 0x45, 0xcb, 0xe7, 0xf3, 0x8c, 0xbc, 0x0a,
+ 0x23, 0x8d, 0xc8, 0x89, 0xe4, 0x50, 0x9c, 0x3d, 0x3a, 0xac, 0x4e, 0x85, 0x0c, 0xa0, 0x7c, 0x8f,
+ 0x63, 0x30, 0xd4, 0xb5, 0x3d, 0x27, 0x94, 0x43, 0x82, 0xa8, 0x5d, 0x06, 0x50, 0x51, 0x11, 0x83,
+ 0x5c, 0x83, 0xc2, 0x03, 0xdf, 0xa5, 0x62, 0x54, 0xc8, 0xd1, 0x61, 0x75, 0xb2, 0xed, 0xbb, 0x2a,
+ 0x22, 0x96, 0x93, 0xd7, 0xa0, 0x34, 0xdf, 0x0b, 0x02, 0xda, 0x61, 0xa2, 0x5a, 0x40, 0xe4, 0xc9,
+ 0xa3, 0xc3, 0x2a, 0x34, 0x39, 0x90, 0x4d, 0xae, 0x04, 0x81, 0x75, 0x75, 0x23, 0x72, 0x82, 0x88,
+ 0xba, 0x33, 0x23, 0x43, 0x75, 0x35, 0x9b, 0x5e, 0xd3, 0x21, 0x27, 0x49, 0x77, 0xb5, 0xe0, 0x44,
+ 0xee, 0xc1, 0xf8, 0xdd, 0xc0, 0x69, 0xd2, 0x35, 0x1a, 0x78, 0xbe, 0x8b, 0x63, 0x98, 0xaf, 0x5f,
+ 0x3b, 0x3a, 0xac, 0x5e, 0xd8, 0x65, 0x60, 0xbb, 0x8b, 0xf0, 0x84, 0xfa, 0x87, 0x87, 0xd5, 0xe2,
+ 0x42, 0x2f, 0xc0, 0xde, 0xb3, 0x54, 0x52, 0xf2, 0xe3, 0x6c, 0x48, 0xc2, 0x08, 0xbb, 0x96, 0xba,
+ 0x38, 0x7a, 0xc7, 0x57, 0xd1, 0x14, 0x55, 0xbc, 0xd0, 0x72, 0xc2, 0xc8, 0x0e, 0x38, 0x5d, 0xaa,
+ 0x9e, 0x2a, 0x4b, 0xb2, 0x0a, 0xc5, 0x46, 0x73, 0x8f, 0xba, 0xbd, 0x16, 0x9d, 0x29, 0x22, 0xfb,
+ 0x8b, 0x42, 0x70, 0xe5, 0x78, 0xca, 0xe2, 0xfa, 0x65, 0xc1, 0x9b, 0x84, 0x02, 0xa2, 0xf4, 0x7d,
+ 0xcc, 0xe4, 0x8b, 0xc5, 0x5f, 0xff, 0xed, 0xea, 0x99, 0x9f, 0xf9, 0xcf, 0x57, 0xcf, 0x98, 0xff,
+ 0x2c, 0x07, 0x95, 0x34, 0x13, 0xb2, 0x03, 0x13, 0x1b, 0x5d, 0xd7, 0x89, 0xe8, 0x7c, 0xcb, 0xa3,
+ 0x9d, 0x28, 0x44, 0x21, 0x39, 0xbe, 0x4d, 0x2f, 0x89, 0xef, 0xce, 0xf4, 0x90, 0xd0, 0x6e, 0x72,
+ 0xca, 0x54, 0xab, 0x74, 0xb6, 0xc9, 0x77, 0x1a, 0xa8, 0xa7, 0x43, 0x94, 0xb0, 0xd3, 0x7d, 0x87,
+ 0x6b, 0xf8, 0x01, 0xdf, 0x11, 0x6c, 0x85, 0x00, 0x75, 0xdc, 0xed, 0x03, 0x94, 0xcc, 0xe1, 0x05,
+ 0x88, 0x91, 0x64, 0x08, 0x10, 0x03, 0x9b, 0xff, 0xcd, 0x80, 0x49, 0x8b, 0x86, 0x7e, 0x2f, 0x68,
+ 0xd2, 0x7b, 0xd4, 0x71, 0x69, 0xc0, 0xc4, 0xff, 0xbe, 0xd7, 0x71, 0xc5, 0x9c, 0x42, 0xf1, 0xdf,
+ 0xf7, 0x3a, 0xea, 0x14, 0xc6, 0x72, 0xf2, 0x39, 0x18, 0x6b, 0xf4, 0xb6, 0x11, 0x95, 0xcf, 0xa9,
+ 0x0b, 0x38, 0x62, 0xbd, 0x6d, 0x3b, 0x85, 0x2e, 0xd1, 0xc8, 0x2c, 0x8c, 0x6d, 0xd2, 0x20, 0x4c,
+ 0x34, 0x1e, 0x6a, 0xf6, 0x87, 0x1c, 0xa4, 0x12, 0x08, 0x2c, 0x72, 0x37, 0xd1, 0xba, 0x62, 0x4d,
+ 0x9a, 0x4a, 0xe9, 0xba, 0x44, 0x54, 0xda, 0x02, 0xa2, 0x8a, 0x8a, 0xc4, 0x32, 0xbf, 0x9d, 0x83,
+ 0xca, 0x82, 0x13, 0x39, 0xdb, 0x4e, 0x28, 0xfa, 0x73, 0xf3, 0x36, 0xd3, 0xe3, 0x4a, 0x43, 0x51,
+ 0x8f, 0xb3, 0x9a, 0x7f, 0xec, 0xe6, 0xbd, 0x9c, 0x6e, 0xde, 0x38, 0x5b, 0x20, 0x45, 0xf3, 0x92,
+ 0x46, 0xbd, 0x7b, 0x72, 0xa3, 0x2a, 0xa2, 0x51, 0x45, 0xd9, 0xa8, 0xa4, 0x29, 0xe4, 0x5d, 0x28,
+ 0x34, 0xba, 0xb4, 0x29, 0x94, 0x88, 0xd4, 0xfd, 0x7a, 0xe3, 0x18, 0xc2, 0xe6, 0xed, 0x7a, 0x59,
+ 0xb0, 0x29, 0x84, 0x5d, 0xda, 0xb4, 0x90, 0x4c, 0x99, 0x34, 0xdf, 0x19, 0x85, 0x73, 0x59, 0x64,
+ 0xe4, 0x5d, 0x7d, 0x71, 0xe2, 0xdd, 0xf3, 0xdc, 0xc0, 0xc5, 0x69, 0xc6, 0xd0, 0x97, 0xa7, 0x1b,
+ 0x50, 0x5c, 0x63, 0x02, 0xd9, 0xf4, 0x5b, 0xa2, 0xe7, 0x98, 0x56, 0x2c, 0x76, 0x25, 0xcc, 0xb0,
+ 0xe2, 0x72, 0xf2, 0x1c, 0xe4, 0x37, 0xac, 0x25, 0xd1, 0x5d, 0xa5, 0xa3, 0xc3, 0x6a, 0xbe, 0x17,
+ 0x78, 0x33, 0x86, 0xc5, 0xa0, 0x64, 0x16, 0x46, 0xe7, 0x6b, 0xf3, 0x34, 0x88, 0xb0, 0x9b, 0xca,
+ 0xf5, 0x8b, 0x4c, 0x5a, 0x9a, 0x8e, 0xdd, 0xa4, 0x41, 0xa4, 0x7d, 0x5e, 0xa0, 0x91, 0xcf, 0x42,
+ 0xbe, 0xb6, 0xd5, 0x10, 0x3d, 0x03, 0xa2, 0x67, 0x6a, 0x5b, 0x8d, 0xfa, 0x84, 0xe8, 0x88, 0xbc,
+ 0xf3, 0x28, 0x64, 0xdc, 0x6b, 0x5b, 0x0d, 0x75, 0xb4, 0x46, 0x8f, 0x19, 0xad, 0xeb, 0x50, 0x64,
+ 0x76, 0x06, 0x5b, 0xe0, 0x51, 0x29, 0x96, 0xb8, 0xf9, 0xb4, 0x27, 0x60, 0x56, 0x5c, 0x4a, 0x5e,
+ 0x8c, 0xcd, 0x96, 0x62, 0xc2, 0x4f, 0x98, 0x2d, 0xd2, 0x58, 0x21, 0x8f, 0x61, 0x62, 0xe1, 0xa0,
+ 0xe3, 0xb4, 0xbd, 0xa6, 0x58, 0xc2, 0x4b, 0xb8, 0x84, 0xdf, 0x3c, 0x66, 0x18, 0x6f, 0x6a, 0x04,
+ 0x7c, 0x55, 0x97, 0xca, 0x77, 0xc6, 0xe5, 0x65, 0x76, 0x7a, 0x85, 0x9f, 0x31, 0x2c, 0xfd, 0x43,
+ 0x6c, 0x2e, 0x49, 0x15, 0x89, 0x76, 0x55, 0x22, 0x76, 0x12, 0x9c, 0xcc, 0xa5, 0x40, 0x40, 0xd4,
+ 0xb9, 0x14, 0x2f, 0xba, 0xef, 0x42, 0xfe, 0xee, 0xfc, 0xda, 0xcc, 0x38, 0xf2, 0x20, 0x82, 0xc7,
+ 0xdd, 0xf9, 0xb5, 0xf9, 0x96, 0xdf, 0x73, 0x1b, 0x1f, 0x2e, 0xd7, 0x2f, 0x0a, 0x36, 0x13, 0xbb,
+ 0xcd, 0xae, 0x56, 0x23, 0x46, 0x47, 0x16, 0xa1, 0x28, 0x5b, 0x39, 0x53, 0x46, 0x1e, 0xd3, 0xa9,
+ 0xc6, 0x6f, 0xde, 0xe6, 0x73, 0xcd, 0x15, 0xbf, 0xd5, 0x5a, 0x48, 0x9c, 0xcb, 0x5b, 0x40, 0xfa,
+ 0xfb, 0x25, 0xc3, 0x92, 0xf8, 0xac, 0x6a, 0x49, 0x8c, 0xcf, 0x9d, 0x17, 0xdf, 0x9a, 0xf7, 0xdb,
+ 0x6d, 0xa7, 0xe3, 0x22, 0xed, 0xe6, 0x9c, 0x6a, 0x60, 0xd4, 0x60, 0x32, 0xa9, 0xc8, 0xb2, 0x17,
+ 0x46, 0x64, 0x16, 0x4a, 0x12, 0xc2, 0x16, 0x91, 0x7c, 0x66, 0x95, 0xad, 0x04, 0xc7, 0xfc, 0xa3,
+ 0x1c, 0x40, 0x52, 0xf2, 0x8c, 0xea, 0x99, 0x2f, 0x68, 0x7a, 0xe6, 0x7c, 0x5a, 0x40, 0x07, 0x6a,
+ 0x18, 0xf2, 0x3e, 0x8c, 0x32, 0x93, 0xab, 0x27, 0x4d, 0xca, 0x8b, 0x69, 0x52, 0x2c, 0xdc, 0xbc,
+ 0x5d, 0x9f, 0x14, 0xc4, 0xa3, 0x21, 0x42, 0x2c, 0x41, 0xa6, 0xa8, 0xa8, 0x3f, 0x18, 0x49, 0x06,
+ 0x43, 0x28, 0xa7, 0xeb, 0x8a, 0x76, 0x31, 0x92, 0xf9, 0x28, 0xb5, 0x8b, 0xa2, 0x5b, 0x2e, 0x71,
+ 0xdd, 0xc2, 0x3b, 0x75, 0x4c, 0xe8, 0x96, 0xb4, 0x66, 0xe1, 0x1d, 0x78, 0xa2, 0x66, 0xe9, 0xa6,
+ 0xa7, 0x6d, 0x01, 0xc5, 0xe0, 0x7a, 0x66, 0xaf, 0x64, 0x4d, 0xd8, 0xab, 0x27, 0x4d, 0xd8, 0xf4,
+ 0x74, 0xbd, 0x3d, 0x48, 0x97, 0x9d, 0x97, 0xb3, 0xcb, 0x79, 0xa4, 0x92, 0xa3, 0x4e, 0x7b, 0x9b,
+ 0x4f, 0xcd, 0xd1, 0x81, 0x53, 0xf3, 0x7c, 0xe6, 0xd4, 0xe4, 0x13, 0xf3, 0x6d, 0x18, 0xa9, 0xfd,
+ 0x44, 0x2f, 0xa0, 0xc2, 0xf6, 0x2b, 0xcb, 0x6f, 0x32, 0x58, 0x3c, 0xa7, 0xa7, 0x1c, 0xf6, 0x53,
+ 0xb5, 0x99, 0xb1, 0x9c, 0x7d, 0x79, 0x7d, 0xb9, 0x21, 0xec, 0x3a, 0x92, 0xea, 0x96, 0xf5, 0x65,
+ 0xa5, 0xda, 0x91, 0xd6, 0x6a, 0x46, 0x45, 0x66, 0x21, 0x57, 0x5b, 0xc0, 0xcd, 0xe2, 0xf8, 0x5c,
+ 0x49, 0x7e, 0x76, 0xa1, 0x7e, 0x4e, 0x90, 0x94, 0x1d, 0x6d, 0xff, 0x50, 0x5b, 0x20, 0x75, 0x18,
+ 0x79, 0x70, 0xd0, 0xf8, 0x70, 0x59, 0x28, 0xb2, 0xb3, 0x52, 0xae, 0x19, 0x6c, 0x15, 0x57, 0xa1,
+ 0x30, 0xa9, 0x71, 0xfb, 0x20, 0xfc, 0x46, 0x4b, 0xad, 0x31, 0xa2, 0x7d, 0x72, 0x0a, 0xe4, 0x1f,
+ 0x1b, 0x8a, 0xad, 0x21, 0x64, 0x9d, 0xed, 0x69, 0x85, 0xc4, 0x19, 0x89, 0xe5, 0xd3, 0x27, 0x71,
+ 0xb1, 0xbc, 0xbd, 0xca, 0x47, 0x3f, 0xd7, 0x37, 0xfa, 0xe3, 0xca, 0x4a, 0xc6, 0xc7, 0x3c, 0xee,
+ 0x8b, 0xfc, 0xc7, 0xee, 0x0b, 0xf3, 0xbf, 0x1b, 0xf8, 0x3d, 0xf2, 0x1a, 0x8c, 0x5a, 0x74, 0x37,
+ 0x59, 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0xad, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, 0x9e,
+ 0xb7, 0x13, 0x89, 0x9a, 0xc6, 0x2b, 0x8a, 0x00, 0x2b, 0x2b, 0x8a, 0x80, 0x68, 0x2b, 0x8a, 0x80,
+ 0x31, 0x59, 0xb7, 0x16, 0x1a, 0xa2, 0x01, 0xb2, 0xb5, 0xd6, 0x82, 0x22, 0x34, 0x81, 0xab, 0x09,
+ 0x8d, 0xb5, 0xd0, 0x20, 0x6f, 0x42, 0xa9, 0xd6, 0x6c, 0xfa, 0x3d, 0x65, 0xf7, 0x35, 0x73, 0x74,
+ 0x58, 0x3d, 0xe7, 0x70, 0xa0, 0xee, 0x2b, 0x48, 0x50, 0xcd, 0x7a, 0x52, 0x6b, 0xc6, 0x63, 0xbe,
+ 0xd5, 0x0b, 0x23, 0x1a, 0x2c, 0x2d, 0x88, 0x26, 0x23, 0x8f, 0x26, 0x07, 0xa6, 0x78, 0xc4, 0xa8,
+ 0xe6, 0x7f, 0x32, 0xb0, 0xc6, 0xe4, 0x2d, 0x80, 0xa5, 0x0e, 0xb3, 0xb0, 0x9b, 0x34, 0x66, 0x80,
+ 0xbb, 0x78, 0x4f, 0x40, 0x75, 0x0e, 0x0a, 0xb2, 0xfe, 0xe9, 0xdc, 0xd0, 0x9f, 0x66, 0x9f, 0x94,
+ 0xf6, 0xba, 0x70, 0xe8, 0x88, 0x4f, 0x06, 0x02, 0x9a, 0xfa, 0x64, 0x82, 0x4c, 0xae, 0xc1, 0xd8,
+ 0x52, 0xed, 0x41, 0xad, 0x17, 0xed, 0x61, 0x7f, 0x15, 0xb9, 0xe6, 0xf4, 0x9c, 0xb6, 0xed, 0xf4,
+ 0xa2, 0x3d, 0x4b, 0x16, 0x9a, 0x3f, 0x63, 0xc0, 0xb8, 0xa2, 0x34, 0x58, 0x55, 0xd7, 0x02, 0xff,
+ 0x23, 0xda, 0x8c, 0xf4, 0x5e, 0xea, 0x72, 0x60, 0xaa, 0xaa, 0x31, 0x6a, 0xaa, 0x77, 0x72, 0xa7,
+ 0xe8, 0x1d, 0x73, 0x56, 0xe8, 0x22, 0xb6, 0x19, 0x51, 0x7c, 0x2d, 0xb8, 0x19, 0x61, 0xc6, 0x96,
+ 0xba, 0x19, 0x61, 0xe5, 0xe6, 0xef, 0x19, 0x4c, 0x87, 0x90, 0x59, 0x80, 0xfb, 0xf4, 0x20, 0x72,
+ 0xb6, 0xef, 0x78, 0x2d, 0xcd, 0x87, 0xb6, 0x8f, 0x50, 0x7b, 0xc7, 0x6b, 0x51, 0x4b, 0x41, 0x21,
+ 0xb7, 0xa1, 0x78, 0x3f, 0xd8, 0x7e, 0x03, 0xd1, 0x73, 0xf1, 0x5a, 0x70, 0x76, 0x3f, 0xd8, 0x7e,
+ 0x03, 0x91, 0x55, 0x79, 0x95, 0x88, 0xc4, 0x84, 0xd1, 0x05, 0xbf, 0xed, 0x78, 0x72, 0xfd, 0x05,
+ 0xb6, 0x88, 0xb9, 0x08, 0xb1, 0x44, 0x09, 0x5b, 0x7d, 0x1a, 0x6b, 0x2b, 0x42, 0x30, 0x71, 0xf5,
+ 0x09, 0xbb, 0x1d, 0x8b, 0xc1, 0xcc, 0xef, 0x1a, 0x30, 0xae, 0xa8, 0x46, 0xf2, 0x79, 0xe1, 0x6f,
+ 0x30, 0xd0, 0x5b, 0x76, 0xa1, 0x5f, 0x79, 0xb2, 0x52, 0x6e, 0x37, 0xb4, 0x7d, 0x97, 0x0a, 0xef,
0x43, 0xa2, 0x51, 0x72, 0xc3, 0x68, 0x94, 0xb7, 0x00, 0xb8, 0x51, 0x89, 0xdd, 0xa9, 0xc8, 0x8d,
- 0x72, 0xba, 0xa8, 0x0e, 0x46, 0x82, 0x6c, 0x5a, 0x50, 0x56, 0xb5, 0x09, 0xa9, 0xc3, 0x84, 0xd8,
- 0x43, 0x09, 0x2b, 0x84, 0xf7, 0xf3, 0x45, 0xb6, 0xbc, 0x09, 0x6e, 0xfd, 0x7b, 0x3a, 0x9d, 0xc4,
- 0xfc, 0xff, 0x73, 0x50, 0x14, 0x90, 0xf9, 0xe7, 0xd4, 0x40, 0x7a, 0x53, 0x33, 0x90, 0xa4, 0xde,
- 0x55, 0x2c, 0xf7, 0xf9, 0x13, 0x36, 0x60, 0x6f, 0x41, 0x59, 0x76, 0x01, 0xda, 0x99, 0x57, 0x61,
- 0x4c, 0x1e, 0x21, 0x70, 0x2b, 0x73, 0x4a, 0xe3, 0xb9, 0x35, 0x6f, 0xc9, 0x72, 0xf3, 0x3b, 0x23,
- 0x92, 0x96, 0x7f, 0x89, 0x75, 0x61, 0xcd, 0x75, 0x03, 0xb5, 0x0b, 0x1d, 0xd7, 0x0d, 0x2c, 0x84,
- 0xb2, 0xc1, 0x5f, 0xef, 0xed, 0xb4, 0xbc, 0x26, 0xe2, 0x28, 0x33, 0xb1, 0x8b, 0x50, 0x9b, 0xa1,
- 0xaa, 0x83, 0x9f, 0x20, 0x6b, 0xfb, 0x9f, 0xfc, 0xb1, 0xfb, 0x9f, 0x9f, 0x82, 0xd2, 0x42, 0xdb,
- 0xd5, 0xec, 0x23, 0x33, 0xa3, 0x53, 0xae, 0xc7, 0x48, 0xdc, 0x32, 0xba, 0x28, 0xfa, 0x68, 0xa6,
- 0xd9, 0x76, 0xfb, 0xad, 0xa2, 0x84, 0xa5, 0xb6, 0x81, 0x19, 0x79, 0x9a, 0x0d, 0xcc, 0x2d, 0x28,
- 0x6d, 0x86, 0x74, 0xa3, 0xd7, 0xe9, 0xd0, 0x16, 0xda, 0x4a, 0x45, 0xae, 0xcf, 0x7a, 0x21, 0xb5,
- 0x23, 0x84, 0xaa, 0x15, 0x88, 0x51, 0x55, 0xb1, 0x1a, 0x3b, 0x46, 0xac, 0xbe, 0x08, 0x85, 0x5a,
- 0xb7, 0x2b, 0x77, 0x76, 0xf1, 0xe2, 0xdd, 0xed, 0xe2, 0x72, 0x3a, 0xe9, 0x74, 0xbb, 0xfa, 0x3e,
- 0x0d, 0xb1, 0x09, 0x05, 0x72, 0xaf, 0xb7, 0x43, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0xd4, 0x7d, 0x38,
- 0x0b, 0xc8, 0x63, 0x56, 0x1e, 0xa0, 0xa7, 0x11, 0x70, 0x57, 0x7e, 0x6e, 0xbf, 0xb7, 0x43, 0x6d,
- 0xb1, 0x6e, 0xa8, 0x7d, 0x97, 0xc1, 0xf0, 0x42, 0x03, 0x26, 0xf5, 0xfe, 0x7f, 0x06, 0x16, 0xcf,
- 0x07, 0x85, 0x62, 0xb1, 0x52, 0x32, 0x7f, 0x29, 0x07, 0xe3, 0xb5, 0x6e, 0xf7, 0x39, 0x3f, 0x5e,
- 0xf9, 0x09, 0x6d, 0x56, 0x9f, 0x4d, 0x46, 0xef, 0x09, 0x4e, 0x56, 0xfe, 0xc6, 0x80, 0xa9, 0x14,
- 0x85, 0x5a, 0x7b, 0x63, 0xc8, 0xe3, 0x86, 0xdc, 0x90, 0xc7, 0x0d, 0xf9, 0xc1, 0xc7, 0x0d, 0xea,
- 0x9c, 0x29, 0x3c, 0xcd, 0x9c, 0x79, 0x0d, 0xf2, 0xb5, 0x6e, 0x57, 0xf4, 0x4a, 0x39, 0xe9, 0x95,
- 0xad, 0x9b, 0x7c, 0x71, 0x73, 0xba, 0x5d, 0x8b, 0x61, 0x98, 0x6f, 0x40, 0x09, 0xc1, 0xa8, 0xd1,
- 0x2e, 0x89, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0x3f, 0x06, 0x8c, 0xe0, 0xef,
- 0xe7, 0x54, 0x5c, 0xe6, 0x35, 0x71, 0xa9, 0x28, 0xe2, 0x32, 0x8c, 0xa0, 0xfc, 0x71, 0x1e, 0x7b,
- 0x4b, 0x88, 0x88, 0xd8, 0xb0, 0x1a, 0x19, 0x1b, 0xd6, 0xa7, 0x50, 0xe0, 0xfb, 0xe9, 0xad, 0x6b,
- 0x1e, 0x07, 0xe3, 0xe5, 0x74, 0x55, 0x9f, 0xc9, 0xae, 0xf5, 0x2e, 0x90, 0xe5, 0x4e, 0x48, 0x9b,
- 0xbd, 0x80, 0x36, 0xf6, 0xbd, 0xee, 0x16, 0x0d, 0xbc, 0x07, 0x07, 0xc2, 0xda, 0x44, 0x1d, 0xeb,
- 0x89, 0x52, 0x3b, 0xdc, 0xf7, 0xba, 0xcc, 0x4c, 0xf0, 0x1e, 0x1c, 0x58, 0x19, 0x34, 0xe4, 0x7d,
- 0x18, 0xb3, 0xe8, 0xa3, 0xc0, 0x8b, 0xa8, 0xe8, 0xdb, 0xc9, 0x78, 0x6f, 0x81, 0x50, 0x6e, 0xef,
- 0x04, 0xfc, 0x87, 0x3a, 0xfe, 0xa2, 0xfc, 0xd3, 0xdb, 0xdf, 0x7d, 0x77, 0x04, 0xe7, 0xc2, 0x09,
- 0xd7, 0x80, 0xc7, 0x9c, 0x3e, 0xe8, 0x83, 0x99, 0x7f, 0x92, 0xc1, 0xdc, 0x82, 0x32, 0xdb, 0x52,
- 0xa6, 0x8e, 0x21, 0x2e, 0x26, 0x63, 0x79, 0x5d, 0x2d, 0x3e, 0xee, 0x06, 0x50, 0xe3, 0x43, 0xec,
- 0xb4, 0x90, 0xf0, 0x9b, 0xc5, 0x17, 0x15, 0xc6, 0x19, 0xe2, 0x11, 0xab, 0x8e, 0x26, 0xef, 0xac,
- 0x27, 0x16, 0x8c, 0xd1, 0xa7, 0x13, 0x8c, 0xb1, 0x4f, 0x22, 0x18, 0xe9, 0xbb, 0xd7, 0xe2, 0x93,
- 0xdc, 0xbd, 0x5e, 0x78, 0x1f, 0xa6, 0xfb, 0x7a, 0xf8, 0x49, 0xee, 0x2f, 0x3f, 0x3d, 0xb1, 0xfc,
- 0xb9, 0xb8, 0x5f, 0xc8, 0x3c, 0x6e, 0x71, 0xbd, 0x80, 0x36, 0x23, 0x54, 0xbd, 0x42, 0x5b, 0x06,
- 0x02, 0x96, 0xda, 0x83, 0x23, 0x8c, 0xbc, 0x07, 0x63, 0xfc, 0xfe, 0x27, 0x9c, 0xcd, 0xe1, 0xd8,
- 0x4f, 0x88, 0x2f, 0x72, 0xa8, 0xb8, 0x84, 0xe7, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x0e, 0x8c,
- 0x8a, 0xfb, 0xa3, 0xe3, 0xe7, 0x45, 0x15, 0x46, 0xb6, 0x92, 0x9e, 0xc1, 0x33, 0x7f, 0xde, 0x08,
- 0x8b, 0xc3, 0xcd, 0x5f, 0x31, 0x60, 0x52, 0x6f, 0x25, 0xb9, 0x0e, 0xa3, 0xe2, 0x82, 0xd3, 0xc0,
- 0x0b, 0x4e, 0xd6, 0x9a, 0x51, 0x7e, 0xb5, 0xa9, 0x5d, 0x68, 0x0a, 0x2c, 0xa6, 0xfa, 0x05, 0x07,
- 0x6c, 0x8b, 0x50, 0xfd, 0x42, 0x48, 0x2d, 0x59, 0xc6, 0xb6, 0x71, 0x16, 0x0d, 0x7b, 0xad, 0x48,
- 0xdd, 0xc6, 0x05, 0x08, 0xb1, 0x44, 0x89, 0x79, 0x68, 0x00, 0x34, 0x1a, 0x77, 0xef, 0xd1, 0x83,
- 0x75, 0xc7, 0x0b, 0x70, 0x2b, 0x8c, 0xb3, 0xf1, 0x9e, 0x18, 0xad, 0xb2, 0xd8, 0x0a, 0xf3, 0x99,
- 0xbb, 0x4f, 0x0f, 0xb4, 0xad, 0xb0, 0x44, 0xc5, 0x29, 0x1f, 0x78, 0x0f, 0x9d, 0x88, 0x32, 0xc2,
- 0x1c, 0x12, 0xf2, 0x29, 0xcf, 0xa1, 0x29, 0x4a, 0x05, 0x99, 0x7c, 0x04, 0x93, 0xc9, 0x2f, 0xf4,
- 0xaa, 0xc8, 0xe3, 0x3e, 0x51, 0x4a, 0x84, 0x5e, 0x58, 0x7f, 0xe9, 0xe8, 0xb0, 0x7a, 0x41, 0xe1,
- 0x6a, 0x33, 0x2c, 0x85, 0x75, 0x8a, 0x99, 0xf9, 0xfb, 0x06, 0xc0, 0xc6, 0x4a, 0x43, 0x36, 0xf0,
- 0x32, 0x14, 0xe2, 0x53, 0xaa, 0x32, 0xdf, 0x6f, 0xa7, 0x36, 0x94, 0x58, 0x4e, 0x5e, 0x86, 0x7c,
- 0xd2, 0x92, 0xe9, 0xa3, 0xc3, 0xea, 0x84, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc0, 0xd8, 0x50, 0x75,
- 0x46, 0xe9, 0xcc, 0xa8, 0xab, 0xa4, 0xc6, 0x51, 0xf8, 0x60, 0x7b, 0xe3, 0xb3, 0x3b, 0x0a, 0xdf,
- 0xce, 0xc1, 0x14, 0xeb, 0xd7, 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x6e, 0x77, 0xc5,
- 0xef, 0x68, 0x06, 0xd1, 0x05, 0xa9, 0xb6, 0xd4, 0xb6, 0x0d, 0xb5, 0x39, 0xfe, 0xab, 0x31, 0x38,
- 0x9d, 0x41, 0x45, 0x5e, 0x17, 0xae, 0x45, 0xc9, 0x39, 0x14, 0xba, 0x0e, 0xfd, 0xe8, 0xb0, 0x5a,
- 0x96, 0xe8, 0x1b, 0x89, 0x2b, 0xd1, 0x3c, 0x8c, 0x8b, 0xad, 0xcf, 0x6a, 0x62, 0x51, 0xa3, 0x4f,
- 0x8a, 0x3c, 0x67, 0x43, 0xd5, 0xa4, 0x22, 0x91, 0x1a, 0x94, 0x17, 0xf6, 0x68, 0x73, 0xdf, 0xeb,
- 0xec, 0xde, 0xa3, 0x07, 0xdc, 0x5e, 0x2a, 0xd7, 0x5f, 0x64, 0x3b, 0xad, 0xa6, 0x80, 0xb3, 0x21,
- 0xd5, 0x37, 0x71, 0x1a, 0x09, 0x79, 0x0f, 0xc6, 0x1b, 0xde, 0x6e, 0x47, 0x72, 0x28, 0x20, 0x87,
- 0x8b, 0x47, 0x87, 0xd5, 0xb3, 0x21, 0x07, 0xf7, 0x33, 0x50, 0x09, 0xc8, 0x55, 0x18, 0xb1, 0xfc,
- 0x16, 0xe5, 0xcb, 0xb0, 0x70, 0x56, 0x09, 0x18, 0x40, 0x3d, 0xba, 0x45, 0x0c, 0x72, 0x17, 0xc6,
- 0xd8, 0x3f, 0xf7, 0x9d, 0xee, 0xec, 0x28, 0xea, 0x6d, 0x12, 0x1b, 0xf8, 0x08, 0xed, 0x7a, 0x9d,
- 0x5d, 0xd5, 0xc6, 0x6f, 0x51, 0xbb, 0xed, 0x74, 0xb5, 0x75, 0x91, 0x23, 0x92, 0x2d, 0x18, 0x4f,
- 0x14, 0x41, 0x38, 0x3b, 0xa6, 0x5d, 0x74, 0x25, 0x25, 0xf5, 0xcf, 0x09, 0x66, 0xe7, 0xa2, 0x56,
- 0x88, 0xb2, 0xdd, 0x65, 0xf8, 0x7a, 0x63, 0x14, 0x46, 0xda, 0x1e, 0xa4, 0x38, 0x78, 0x0f, 0x62,
- 0x9c, 0xb8, 0x07, 0x71, 0x01, 0x44, 0x27, 0xd5, 0x5a, 0xbb, 0xc2, 0xb7, 0xec, 0xea, 0x60, 0x01,
- 0xbb, 0x9e, 0x20, 0xe3, 0x9c, 0xe4, 0xa7, 0x5d, 0xa2, 0xff, 0x9d, 0xd6, 0xae, 0x76, 0xda, 0x15,
- 0xa3, 0xb2, 0x6e, 0x48, 0x54, 0x8d, 0xdc, 0x81, 0xcb, 0x6e, 0x48, 0x4a, 0x92, 0x6e, 0xf8, 0xf8,
- 0x51, 0x34, 0xa8, 0x1b, 0x14, 0x46, 0x64, 0x15, 0xa0, 0xd6, 0x8c, 0xbc, 0x87, 0x14, 0x45, 0x62,
- 0x5c, 0xeb, 0x88, 0x85, 0xda, 0x3d, 0x7a, 0xd0, 0xa0, 0x51, 0xec, 0xb6, 0x71, 0xc6, 0x41, 0xd4,
- 0x94, 0x98, 0x58, 0x0a, 0x07, 0xd2, 0x85, 0x33, 0x35, 0xd7, 0xf5, 0xb8, 0xbf, 0xe1, 0x46, 0xc0,
- 0xe4, 0xd7, 0x45, 0xd6, 0xe5, 0x6c, 0xd6, 0x57, 0x05, 0xeb, 0xcf, 0x39, 0x31, 0x95, 0x1d, 0x71,
- 0xb2, 0xf4, 0x67, 0xb2, 0x19, 0x9b, 0x6b, 0x30, 0xa9, 0x77, 0xa9, 0xee, 0x69, 0x57, 0x86, 0xa2,
- 0xd5, 0xa8, 0xd9, 0x8d, 0xbb, 0xb5, 0x1b, 0x15, 0x83, 0x54, 0xa0, 0x2c, 0x7e, 0xcd, 0xdb, 0xf3,
- 0x6f, 0xde, 0xaa, 0xe4, 0x34, 0xc8, 0x9b, 0x37, 0xe6, 0x2b, 0x79, 0xf3, 0x8f, 0x0d, 0x28, 0xca,
- 0xfa, 0x91, 0x5b, 0x90, 0x6f, 0x34, 0xee, 0xa6, 0xee, 0x57, 0x93, 0xa5, 0x97, 0x2f, 0x32, 0x61,
- 0xb8, 0xa7, 0x2e, 0x32, 0x8d, 0xc6, 0x5d, 0x46, 0xb7, 0xb1, 0xd2, 0x10, 0x46, 0x4b, 0x86, 0xb8,
- 0x4e, 0x0f, 0xb8, 0x74, 0xba, 0x05, 0xf9, 0x0f, 0xb6, 0x37, 0xc4, 0x6e, 0x28, 0x63, 0x7c, 0x91,
- 0xee, 0xe3, 0x47, 0xea, 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x8d, 0x88, 0xb6,
- 0x1f, 0xfb, 0xa0, 0x09, 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x15, 0xbf, 0xe9, 0xb4,
- 0x84, 0x35, 0x82, 0x36, 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xc4, 0x80, 0xca, 0x7a, 0xe0,
- 0x3f, 0xf4, 0x98, 0x06, 0xde, 0xf0, 0xf7, 0x69, 0x67, 0xeb, 0x06, 0x79, 0x43, 0x2a, 0x01, 0x6e,
- 0xc2, 0x9d, 0x63, 0x54, 0xa8, 0x04, 0x7e, 0x74, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x2b,
- 0x97, 0x8a, 0x40, 0x71, 0xe5, 0xcb, 0x0d, 0xef, 0x1e, 0x74, 0x82, 0x2b, 0x5f, 0x15, 0x46, 0xb0,
- 0x3a, 0x8a, 0x87, 0xc6, 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0x3b, 0xb9, 0xbe, 0x36,
- 0xcc, 0x7f, 0xa6, 0x5c, 0x6c, 0xf4, 0xc6, 0x0d, 0xb5, 0x88, 0x7d, 0x0d, 0x66, 0xd2, 0x5d, 0x82,
- 0xe7, 0x22, 0x35, 0x98, 0xd2, 0xe1, 0xf2, 0x88, 0xe4, 0x5c, 0xe6, 0xb7, 0xb6, 0xe6, 0xad, 0x34,
- 0xbe, 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, 0xd5, 0x6b, 0x51, 0x66, 0xd9, 0xd4, 0xb6, 0x1b, 0xe2,
- 0x92, 0x4b, 0xbd, 0x88, 0x72, 0x1e, 0x85, 0xb6, 0xb8, 0x11, 0xd3, 0xf4, 0x48, 0x8c, 0x2c, 0x48,
- 0xf9, 0x95, 0x5e, 0x28, 0x24, 0x34, 0x26, 0xe5, 0x77, 0x7f, 0x61, 0x8a, 0x54, 0x20, 0xb3, 0xf1,
- 0x63, 0xbf, 0xfc, 0x96, 0x3c, 0x1a, 0xc6, 0xf1, 0x43, 0x3a, 0x5f, 0xbb, 0x3a, 0x91, 0x68, 0xe4,
- 0x0d, 0x18, 0x65, 0x9f, 0xb6, 0xe4, 0xc5, 0x08, 0xee, 0x2a, 0xb0, 0x8e, 0x81, 0x76, 0xc3, 0xc8,
- 0x91, 0xcc, 0x7f, 0x9d, 0x4b, 0x77, 0xa0, 0xb0, 0x02, 0x9e, 0x70, 0x6e, 0xbc, 0x0d, 0x23, 0xb5,
- 0x56, 0xcb, 0x7f, 0x24, 0xb4, 0x84, 0x3c, 0xa6, 0x89, 0xfb, 0x8f, 0xaf, 0xb0, 0x0e, 0x43, 0xd1,
- 0xae, 0xb6, 0x19, 0x80, 0x2c, 0x40, 0xa9, 0xb6, 0xdd, 0x58, 0x5e, 0x5e, 0xdc, 0xd8, 0x58, 0x11,
- 0x1e, 0xd4, 0xaf, 0xca, 0xfe, 0xf1, 0x3c, 0xd7, 0x8e, 0xa2, 0xd6, 0x00, 0x07, 0xcb, 0x84, 0x8e,
- 0xbc, 0x0b, 0xf0, 0x81, 0xef, 0x75, 0xee, 0xd3, 0x68, 0xcf, 0x77, 0x45, 0xe3, 0x99, 0x49, 0x31,
- 0xfe, 0xb1, 0xef, 0x75, 0xec, 0x36, 0x82, 0x59, 0xdd, 0x13, 0x24, 0x4b, 0xf9, 0x9f, 0xf5, 0x74,
- 0xdd, 0x8f, 0xd0, 0x86, 0x19, 0x49, 0x7a, 0x7a, 0xc7, 0x8f, 0xd2, 0xf7, 0x36, 0x12, 0xcd, 0xfc,
- 0xd5, 0x1c, 0x4c, 0xf2, 0x9d, 0x2a, 0x17, 0x98, 0xe7, 0x76, 0x32, 0xbe, 0xad, 0x4d, 0xc6, 0xf3,
- 0x72, 0x61, 0x50, 0x9a, 0x36, 0xd4, 0x54, 0xdc, 0x03, 0xd2, 0x4f, 0x43, 0x2c, 0x79, 0x9e, 0x32,
- 0xcc, 0x2c, 0xbc, 0x91, 0xdc, 0x47, 0x87, 0x48, 0x64, 0xa3, 0x2a, 0x0c, 0x2d, 0x8d, 0x87, 0xf9,
- 0x2b, 0x39, 0x98, 0x50, 0xec, 0xc9, 0xe7, 0xb6, 0xe3, 0xbf, 0xac, 0x75, 0xbc, 0xbc, 0x83, 0x50,
- 0x5a, 0x36, 0x54, 0xbf, 0xf7, 0x60, 0xba, 0x8f, 0x24, 0x6d, 0x96, 0x1b, 0xc3, 0x98, 0xe5, 0xaf,
- 0xf7, 0x5f, 0x98, 0x73, 0x6f, 0xeb, 0xf8, 0xc2, 0x5c, 0xbd, 0xa1, 0xff, 0x76, 0x0e, 0x66, 0xc4,
- 0xaf, 0x5a, 0xcf, 0xf5, 0xa2, 0x05, 0xbf, 0xf3, 0xc0, 0xdb, 0x7d, 0x6e, 0xc7, 0xa2, 0xa6, 0x8d,
- 0x45, 0x55, 0x1f, 0x0b, 0xa5, 0x81, 0x83, 0x87, 0xc4, 0xfc, 0xb7, 0x45, 0x98, 0x1d, 0x44, 0xc0,
- 0xb6, 0xfd, 0xca, 0xae, 0x0a, 0xb7, 0xfd, 0xa9, 0x1d, 0x2b, 0xdf, 0x4f, 0x25, 0x0e, 0x22, 0xb9,
- 0x21, 0x1c, 0x44, 0x56, 0xa0, 0x82, 0x9f, 0x6a, 0xd0, 0x90, 0x75, 0x42, 0x98, 0xb8, 0x7a, 0x5e,
- 0x3a, 0x3a, 0xac, 0x5e, 0x74, 0x58, 0x99, 0x1d, 0x8a, 0x42, 0xbb, 0x17, 0x78, 0x0a, 0x8f, 0x3e,
- 0x4a, 0xf2, 0xfb, 0x06, 0x4c, 0x22, 0x70, 0xe9, 0x21, 0xed, 0x44, 0xc8, 0xac, 0x20, 0x2e, 0x69,
- 0xe2, 0x88, 0x9a, 0x46, 0x14, 0x78, 0x9d, 0x5d, 0x3c, 0x48, 0x0a, 0xeb, 0x3b, 0xac, 0x17, 0xfe,
- 0xf2, 0xb0, 0xfa, 0xce, 0x27, 0x89, 0xd2, 0x11, 0xac, 0x42, 0xb6, 0x91, 0xe7, 0x15, 0xa5, 0xf8,
- 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, 0x3f, 0x09, 0xe7, 0x96, 0x3a, 0xce, 0x4e, 0x8b, 0x2e, 0xf8,
- 0x9d, 0xc8, 0xeb, 0xf4, 0xfc, 0x5e, 0x58, 0x77, 0x9a, 0xfb, 0xbd, 0x6e, 0x28, 0x0e, 0x3b, 0xb1,
- 0xe5, 0xcd, 0xb8, 0xd0, 0xde, 0xe1, 0xa5, 0x0a, 0xcb, 0x41, 0x0c, 0xc8, 0x5d, 0x98, 0xe6, 0x45,
- 0xb5, 0x5e, 0xe4, 0x37, 0x9a, 0x4e, 0xcb, 0xeb, 0xec, 0xe2, 0x19, 0x68, 0xb1, 0x7e, 0x81, 0xed,
- 0x2d, 0x9d, 0x5e, 0xe4, 0xdb, 0x21, 0x87, 0x2b, 0xfc, 0xfa, 0x89, 0xc8, 0x32, 0x4c, 0x59, 0xd4,
- 0x71, 0xef, 0x3b, 0x8f, 0x17, 0x9c, 0xae, 0xd3, 0xf4, 0xa2, 0x03, 0xdc, 0x99, 0xe5, 0xeb, 0xd5,
- 0xa3, 0xc3, 0xea, 0x0b, 0x01, 0x75, 0x5c, 0xbb, 0xed, 0x3c, 0xb6, 0x9b, 0xa2, 0x50, 0x61, 0x96,
- 0xa6, 0x8b, 0x59, 0x79, 0x9d, 0x98, 0x55, 0x29, 0xcd, 0xca, 0xeb, 0x0c, 0x66, 0x95, 0xd0, 0x49,
- 0x56, 0x1b, 0x4e, 0xb0, 0x4b, 0x23, 0x7e, 0x48, 0x08, 0x97, 0x8c, 0x2b, 0x86, 0xc2, 0x2a, 0xc2,
- 0x32, 0x1b, 0x0f, 0x0c, 0xd3, 0xac, 0x14, 0x3a, 0x26, 0x79, 0xdb, 0x81, 0x17, 0x51, 0xb5, 0x85,
- 0xe3, 0x58, 0x2d, 0xec, 0x7f, 0x3c, 0x26, 0x1d, 0xd4, 0xc4, 0x3e, 0xca, 0x84, 0x9b, 0xd2, 0xc8,
- 0x72, 0x1f, 0xb7, 0xec, 0x56, 0xf6, 0x51, 0xc6, 0xdc, 0xd4, 0x76, 0x4e, 0x60, 0x3b, 0x15, 0x6e,
- 0x03, 0x1a, 0xda, 0x47, 0x49, 0x56, 0x59, 0xa7, 0x45, 0xb4, 0xc3, 0x24, 0x5a, 0x1c, 0x92, 0x4e,
- 0x62, 0xd5, 0x5e, 0x11, 0x7b, 0xea, 0x4a, 0x20, 0x8b, 0xed, 0x8c, 0x23, 0xd3, 0x34, 0xf1, 0x07,
- 0x85, 0xe2, 0x48, 0x65, 0xd4, 0xaa, 0x70, 0x91, 0x8f, 0x98, 0xe0, 0xa0, 0x2e, 0x36, 0x7f, 0x3b,
- 0x07, 0xe7, 0xa5, 0x3a, 0xa6, 0xd1, 0x23, 0x3f, 0xd8, 0xf7, 0x3a, 0xbb, 0xcf, 0xb9, 0x56, 0xbd,
- 0xad, 0x69, 0xd5, 0x57, 0x52, 0x2b, 0x5c, 0xaa, 0x95, 0xc7, 0xa8, 0xd6, 0xbf, 0x18, 0x81, 0x17,
- 0x8f, 0xa5, 0x22, 0x1f, 0xb2, 0x55, 0xd0, 0xa3, 0x9d, 0x68, 0xd9, 0x6d, 0x51, 0xb6, 0x0d, 0xf3,
- 0x7b, 0x91, 0x38, 0xcc, 0x7e, 0xf9, 0xe8, 0xb0, 0x7a, 0x9a, 0x07, 0x9a, 0xd8, 0x9e, 0xdb, 0xa2,
- 0x76, 0xc4, 0x8b, 0xb5, 0x61, 0xea, 0xa7, 0x66, 0x2c, 0xe3, 0xb0, 0xb7, 0xe5, 0x4e, 0x44, 0x83,
- 0x87, 0x0e, 0xf7, 0xb7, 0x17, 0x2c, 0xf7, 0x29, 0xed, 0xda, 0x0e, 0x2b, 0xb5, 0x3d, 0x51, 0xac,
- 0xb3, 0xec, 0xa3, 0x26, 0xb7, 0x15, 0x96, 0x0b, 0x6c, 0x73, 0x70, 0xdf, 0x79, 0x2c, 0x2c, 0x5e,
- 0x3c, 0x5f, 0x55, 0x58, 0x72, 0x1f, 0xbb, 0xb6, 0xf3, 0xd8, 0xea, 0x27, 0x21, 0x1f, 0xc1, 0x19,
- 0xa1, 0xb8, 0x99, 0x12, 0x0b, 0xfc, 0x96, 0x6c, 0x71, 0x01, 0x79, 0xbd, 0x76, 0x74, 0x58, 0x3d,
- 0x27, 0xd4, 0xbe, 0xdd, 0xe4, 0x18, 0x99, 0xad, 0xce, 0xe6, 0x42, 0x36, 0xd8, 0x42, 0x96, 0xea,
- 0x8e, 0xfb, 0x34, 0x0c, 0x9d, 0x5d, 0x69, 0x1d, 0xf3, 0x1b, 0x25, 0xa5, 0x33, 0xed, 0x36, 0x2f,
- 0xb7, 0x06, 0x52, 0x92, 0xbb, 0x30, 0xb9, 0x4d, 0x77, 0xd4, 0xf1, 0x19, 0x8d, 0xa7, 0x78, 0xe5,
- 0x11, 0xdd, 0x19, 0x3c, 0x38, 0x29, 0x3a, 0xe2, 0xc1, 0xf4, 0x7a, 0xe0, 0x3f, 0x3e, 0x60, 0x5b,
- 0x3d, 0xda, 0xa1, 0x01, 0x3a, 0x77, 0x8d, 0xe1, 0x71, 0xd5, 0x6c, 0x62, 0x59, 0xea, 0xe5, 0xf5,
- 0xcf, 0x1d, 0x1d, 0x56, 0x5f, 0xec, 0x32, 0xb0, 0xdd, 0x12, 0x70, 0x3b, 0x15, 0x75, 0xd6, 0xcf,
- 0x95, 0xfc, 0x34, 0x4c, 0x59, 0x7e, 0x2f, 0xf2, 0x3a, 0xbb, 0x8d, 0x28, 0x70, 0x22, 0xba, 0xcb,
- 0x15, 0x79, 0xe2, 0x45, 0x96, 0x2a, 0xe5, 0x07, 0xd3, 0x01, 0x07, 0xda, 0xa1, 0x80, 0x6a, 0x9a,
- 0x54, 0x27, 0x30, 0x7f, 0x33, 0x07, 0xb3, 0x62, 0x18, 0x2c, 0xda, 0xf4, 0x03, 0xf7, 0xf9, 0x9f,
- 0xf6, 0x4b, 0xda, 0xb4, 0x7f, 0x39, 0xf6, 0x51, 0xca, 0x6a, 0xe4, 0x31, 0xb3, 0xfe, 0x8f, 0x0c,
- 0xb8, 0x78, 0x1c, 0x11, 0xeb, 0x9d, 0xd8, 0xaf, 0xaf, 0xd4, 0xe7, 0xbf, 0xd7, 0x85, 0xd3, 0x38,
- 0x9e, 0x78, 0x70, 0x1c, 0xde, 0xf5, 0xc3, 0x08, 0x4f, 0xef, 0x72, 0x9a, 0x23, 0x41, 0xdd, 0xf7,
- 0x5b, 0xa8, 0xe7, 0xeb, 0xaf, 0x33, 0x75, 0xfe, 0x97, 0x87, 0x55, 0x60, 0x20, 0xee, 0x89, 0xc7,
- 0xd6, 0x7c, 0x2e, 0x31, 0x78, 0x2e, 0x1d, 0xda, 0xe8, 0xfd, 0xb1, 0x4f, 0x0f, 0x42, 0x2b, 0x8b,
- 0x35, 0x9e, 0xd0, 0xd4, 0x7a, 0xd1, 0xde, 0x7a, 0x40, 0x1f, 0xd0, 0x80, 0x76, 0x9a, 0xf4, 0x33,
- 0x76, 0x42, 0xa3, 0x37, 0x6e, 0xa8, 0xed, 0xc9, 0x5f, 0x8f, 0xc1, 0x4c, 0x16, 0x19, 0xeb, 0x17,
- 0xc5, 0x22, 0x4e, 0x87, 0x28, 0xff, 0x1d, 0x03, 0xca, 0x0d, 0xda, 0xf4, 0x3b, 0xee, 0x6d, 0xa7,
- 0x19, 0xf9, 0xd2, 0x25, 0xc3, 0xe6, 0x9a, 0x8d, 0xc1, 0xed, 0x07, 0x58, 0xa0, 0x9d, 0x0c, 0x7c,
- 0x65, 0x38, 0x43, 0xb4, 0xe9, 0xa3, 0x23, 0x6c, 0xc4, 0x64, 0x32, 0xf9, 0x04, 0xde, 0x6a, 0x68,
- 0x1f, 0x25, 0x75, 0x98, 0x58, 0xf0, 0x3b, 0x1d, 0xca, 0x7e, 0x28, 0x6e, 0x9d, 0xe8, 0x88, 0xd9,
- 0x94, 0x05, 0xe9, 0x13, 0x02, 0x9d, 0x84, 0xdc, 0x84, 0xfc, 0xe6, 0xfc, 0x6d, 0x31, 0x06, 0xd2,
- 0x59, 0x6d, 0x73, 0xfe, 0x36, 0xee, 0x75, 0x99, 0xfd, 0x30, 0xd1, 0x9b, 0x7f, 0xa0, 0x9e, 0x81,
- 0x6e, 0xce, 0xdf, 0x26, 0x6b, 0x30, 0x6d, 0xd1, 0x6f, 0xf6, 0xbc, 0x80, 0x8a, 0x09, 0x70, 0xff,
- 0x76, 0x0d, 0xc7, 0xa2, 0xc8, 0xf5, 0x58, 0xc0, 0x0b, 0xa5, 0x6d, 0x6f, 0xb7, 0x1f, 0xa8, 0x61,
- 0x79, 0xfd, 0xb4, 0xe4, 0xe7, 0xe1, 0xcc, 0xa2, 0x17, 0x8a, 0x3a, 0xf3, 0xc3, 0x47, 0x17, 0xef,
- 0x21, 0x47, 0x07, 0x4c, 0x87, 0x2f, 0x65, 0x4e, 0x87, 0xcf, 0xb9, 0x31, 0x13, 0x9b, 0x9f, 0x6c,
- 0xba, 0x69, 0x7f, 0xd8, 0xec, 0xef, 0x90, 0x8f, 0x61, 0x12, 0x4f, 0x7b, 0xf0, 0x3c, 0x16, 0x5d,
- 0xa4, 0xc7, 0x06, 0x7c, 0xf9, 0x0b, 0x99, 0x5f, 0xbe, 0x80, 0x87, 0x47, 0x36, 0x9e, 0xea, 0xa2,
- 0x3b, 0xb5, 0xb6, 0x47, 0xd0, 0x38, 0x93, 0x0f, 0x60, 0x4a, 0x2c, 0x3a, 0x6b, 0x0f, 0x36, 0xf6,
- 0xe8, 0xa2, 0x73, 0x20, 0x9c, 0x10, 0xd0, 0xfe, 0x13, 0x2b, 0x95, 0xed, 0x3f, 0xb0, 0xa3, 0x3d,
- 0x6a, 0xbb, 0x8e, 0xa6, 0x9e, 0x53, 0x84, 0xe4, 0x67, 0x61, 0x7c, 0xc5, 0xc7, 0x8b, 0x27, 0x54,
- 0x35, 0x25, 0xe4, 0xf3, 0x35, 0x0c, 0xcb, 0xe5, 0xe0, 0xd4, 0x22, 0xf2, 0xa3, 0xc3, 0xea, 0xdb,
- 0x4f, 0x2a, 0x85, 0xca, 0x07, 0x2c, 0xf5, 0x6b, 0x64, 0x01, 0x8a, 0xdb, 0x74, 0x87, 0xb5, 0x36,
- 0x1d, 0x52, 0x26, 0xc1, 0x5c, 0x5f, 0x3c, 0x12, 0xbf, 0xd4, 0x5b, 0x1d, 0x89, 0x41, 0x02, 0x98,
- 0xc6, 0xfe, 0x59, 0x77, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0x2d, 0x1a, 0xca, 0xeb, 0x91, 0xfe, 0xce,
- 0x9f, 0xcf, 0xec, 0xfc, 0x8b, 0xbc, 0xf3, 0xbb, 0x0a, 0x07, 0x55, 0xdc, 0xfa, 0xd8, 0x9b, 0xff,
- 0xc6, 0x40, 0xa9, 0x27, 0xd7, 0xd0, 0xf9, 0x2c, 0xf6, 0x6a, 0xc7, 0xdd, 0xac, 0xd3, 0xed, 0xea,
- 0x7e, 0xe9, 0x1c, 0x85, 0x6d, 0x7d, 0x6f, 0x3b, 0x4d, 0x1a, 0xc9, 0x33, 0x52, 0x44, 0x7e, 0x80,
- 0x10, 0x75, 0xeb, 0xcb, 0x71, 0xc8, 0x57, 0x61, 0x66, 0x91, 0x3e, 0xf4, 0x9a, 0xb4, 0x16, 0x45,
- 0x34, 0xe4, 0x3d, 0xbc, 0x50, 0xe3, 0x97, 0x89, 0xa5, 0xfa, 0x2b, 0x47, 0x87, 0xd5, 0x4b, 0x2e,
- 0x96, 0xdb, 0x4e, 0x82, 0x60, 0x37, 0x1d, 0x95, 0x57, 0x26, 0x07, 0xf3, 0x7f, 0x19, 0x49, 0xaf,
- 0x93, 0xd7, 0xa0, 0x60, 0xad, 0xc7, 0xf5, 0xe7, 0xf7, 0x84, 0xa9, 0xea, 0x23, 0x02, 0xf9, 0x3a,
- 0x9c, 0x51, 0xf8, 0x60, 0x8f, 0x50, 0x97, 0x55, 0x88, 0x37, 0xe6, 0x55, 0xbc, 0x18, 0x52, 0x6a,
- 0xe2, 0x70, 0x8c, 0x54, 0x8d, 0xb2, 0x79, 0xb0, 0xc6, 0x2a, 0x05, 0x8b, 0xb4, 0xe3, 0x71, 0xde,
- 0x4a, 0x63, 0x55, 0xde, 0x2e, 0x22, 0xa4, 0x1b, 0x9b, 0xc5, 0xe1, 0x83, 0x42, 0xb1, 0x50, 0x19,
- 0x31, 0xff, 0xc6, 0x50, 0x72, 0x2a, 0x3c, 0xa7, 0x2b, 0xd6, 0x2d, 0x6d, 0xc5, 0x9a, 0x11, 0xa4,
- 0x71, 0xab, 0x58, 0x59, 0xa6, 0x95, 0x31, 0x05, 0x13, 0x1a, 0x12, 0xba, 0xd9, 0x6e, 0x86, 0x34,
- 0xe0, 0x67, 0x92, 0x9f, 0x2d, 0x37, 0xdb, 0xb8, 0x5d, 0x43, 0x79, 0x4f, 0xfe, 0x95, 0x01, 0x53,
- 0x29, 0x0a, 0xd6, 0x1b, 0x0c, 0xa4, 0xf6, 0x46, 0x2f, 0xa4, 0x81, 0x85, 0x50, 0xee, 0x94, 0xb7,
- 0xa2, 0x3b, 0xe5, 0xb5, 0x2c, 0x06, 0x23, 0x5f, 0x81, 0x91, 0x4d, 0xdc, 0x41, 0xe8, 0x7e, 0x1d,
- 0x31, 0x7f, 0x2c, 0xe4, 0x33, 0xac, 0xc7, 0xfe, 0x55, 0x15, 0x04, 0x96, 0x91, 0x06, 0x8c, 0x2d,
- 0x04, 0x14, 0xb3, 0x27, 0x14, 0x86, 0xbf, 0x80, 0x6b, 0x72, 0x92, 0xf4, 0x05, 0x9c, 0xe0, 0x64,
- 0xfe, 0x46, 0x0e, 0x48, 0xd2, 0x46, 0xda, 0x0c, 0x68, 0x14, 0x3e, 0xb7, 0x83, 0xfe, 0xbe, 0x36,
- 0xe8, 0x2f, 0xf6, 0x0d, 0x3a, 0x6f, 0xde, 0x50, 0x63, 0xff, 0x27, 0x06, 0x9c, 0xcd, 0x26, 0x24,
- 0x2f, 0xc3, 0xe8, 0xda, 0xc6, 0xba, 0x74, 0x0d, 0x12, 0x4d, 0xf1, 0xbb, 0x68, 0x19, 0x5b, 0xa2,
- 0x88, 0xbc, 0x01, 0xa3, 0x1f, 0x5a, 0x0b, 0x6c, 0xc9, 0x54, 0xa2, 0x67, 0xbe, 0x19, 0xd8, 0x4d,
- 0x7d, 0xcb, 0x25, 0x90, 0xd4, 0xb1, 0xcd, 0x3f, 0xb3, 0xb1, 0xfd, 0x76, 0x0e, 0xa6, 0x6a, 0xcd,
- 0x26, 0x0d, 0x43, 0x66, 0x10, 0xd1, 0x30, 0x7a, 0x6e, 0x07, 0x36, 0xdb, 0xe9, 0x47, 0x6b, 0xdb,
- 0x50, 0xa3, 0xfa, 0xa7, 0x06, 0x9c, 0x91, 0x54, 0x0f, 0x3d, 0xfa, 0x68, 0x63, 0x2f, 0xa0, 0xe1,
- 0x9e, 0xdf, 0x72, 0x87, 0x8d, 0x03, 0xc3, 0x55, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x0f, 0xa8, 0x1f,
- 0x20, 0x44, 0x5b, 0xa5, 0x11, 0x42, 0xe6, 0x60, 0xac, 0xd6, 0xed, 0x06, 0xfe, 0x43, 0x3e, 0xed,
- 0x27, 0xc4, 0x7d, 0x24, 0x07, 0x69, 0xf7, 0x97, 0x1c, 0xc4, 0xaa, 0xb1, 0x48, 0x3b, 0xdc, 0xa3,
- 0x79, 0x82, 0x57, 0xc3, 0xa5, 0x1d, 0xd5, 0x42, 0xc3, 0x72, 0xf3, 0x5b, 0x05, 0x28, 0xab, 0x0d,
- 0x21, 0x26, 0x8c, 0x72, 0xf7, 0x14, 0xd5, 0x4d, 0xc0, 0x41, 0x88, 0x25, 0x4a, 0x12, 0xaf, 0x9f,
- 0xdc, 0x89, 0x5e, 0x3f, 0xdb, 0x30, 0xb1, 0x1e, 0xf8, 0x5d, 0x3f, 0xa4, 0x2e, 0x4f, 0x80, 0xc3,
- 0xb5, 0xd6, 0xe9, 0xd8, 0x15, 0x96, 0xf7, 0x39, 0x2b, 0xe2, 0xdb, 0x81, 0xae, 0xc0, 0xb6, 0xd3,
- 0xe9, 0x71, 0x74, 0x3e, 0xfc, 0x80, 0xdf, 0x09, 0x45, 0xb8, 0x40, 0x7c, 0xc0, 0xcf, 0x20, 0xfa,
- 0x01, 0x3f, 0x83, 0xa8, 0xd3, 0x62, 0xe4, 0x59, 0x4d, 0x0b, 0xf2, 0x1b, 0x06, 0x8c, 0xd7, 0x3a,
- 0x1d, 0xe1, 0xf5, 0x23, 0xa3, 0xc8, 0xcf, 0x24, 0x87, 0xfc, 0xdc, 0x2d, 0x94, 0x9f, 0xf1, 0x7f,
- 0x43, 0x9c, 0xf1, 0xbf, 0xfd, 0x89, 0xce, 0xf8, 0x37, 0x02, 0xc7, 0x8b, 0x42, 0xbc, 0xcc, 0x4d,
- 0x3e, 0xa8, 0xba, 0xfe, 0x2a, 0xf5, 0x20, 0x6f, 0x43, 0x25, 0x96, 0xc7, 0xe5, 0x8e, 0x4b, 0x1f,
- 0x53, 0xee, 0x24, 0x35, 0xc1, 0x23, 0x0c, 0xb5, 0xcb, 0x8b, 0x34, 0xa2, 0xf9, 0x6d, 0x03, 0xce,
- 0xaa, 0x02, 0xd1, 0xe8, 0xed, 0xb4, 0x3d, 0xdc, 0xfe, 0x90, 0xeb, 0x50, 0x12, 0xe3, 0x15, 0x1b,
- 0x72, 0xfd, 0x59, 0x93, 0x12, 0x14, 0xb2, 0xc4, 0x86, 0x88, 0xf1, 0x10, 0x67, 0x05, 0xa7, 0x53,
- 0xd3, 0x8d, 0x15, 0xd5, 0x67, 0x45, 0x67, 0x57, 0x02, 0xfc, 0xad, 0x8f, 0x1d, 0x83, 0x98, 0xef,
- 0xc1, 0xb4, 0x5e, 0xcb, 0x06, 0xc5, 0x10, 0x34, 0xd9, 0x34, 0x23, 0xbb, 0x69, 0xb2, 0xdc, 0xdc,
- 0x06, 0xd2, 0x47, 0x1f, 0xe2, 0x45, 0x15, 0x8d, 0xe4, 0x45, 0xaa, 0x3c, 0xee, 0xea, 0x43, 0x8c,
- 0xf3, 0x87, 0x8d, 0xab, 0xdd, 0x8d, 0xa4, 0xe6, 0x9f, 0x01, 0x9c, 0xce, 0x50, 0x1d, 0x27, 0x2c,
- 0xed, 0x55, 0x7d, 0xf2, 0x94, 0x62, 0x8f, 0x00, 0x39, 0x65, 0xde, 0x93, 0xb9, 0xa2, 0x8e, 0x99,
- 0x2a, 0xc7, 0x25, 0x90, 0xfa, 0x34, 0x96, 0x77, 0xd5, 0x69, 0x67, 0xe4, 0x99, 0x39, 0xed, 0xd4,
- 0x61, 0x42, 0xb4, 0x4a, 0x4c, 0xe5, 0xd1, 0xe4, 0x58, 0x20, 0xe0, 0x05, 0x76, 0xdf, 0x94, 0xd6,
- 0x49, 0x38, 0x8f, 0xd0, 0x6f, 0x3d, 0xa4, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x0b, 0x32, 0x79, 0x28,
- 0x24, 0xe4, 0x9f, 0x19, 0x40, 0x04, 0x44, 0x9d, 0xcf, 0xc5, 0xe3, 0xe6, 0xb3, 0xfb, 0x6c, 0xe6,
- 0xf3, 0x8b, 0xb2, 0x8e, 0xd9, 0xf3, 0x3a, 0xa3, 0x5a, 0xe4, 0x9f, 0x18, 0x30, 0xcd, 0x3d, 0x47,
- 0xd4, 0xca, 0x96, 0x8e, 0xab, 0x6c, 0xf3, 0xd9, 0x54, 0xf6, 0x62, 0x88, 0x9f, 0x1d, 0x50, 0xd7,
- 0xfe, 0x4a, 0x91, 0x9f, 0x04, 0x88, 0x67, 0x94, 0xf4, 0x50, 0xbc, 0x98, 0xa1, 0x05, 0x62, 0xa4,
- 0x24, 0xc8, 0x32, 0x8a, 0xe9, 0x54, 0x9f, 0x9e, 0x84, 0x1b, 0xf9, 0x79, 0x98, 0x61, 0xf3, 0x25,
- 0x86, 0x08, 0x3f, 0xb7, 0xd9, 0x71, 0xfc, 0xca, 0x17, 0x07, 0x2f, 0xed, 0xd7, 0xb3, 0xc8, 0x78,
- 0x9c, 0x48, 0x12, 0xc6, 0x1f, 0xb5, 0xd5, 0x2d, 0x5f, 0x16, 0x05, 0x3a, 0xb4, 0x62, 0xed, 0xc3,
- 0xd9, 0x32, 0x7e, 0x33, 0x53, 0xbf, 0x9d, 0x97, 0x73, 0x81, 0xeb, 0xb7, 0x50, 0x0f, 0xf4, 0x40,
- 0x10, 0xf9, 0x10, 0x48, 0xa3, 0xb7, 0xbb, 0x4b, 0xc3, 0x88, 0xba, 0x1c, 0x46, 0x83, 0x70, 0x76,
- 0x02, 0xf5, 0x03, 0x1e, 0x53, 0x85, 0xb2, 0xd4, 0x0e, 0x64, 0xb1, 0x2a, 0x24, 0xfd, 0xc4, 0x64,
- 0x15, 0x66, 0x44, 0xa3, 0x19, 0x54, 0x46, 0xd6, 0x87, 0xb3, 0x93, 0xc8, 0x14, 0x6f, 0x61, 0x95,
- 0x38, 0x7c, 0x6d, 0x7f, 0x9b, 0x45, 0x77, 0x61, 0x07, 0xce, 0x0f, 0xec, 0xb6, 0x8c, 0xa0, 0x90,
- 0x39, 0x3d, 0x28, 0xe4, 0xfc, 0x20, 0xf5, 0x1a, 0xaa, 0x81, 0x21, 0xbf, 0x6b, 0xa4, 0xf4, 0xa9,
- 0x30, 0x7e, 0x78, 0x9a, 0xbe, 0x41, 0x0b, 0x4e, 0x0e, 0x13, 0x06, 0x70, 0x8d, 0x9b, 0x4b, 0x8c,
- 0x2e, 0xa6, 0x71, 0x55, 0x8d, 0x8d, 0xba, 0xf7, 0x29, 0x55, 0xab, 0xf9, 0x2f, 0x0d, 0x20, 0xbc,
- 0x86, 0x0b, 0x4e, 0xd7, 0xd9, 0xf1, 0x5a, 0x5e, 0xe4, 0xd1, 0x90, 0xdc, 0x83, 0x8a, 0x60, 0xe1,
- 0xec, 0xb4, 0xa8, 0xea, 0xef, 0x25, 0x2e, 0x84, 0xe3, 0x32, 0x3b, 0x6d, 0x26, 0xf5, 0x11, 0x0e,
- 0x10, 0x86, 0xdc, 0x53, 0x08, 0x83, 0xf9, 0x43, 0x03, 0xce, 0xf7, 0x57, 0x5b, 0x7c, 0x39, 0xee,
- 0x3c, 0xe3, 0x84, 0xce, 0xcb, 0x6a, 0x65, 0x0e, 0x8f, 0x52, 0x9f, 0x59, 0x2b, 0xf3, 0xc9, 0xc9,
- 0xec, 0x93, 0xb7, 0xf2, 0x97, 0x73, 0x50, 0x5e, 0x6f, 0xf5, 0x76, 0xbd, 0xce, 0xa2, 0x13, 0x39,
- 0xcf, 0xed, 0x16, 0xe5, 0x2d, 0x6d, 0x8b, 0x12, 0x7b, 0x78, 0xc5, 0x0d, 0x1b, 0x2e, 0x65, 0x9a,
- 0x01, 0x53, 0x09, 0x09, 0x9f, 0xa5, 0x77, 0xa1, 0xc0, 0x7e, 0x08, 0x8b, 0xe7, 0x52, 0x1f, 0x63,
- 0xc4, 0xba, 0x1e, 0xff, 0x27, 0x36, 0x0d, 0x7a, 0xa2, 0x3a, 0xe4, 0x70, 0xe1, 0x4b, 0x3c, 0xcf,
- 0xd4, 0x93, 0xe7, 0xc4, 0xfc, 0x17, 0x06, 0x54, 0xd2, 0x2d, 0x21, 0xf7, 0x60, 0x8c, 0x71, 0xf2,
- 0xe2, 0x9c, 0x55, 0xaf, 0x0c, 0x68, 0xf3, 0x75, 0x81, 0xc6, 0xab, 0x87, 0x9d, 0x4f, 0x39, 0xc4,
- 0x92, 0x1c, 0x2e, 0x58, 0x50, 0x56, 0xb1, 0x32, 0x6a, 0xf7, 0xba, 0xae, 0x9a, 0xce, 0x66, 0xf7,
- 0x83, 0x5a, 0xeb, 0xdf, 0xd1, 0x6a, 0x2d, 0x94, 0xd2, 0xb0, 0xc9, 0x07, 0x31, 0xc4, 0x8d, 0xeb,
- 0x51, 0x55, 0xce, 0xa4, 0xf2, 0xd5, 0x43, 0xdc, 0x38, 0x8c, 0xed, 0x6d, 0xf8, 0xf7, 0x84, 0x9c,
- 0xe1, 0xde, 0xa6, 0x8b, 0x10, 0xd5, 0x3e, 0xe6, 0x38, 0xe6, 0x3f, 0xc8, 0xc3, 0xd9, 0xa4, 0x7a,
- 0x3c, 0x15, 0xe3, 0xba, 0x13, 0x38, 0xed, 0xf0, 0x84, 0x19, 0x70, 0xa5, 0xaf, 0x6a, 0x18, 0xc2,
- 0x2d, 0xab, 0xa6, 0x54, 0xc8, 0x4c, 0x55, 0x08, 0x37, 0x85, 0xbc, 0x42, 0xb2, 0x1a, 0xe4, 0x1e,
- 0xe4, 0x1b, 0x34, 0x12, 0x81, 0x9e, 0x97, 0xfb, 0x7a, 0x55, 0xad, 0xd7, 0xf5, 0x06, 0x8d, 0xf8,
- 0x20, 0x72, 0x5f, 0x79, 0xaa, 0xf9, 0xae, 0x33, 0xf3, 0x7e, 0x1b, 0x46, 0x97, 0x1e, 0x77, 0x69,
- 0x33, 0x12, 0xf1, 0x9d, 0x57, 0x8f, 0xe7, 0xc7, 0x71, 0x95, 0x28, 0x52, 0x8a, 0x00, 0xb5, 0xb3,
- 0x38, 0xca, 0x85, 0x5b, 0x50, 0x94, 0x1f, 0x7f, 0xa2, 0x68, 0xc8, 0xb7, 0x60, 0x5c, 0xf9, 0xc8,
- 0x13, 0x09, 0xfd, 0xdf, 0x1a, 0x30, 0xca, 0x94, 0xde, 0xd6, 0x9b, 0xcf, 0xa9, 0x46, 0xba, 0xa9,
- 0x69, 0xa4, 0x69, 0x25, 0x6c, 0x07, 0xe7, 0xe5, 0x9b, 0x27, 0xe8, 0xa2, 0x43, 0x03, 0x20, 0x41,
- 0x26, 0x77, 0x60, 0x4c, 0xe4, 0x67, 0x11, 0x79, 0x4e, 0xd5, 0x38, 0x20, 0x99, 0x07, 0x2a, 0xb6,
- 0x9a, 0xfc, 0x6e, 0xda, 0xcc, 0x94, 0xd4, 0x64, 0x31, 0xf1, 0x95, 0x56, 0x03, 0x4f, 0x19, 0x9b,
- 0x05, 0xbf, 0xc3, 0xe3, 0x42, 0x94, 0x8c, 0x52, 0x03, 0x9c, 0xa6, 0x6b, 0xe2, 0xa0, 0x24, 0x7f,
- 0x1c, 0x93, 0xb3, 0x82, 0x49, 0xf6, 0x19, 0xca, 0xff, 0x1e, 0xe7, 0x91, 0x16, 0xb2, 0x62, 0xef,
- 0x42, 0xf9, 0xb6, 0x1f, 0x3c, 0x72, 0x02, 0xb7, 0xb6, 0x4b, 0x85, 0x97, 0x7b, 0x11, 0x5d, 0xd5,
- 0x27, 0x1e, 0x70, 0xb8, 0xed, 0xb0, 0x82, 0x1f, 0x1d, 0x56, 0x0b, 0x75, 0xdf, 0x6f, 0x59, 0x1a,
- 0x3a, 0x59, 0x83, 0x89, 0xfb, 0xce, 0x63, 0x71, 0xe7, 0xb8, 0xb1, 0xb1, 0x22, 0x7c, 0x65, 0xae,
- 0x1e, 0x1d, 0x56, 0xcf, 0xb7, 0x9d, 0xc7, 0xf1, 0x5d, 0xe5, 0x60, 0x77, 0x6e, 0x9d, 0x9e, 0x78,
- 0x30, 0xb9, 0xee, 0x07, 0x91, 0xf8, 0x08, 0xb3, 0x91, 0xf3, 0x03, 0x6e, 0xad, 0xe6, 0x32, 0x6f,
- 0xad, 0xce, 0xb3, 0x8d, 0x81, 0xfd, 0x20, 0x26, 0xd7, 0xc2, 0x03, 0x35, 0xc6, 0xe4, 0x5d, 0x98,
- 0x5e, 0xa0, 0x41, 0xe4, 0x3d, 0xf0, 0x9a, 0x4e, 0x44, 0x6f, 0xfb, 0x41, 0xdb, 0x89, 0xc4, 0x01,
- 0x0d, 0x6e, 0xd0, 0x9b, 0x94, 0x73, 0x6a, 0x3b, 0x91, 0xd5, 0x8f, 0x49, 0xbe, 0x9e, 0xe5, 0x7d,
- 0x34, 0x82, 0xcd, 0x7f, 0x83, 0x19, 0x05, 0x19, 0xde, 0x47, 0x03, 0xba, 0x20, 0xc3, 0x0f, 0x69,
- 0xf7, 0xb8, 0xab, 0xdb, 0x62, 0xfd, 0x86, 0xb8, 0x46, 0x3e, 0xf9, 0x6a, 0x36, 0x1e, 0xb7, 0x01,
- 0x57, 0xb4, 0xf3, 0x90, 0xaf, 0xaf, 0xdf, 0xc6, 0x23, 0x17, 0x71, 0x55, 0x4a, 0x3b, 0x7b, 0x4e,
- 0xa7, 0x89, 0xb6, 0x8c, 0xf0, 0xbf, 0x50, 0x15, 0x5e, 0x7d, 0xfd, 0x36, 0x71, 0xe0, 0xf4, 0x3a,
- 0x0d, 0xda, 0x5e, 0xf4, 0xd5, 0x1b, 0x37, 0x94, 0x81, 0x2a, 0x62, 0xd5, 0xe6, 0x44, 0xd5, 0xaa,
- 0x5d, 0x44, 0xb1, 0x1f, 0xdf, 0xb8, 0x91, 0x39, 0x1c, 0x71, 0xc5, 0xb2, 0x78, 0x91, 0x25, 0x98,
- 0xbc, 0xef, 0x3c, 0x16, 0x97, 0xea, 0xf1, 0x9e, 0x31, 0x8f, 0xde, 0xfd, 0x28, 0x58, 0xcd, 0xa4,
- 0x48, 0x1d, 0x62, 0x9d, 0x88, 0xbc, 0x03, 0xe3, 0x89, 0x78, 0x85, 0x78, 0x9d, 0x9a, 0xe7, 0x1b,
- 0x0a, 0x45, 0x38, 0xb5, 0xb3, 0x29, 0x05, 0x9d, 0x6c, 0xc6, 0x5b, 0x7e, 0x6e, 0x90, 0xe2, 0x05,
- 0x6a, 0xa9, 0x3e, 0xa7, 0x6e, 0xf9, 0x1d, 0x2c, 0xd1, 0x9a, 0x35, 0x15, 0x9b, 0xe8, 0xdc, 0xdb,
- 0xc7, 0xd2, 0xb9, 0x28, 0x27, 0x09, 0xeb, 0x81, 0xdf, 0xee, 0x46, 0xe8, 0xf5, 0x98, 0x3a, 0x49,
- 0xe8, 0x62, 0x49, 0xc6, 0x49, 0x02, 0x27, 0xc9, 0xf6, 0x15, 0x98, 0x78, 0x0a, 0x5f, 0x01, 0x0a,
- 0x85, 0x15, 0xbf, 0xb9, 0x8f, 0x6e, 0x8e, 0xa5, 0xfa, 0x87, 0x4c, 0x7f, 0xb4, 0xfc, 0xe6, 0xfe,
- 0xb3, 0xbb, 0xe3, 0x46, 0xf6, 0x64, 0x95, 0xb5, 0x9d, 0x89, 0x95, 0xf8, 0xf4, 0xec, 0x94, 0x76,
- 0x73, 0xa7, 0x95, 0x71, 0x43, 0x85, 0x4b, 0xa1, 0x6c, 0x88, 0xa5, 0x93, 0x13, 0x0a, 0x95, 0x45,
- 0x1a, 0xee, 0x47, 0x7e, 0x77, 0xa1, 0xe5, 0x75, 0x77, 0x7c, 0x27, 0x70, 0x67, 0x2b, 0x03, 0x14,
- 0xc6, 0x6b, 0x99, 0x0a, 0x63, 0xda, 0xe5, 0xf4, 0x76, 0x53, 0x32, 0xb0, 0xfa, 0x58, 0x92, 0xaf,
- 0xc3, 0x24, 0x9b, 0x2d, 0x4b, 0x8f, 0x23, 0xda, 0xe1, 0xa2, 0x34, 0x8d, 0x4b, 0xfd, 0x8c, 0x12,
- 0x28, 0x19, 0x17, 0x72, 0x21, 0x45, 0xed, 0x41, 0x63, 0x02, 0x55, 0x48, 0x75, 0x56, 0xc4, 0x85,
- 0xd9, 0xfb, 0xce, 0x63, 0x25, 0xad, 0x90, 0x22, 0xf5, 0x04, 0x25, 0xf6, 0xca, 0xd1, 0x61, 0xf5,
- 0x15, 0x26, 0xb1, 0xfb, 0x31, 0xd2, 0x80, 0x09, 0x30, 0x90, 0x93, 0xf9, 0x93, 0xa9, 0x9e, 0x27,
- 0xcb, 0x30, 0x26, 0xda, 0x29, 0xd6, 0xb6, 0xfe, 0x1e, 0x7b, 0x31, 0xb3, 0xc7, 0xc6, 0x44, 0x8f,
- 0x59, 0x92, 0xde, 0xfc, 0x77, 0x06, 0x4c, 0x68, 0x8d, 0x22, 0xb7, 0x14, 0x47, 0x9f, 0xc4, 0x41,
- 0x4f, 0xc3, 0xc9, 0x7c, 0xa5, 0xe0, 0x96, 0xf0, 0xee, 0xca, 0x0d, 0xa6, 0xcb, 0xcc, 0xdb, 0x26,
- 0xd3, 0x23, 0xe4, 0x8f, 0x4f, 0x8f, 0x50, 0x18, 0x90, 0x1e, 0xe1, 0xd7, 0x26, 0x60, 0x52, 0x5f,
- 0x46, 0x99, 0x5d, 0xbb, 0xe2, 0xef, 0x7a, 0x1d, 0xb9, 0x3b, 0xe6, 0x09, 0x3f, 0x10, 0xa2, 0xa5,
- 0xfc, 0x47, 0x08, 0x79, 0x15, 0x20, 0xbe, 0x50, 0x96, 0x1b, 0x60, 0xf1, 0x40, 0x81, 0x52, 0x40,
- 0x7e, 0x0a, 0x60, 0xd5, 0x77, 0x69, 0x9c, 0x33, 0xe6, 0x98, 0x63, 0xb0, 0xd7, 0xc4, 0x31, 0x98,
- 0x78, 0x54, 0xe0, 0xe8, 0xb0, 0x7a, 0xa6, 0xe3, 0xbb, 0xb4, 0x3f, 0x59, 0x8c, 0xc2, 0x91, 0x7c,
- 0x19, 0x46, 0xac, 0x5e, 0x8b, 0xca, 0x14, 0x26, 0xe3, 0x72, 0x5a, 0xf5, 0x5a, 0x4a, 0xb2, 0xd1,
- 0xa0, 0x97, 0xbe, 0xfd, 0x60, 0x00, 0xf2, 0x3e, 0x00, 0x93, 0x9c, 0x3b, 0x81, 0xdf, 0xeb, 0xca,
- 0x18, 0x69, 0xdc, 0x2c, 0x2b, 0x42, 0xb7, 0x8b, 0x85, 0xea, 0xc7, 0x13, 0x12, 0xb2, 0x06, 0x63,
- 0x42, 0x49, 0x89, 0xdb, 0x85, 0x97, 0xb2, 0xce, 0xb5, 0x14, 0x4b, 0x45, 0xe4, 0x14, 0x41, 0xb0,
- 0x7e, 0xd4, 0xc4, 0x37, 0xfb, 0xef, 0x40, 0x89, 0xb1, 0x67, 0x1b, 0xfa, 0x50, 0xac, 0x50, 0xe8,
- 0x69, 0xa9, 0x54, 0x88, 0x6d, 0xfe, 0xb5, 0xcc, 0x66, 0x31, 0x01, 0xf9, 0x3a, 0x66, 0x01, 0x12,
- 0x5d, 0x7d, 0xec, 0xf1, 0xe8, 0xe5, 0xbe, 0xae, 0x9e, 0x71, 0xba, 0xdd, 0x8c, 0xb4, 0x69, 0x31,
- 0x3f, 0xb2, 0x1b, 0x47, 0x23, 0xc5, 0x19, 0xa7, 0x8f, 0xf9, 0xc0, 0xb5, 0xbe, 0x0f, 0xcc, 0xca,
- 0x00, 0x9b, 0xfe, 0xdc, 0x3f, 0x1a, 0x5f, 0xd2, 0x85, 0x4a, 0x32, 0x9f, 0xc5, 0xb7, 0xe0, 0xb8,
- 0x6f, 0xbd, 0xd1, 0xf7, 0x2d, 0x75, 0x00, 0xfb, 0x3e, 0xd7, 0xc7, 0x9d, 0xb8, 0x49, 0x76, 0x60,
- 0xf1, 0xbd, 0xf1, 0xe3, 0xbe, 0xf7, 0x6a, 0xdf, 0xf7, 0x4e, 0xbb, 0x3b, 0xfd, 0xdf, 0x49, 0xf1,
- 0x24, 0xef, 0xc0, 0x84, 0x84, 0xe0, 0xfc, 0xc0, 0x63, 0x49, 0xb1, 0x8b, 0x70, 0x77, 0xd0, 0xbd,
- 0x4e, 0x4f, 0x7c, 0xa3, 0x22, 0xab, 0xd4, 0x5c, 0x3a, 0x26, 0x34, 0xea, 0xb4, 0x54, 0xe8, 0xc8,
- 0xe4, 0x6b, 0x30, 0xbe, 0xdc, 0x66, 0x0d, 0xf1, 0x3b, 0x4e, 0x44, 0x71, 0xc9, 0x4b, 0x8e, 0x7a,
- 0x95, 0x12, 0x45, 0x54, 0x79, 0x86, 0xcd, 0xa4, 0x48, 0x35, 0x19, 0x14, 0x0a, 0xd6, 0x79, 0xfc,
- 0x90, 0x47, 0xc8, 0x70, 0x28, 0x16, 0xb8, 0x17, 0x33, 0x8e, 0x5b, 0x15, 0xf6, 0xb8, 0x62, 0xf0,
- 0xb3, 0x23, 0x5b, 0x4c, 0x08, 0xad, 0xf3, 0x74, 0x9e, 0xe4, 0x5d, 0x18, 0x17, 0xb1, 0x9f, 0x35,
- 0x6b, 0x35, 0x9c, 0xad, 0x60, 0xe3, 0x31, 0x6b, 0x9d, 0x0c, 0x13, 0xb5, 0x9d, 0x20, 0x75, 0xe7,
- 0x96, 0xe0, 0x93, 0xaf, 0xc2, 0xcc, 0xb6, 0xd7, 0x71, 0xfd, 0x47, 0xa1, 0x50, 0xe0, 0x42, 0xd1,
- 0x4d, 0x27, 0x9e, 0x45, 0x8f, 0x78, 0xb9, 0x2d, 0x17, 0xc7, 0x3e, 0xc5, 0x97, 0xc9, 0x81, 0xfc,
- 0x5c, 0x1f, 0x67, 0x2e, 0x41, 0xe4, 0x38, 0x09, 0x9a, 0xef, 0x93, 0xa0, 0xfe, 0xcf, 0xa7, 0xc5,
- 0x29, 0xf3, 0x33, 0xc4, 0x07, 0xa2, 0x5b, 0x36, 0x1f, 0xf8, 0x5e, 0x67, 0xf6, 0xb4, 0xf6, 0x9e,
- 0x4b, 0xec, 0x5c, 0x8c, 0x78, 0xeb, 0x7e, 0xcb, 0x6b, 0x1e, 0xd4, 0xcd, 0xa3, 0xc3, 0xea, 0x4b,
- 0x69, 0x9b, 0xe9, 0x63, 0x5f, 0x3b, 0xc2, 0xc8, 0x60, 0x4d, 0xbe, 0x06, 0x65, 0xf6, 0x37, 0x36,
- 0x30, 0x67, 0xb4, 0x0b, 0x3a, 0x05, 0x53, 0x7c, 0x07, 0xc7, 0x08, 0x83, 0x53, 0x33, 0x6c, 0x4f,
- 0x8d, 0x95, 0xf9, 0x43, 0x03, 0x66, 0xb2, 0xea, 0x7a, 0x42, 0x26, 0x20, 0x33, 0x75, 0x55, 0x8f,
- 0xa7, 0x1f, 0xfc, 0xaa, 0x3e, 0xbe, 0xa0, 0xaf, 0xc2, 0x08, 0xdb, 0x91, 0x4b, 0x57, 0x32, 0x5c,
- 0x0e, 0xd9, 0xae, 0x3d, 0xb4, 0x38, 0x9c, 0x21, 0x60, 0xd8, 0x01, 0xae, 0x97, 0x23, 0x1c, 0x01,
- 0x63, 0x13, 0x2c, 0x0e, 0x67, 0x08, 0x6c, 0xd9, 0x95, 0xcb, 0x04, 0x22, 0xb0, 0xd5, 0x38, 0xb4,
- 0x38, 0x9c, 0x5c, 0x86, 0xb1, 0xb5, 0xce, 0x0a, 0x75, 0x1e, 0x52, 0x71, 0x4f, 0x86, 0xa7, 0x35,
- 0x7e, 0xc7, 0x6e, 0x31, 0x98, 0x25, 0x0b, 0xcd, 0xef, 0x1a, 0x30, 0xdd, 0xd7, 0x4d, 0x27, 0x27,
- 0x3b, 0x3a, 0xfe, 0x52, 0x72, 0x98, 0xf6, 0xf1, 0xea, 0x17, 0xb2, 0xab, 0x6f, 0xfe, 0x51, 0x01,
- 0xce, 0x0d, 0x58, 0xb5, 0x12, 0x87, 0x02, 0xe3, 0x44, 0x87, 0x82, 0x6f, 0xb0, 0x55, 0xc2, 0xf1,
- 0xda, 0xe1, 0x86, 0x9f, 0xd4, 0x38, 0xb9, 0x7b, 0xc1, 0x32, 0x99, 0x4d, 0x44, 0x66, 0xbe, 0x38,
- 0xdf, 0x44, 0x0a, 0x3b, 0xf2, 0xfb, 0x4e, 0xa6, 0x75, 0x66, 0x7d, 0x57, 0xfa, 0xf9, 0x1f, 0x93,
- 0x2b, 0x7d, 0xfd, 0x22, 0xad, 0xf0, 0x4c, 0x2f, 0xd2, 0xb2, 0x8f, 0xe2, 0x47, 0x9e, 0xe6, 0xf6,
- 0x69, 0x01, 0x26, 0x1a, 0xd4, 0x09, 0x9a, 0x7b, 0xb5, 0x90, 0x0f, 0xd2, 0x28, 0x72, 0x43, 0x95,
- 0x1c, 0x62, 0x81, 0xed, 0x84, 0xfd, 0x63, 0xa1, 0xd1, 0x98, 0xff, 0x21, 0xe5, 0x89, 0xf0, 0xe3,
- 0x28, 0x2f, 0x57, 0x61, 0x64, 0x7b, 0x8f, 0x06, 0xd2, 0x48, 0xc6, 0x8a, 0x3c, 0x62, 0x00, 0xb5,
- 0x22, 0x88, 0x61, 0xfe, 0x2c, 0x94, 0xd5, 0x8f, 0xa1, 0x42, 0x60, 0xbf, 0xc5, 0x8c, 0xe4, 0x0a,
- 0x81, 0x01, 0x2c, 0x0e, 0x3f, 0x31, 0x01, 0x59, 0xd2, 0x0b, 0xf9, 0x93, 0x7a, 0xc1, 0xfc, 0xf7,
- 0x06, 0x14, 0x30, 0xff, 0xc2, 0x9b, 0x50, 0x92, 0xa7, 0xba, 0x6a, 0x4e, 0x82, 0xd3, 0xf2, 0xd0,
- 0x37, 0xd4, 0x5d, 0x39, 0x04, 0x90, 0x7d, 0x6a, 0x8b, 0x06, 0x3b, 0x9a, 0xc7, 0xcf, 0x43, 0x06,
- 0x50, 0x3f, 0x85, 0x18, 0x4f, 0xd0, 0x25, 0xe8, 0xd5, 0x24, 0x36, 0x65, 0x5c, 0x6b, 0x70, 0xaf,
- 0xa6, 0xbe, 0x1d, 0x98, 0xc4, 0x32, 0x7f, 0xcb, 0x80, 0x33, 0x99, 0xc6, 0x04, 0xfb, 0x2a, 0xb7,
- 0x5a, 0x14, 0x89, 0x48, 0x9b, 0x2c, 0x1c, 0xe3, 0x49, 0xbc, 0x97, 0x9e, 0x60, 0x78, 0x3f, 0x07,
- 0xa5, 0x78, 0x93, 0x47, 0x66, 0xe4, 0xd0, 0xe1, 0xd1, 0x9f, 0xdc, 0x11, 0xfd, 0xad, 0x01, 0xa3,
- 0xac, 0x0a, 0xcf, 0x6d, 0x30, 0x4b, 0xf6, 0x41, 0x30, 0x6b, 0xd2, 0x50, 0x21, 0x2c, 0xbf, 0x3f,
- 0x0a, 0x90, 0x20, 0x93, 0x1d, 0x98, 0x5c, 0x5b, 0x5e, 0x5c, 0x58, 0x76, 0x69, 0x27, 0xc2, 0x0b,
- 0xc9, 0x54, 0x52, 0x03, 0xb6, 0x3b, 0x0d, 0x3a, 0x4e, 0x4b, 0x20, 0x1c, 0x24, 0xd3, 0xd3, 0xf7,
- 0xdc, 0xa6, 0xed, 0xc5, 0x74, 0xaa, 0x55, 0xa7, 0x73, 0x64, 0xdf, 0x68, 0xd4, 0xee, 0xaf, 0x28,
- 0xdf, 0xc8, 0x0d, 0xf9, 0x8d, 0xd0, 0x69, 0xb7, 0x06, 0x7c, 0x43, 0xe7, 0x48, 0xf6, 0xa0, 0x72,
- 0x07, 0x17, 0x00, 0xe5, 0x2b, 0xf9, 0xe3, 0xbf, 0xf2, 0xb2, 0xf8, 0xca, 0x0b, 0x7c, 0xe5, 0xc8,
- 0xfe, 0x4e, 0x1f, 0xd7, 0x44, 0x72, 0x0b, 0x27, 0x4a, 0xee, 0xdf, 0x35, 0x60, 0x94, 0xaf, 0x30,
- 0xf1, 0xbb, 0x28, 0x99, 0x6b, 0xd8, 0xf6, 0xb3, 0x59, 0xc3, 0x2a, 0x11, 0xfe, 0xa7, 0xee, 0xe2,
- 0x79, 0x19, 0x59, 0x4c, 0x3d, 0xb2, 0x22, 0x4f, 0xfb, 0xd1, 0xba, 0xe5, 0x25, 0x89, 0x0f, 0x18,
- 0x7f, 0x5f, 0x45, 0xe5, 0xc2, 0x31, 0xd4, 0x27, 0x1f, 0xc7, 0x9e, 0xf2, 0xc9, 0xc7, 0x15, 0x28,
- 0x09, 0xa7, 0xa6, 0xfa, 0x81, 0xd8, 0xc3, 0xca, 0x53, 0x9a, 0x18, 0xae, 0xe4, 0xfa, 0xe6, 0x20,
- 0x7b, 0x47, 0xcb, 0xd4, 0x17, 0x23, 0x92, 0x35, 0x28, 0x25, 0x91, 0x38, 0x25, 0xed, 0xca, 0x36,
- 0x86, 0x0b, 0xaf, 0x5f, 0x1e, 0xec, 0x99, 0x19, 0x78, 0x93, 0xf0, 0x30, 0xbf, 0x65, 0x40, 0x25,
- 0x2d, 0x2f, 0xe4, 0x1d, 0x18, 0x8f, 0x83, 0xa1, 0x62, 0x57, 0x08, 0x3c, 0x73, 0x4d, 0xa2, 0xa7,
- 0x34, 0xa7, 0x08, 0x15, 0x9d, 0xcc, 0x43, 0x91, 0x4d, 0x3b, 0x25, 0x55, 0x33, 0xea, 0x93, 0x9e,
- 0x80, 0xa9, 0x57, 0x90, 0x12, 0x4f, 0x99, 0xb5, 0xff, 0x31, 0x0f, 0xe3, 0xca, 0x60, 0x91, 0xab,
- 0x50, 0x5c, 0x0e, 0x57, 0xfc, 0xe6, 0x3e, 0x75, 0xc5, 0xcd, 0x06, 0xbe, 0xe8, 0xe9, 0x85, 0x76,
- 0x0b, 0x81, 0x56, 0x5c, 0x4c, 0xea, 0x30, 0xc1, 0xff, 0x93, 0x41, 0xaf, 0xb9, 0xe4, 0x54, 0x96,
- 0x23, 0xcb, 0x70, 0x57, 0x75, 0x85, 0xd5, 0x48, 0xc8, 0x47, 0x00, 0x1c, 0xc0, 0xc6, 0x77, 0x08,
- 0x9f, 0x66, 0x39, 0x81, 0xcf, 0x88, 0x0f, 0x44, 0x9e, 0xda, 0x42, 0x14, 0x05, 0x85, 0x21, 0xbe,
- 0x26, 0xe8, 0x37, 0xf7, 0x87, 0x7f, 0x4f, 0x34, 0x79, 0x4d, 0xd0, 0x6f, 0xee, 0xdb, 0xd9, 0x0e,
- 0x6e, 0x2a, 0x4b, 0xf2, 0x6d, 0x03, 0x2e, 0x58, 0xb4, 0xe9, 0x3f, 0xa4, 0xc1, 0x41, 0x2d, 0x42,
- 0x2c, 0xf5, 0x8b, 0x27, 0x7b, 0xd3, 0xdd, 0x14, 0x5f, 0x7c, 0x2d, 0x10, 0x5c, 0x30, 0x12, 0xa7,
- 0xdd, 0x8d, 0xec, 0x63, 0xaa, 0x70, 0xcc, 0x27, 0xcd, 0xbf, 0x30, 0x94, 0x29, 0x40, 0x56, 0xa1,
- 0x14, 0x0b, 0x8b, 0x38, 0xb5, 0x8c, 0x8d, 0x23, 0x09, 0xb7, 0xe8, 0x83, 0xfa, 0x0b, 0xe2, 0x12,
- 0xe2, 0x74, 0x2c, 0x72, 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x15, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0xdb,
- 0x4b, 0x2e, 0x35, 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x5f, 0x10, 0x0e, 0x29, 0x79, 0x2d,
- 0x6b, 0x2e, 0x03, 0xb1, 0x7a, 0xc4, 0x6b, 0x4c, 0xe2, 0x53, 0xa9, 0x48, 0xeb, 0xdf, 0xcb, 0x41,
- 0x25, 0x3d, 0xf1, 0xc8, 0xfb, 0x50, 0x96, 0x51, 0x55, 0x77, 0x9d, 0x70, 0x4f, 0x64, 0xe2, 0xc4,
- 0x8d, 0xa3, 0x0c, 0xc5, 0xb2, 0xf7, 0x1c, 0x2d, 0x63, 0x9b, 0x46, 0xc0, 0x16, 0xe4, 0x0d, 0xe1,
- 0xaa, 0xaf, 0x4c, 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0x4c, 0x9c, 0x12, 0x8d, 0xbc, 0x09, 0x79, 0x1e,
- 0x6a, 0xa8, 0xa6, 0x71, 0xba, 0x7f, 0xbb, 0xc6, 0x23, 0xa5, 0xf8, 0xbd, 0xb7, 0x7e, 0x81, 0xc0,
- 0xf0, 0xc9, 0x8a, 0x12, 0xa8, 0x36, 0xaa, 0xa5, 0xb3, 0x91, 0xe0, 0xb8, 0x71, 0x27, 0x47, 0xac,
- 0x7d, 0x50, 0x28, 0xe6, 0x2b, 0x05, 0x11, 0x9a, 0xf4, 0x87, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04,
- 0xd0, 0xde, 0x10, 0x17, 0xd8, 0xf8, 0x3f, 0x39, 0x0f, 0x45, 0x69, 0x62, 0x88, 0x4b, 0xec, 0xb1,
- 0x50, 0x98, 0x17, 0xb3, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x01, 0xb1, 0xa1,
- 0x30, 0xc8, 0xa2, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xbb, 0x61, 0x97,
- 0xac, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0x6d, 0xd7,
- 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0x3e, 0xed, 0xd9, 0x0b, 0x87,
- 0x7a, 0x0f, 0x34, 0xe1, 0x50, 0x64, 0x64, 0x9b, 0x21, 0x75, 0xc9, 0x6b, 0x50, 0x60, 0xa3, 0x29,
- 0xd6, 0x83, 0x38, 0x39, 0xdf, 0xda, 0xc6, 0x3a, 0xef, 0xb0, 0xbb, 0xa7, 0x2c, 0x44, 0x20, 0xaf,
- 0x40, 0xbe, 0x37, 0xff, 0x40, 0x68, 0xfa, 0x4a, 0x12, 0x85, 0x1a, 0xa3, 0xb1, 0x62, 0x72, 0x13,
- 0x8a, 0x8f, 0xf4, 0x78, 0xc3, 0x33, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0xc4, 0x7a, 0x11, 0x46, 0x79,
- 0xa4, 0x9d, 0xf9, 0x12, 0x40, 0xf2, 0xe9, 0x7e, 0x5f, 0x03, 0xf3, 0x23, 0x28, 0xc5, 0x9f, 0x24,
- 0x2f, 0x02, 0xec, 0xd3, 0x03, 0x7b, 0xcf, 0xe9, 0xb8, 0xe2, 0x25, 0x99, 0xb2, 0x55, 0xda, 0xa7,
- 0x07, 0x77, 0x11, 0x40, 0xce, 0xc1, 0x58, 0x97, 0x8d, 0xaa, 0xcc, 0x23, 0x6b, 0x8d, 0x76, 0x7b,
- 0x3b, 0x4c, 0x42, 0x67, 0x61, 0x0c, 0xcf, 0x1f, 0xc4, 0x44, 0x9b, 0xb0, 0xe4, 0x4f, 0xf3, 0x77,
- 0x73, 0x98, 0x61, 0x40, 0xa9, 0x27, 0x79, 0x19, 0x26, 0x9a, 0x01, 0xc5, 0xe5, 0xc8, 0x61, 0x66,
- 0x91, 0xf8, 0x4e, 0x39, 0x01, 0x2e, 0xbb, 0xe4, 0x32, 0x4c, 0x25, 0x89, 0x6d, 0xed, 0xe6, 0x8e,
- 0x88, 0x36, 0x2e, 0x5b, 0x13, 0x5d, 0x99, 0xd9, 0x76, 0x61, 0x07, 0xc3, 0x07, 0x2a, 0x6a, 0x94,
- 0x5d, 0x24, 0x93, 0xd4, 0x96, 0xac, 0x29, 0x05, 0x8e, 0x77, 0x17, 0x67, 0x61, 0xd4, 0x71, 0x76,
- 0x7b, 0x1e, 0x77, 0x65, 0x2e, 0x5b, 0xe2, 0x17, 0xf9, 0x3c, 0x4c, 0x87, 0xde, 0x6e, 0xc7, 0x89,
- 0x7a, 0x81, 0x48, 0xf1, 0x40, 0x03, 0x14, 0xa9, 0x09, 0xab, 0x12, 0x17, 0x2c, 0x70, 0x38, 0x79,
- 0x03, 0x88, 0xfa, 0x3d, 0x7f, 0xe7, 0x63, 0xda, 0xe4, 0xa2, 0x56, 0xb6, 0xa6, 0x95, 0x92, 0x35,
- 0x2c, 0x20, 0x9f, 0x83, 0x72, 0x40, 0x43, 0x34, 0xc9, 0xb0, 0xdb, 0x30, 0x71, 0x8d, 0x35, 0x2e,
- 0x61, 0xf7, 0xe8, 0x81, 0x59, 0x87, 0xe9, 0xbe, 0xf9, 0x48, 0xde, 0xe0, 0xd6, 0xbd, 0x58, 0x9f,
- 0xcb, 0x7c, 0x33, 0xc3, 0x94, 0x54, 0xea, 0x35, 0x68, 0x8e, 0x64, 0x76, 0xa0, 0xac, 0xea, 0xd7,
- 0x13, 0xe2, 0xb8, 0xcf, 0xa2, 0x0f, 0x24, 0x57, 0x3e, 0xa3, 0x47, 0x87, 0xd5, 0x9c, 0xe7, 0xa2,
- 0xe7, 0xe3, 0x15, 0x28, 0x4a, 0x2b, 0x41, 0x7d, 0xf5, 0x44, 0x18, 0x94, 0x07, 0x56, 0x5c, 0x6a,
- 0xbe, 0x06, 0x63, 0x42, 0x85, 0x1e, 0x7f, 0x16, 0x64, 0xfe, 0x62, 0x0e, 0xa6, 0x2c, 0xca, 0x26,
- 0xb8, 0x78, 0x4f, 0xe4, 0x33, 0x96, 0xe2, 0x57, 0x6b, 0xdb, 0x31, 0x69, 0x13, 0xbe, 0x67, 0xc0,
- 0xe9, 0x0c, 0xdc, 0x4f, 0x94, 0x13, 0xec, 0x16, 0x94, 0x16, 0x3d, 0xa7, 0x55, 0x73, 0xdd, 0xd8,
- 0x97, 0x13, 0xad, 0x41, 0x97, 0x4d, 0x27, 0x87, 0x41, 0xd5, 0xc5, 0x34, 0x46, 0x25, 0xd7, 0x84,
- 0x50, 0x24, 0x59, 0x0b, 0x65, 0x12, 0x61, 0xe0, 0x75, 0x4a, 0x52, 0x08, 0x63, 0x04, 0x1e, 0x07,
- 0x26, 0x77, 0x94, 0xcf, 0xed, 0xd0, 0x65, 0x47, 0xe0, 0xa5, 0x9b, 0x37, 0xd4, 0xb6, 0xf3, 0x5b,
- 0x39, 0x38, 0x9b, 0x4d, 0xf8, 0x49, 0xd3, 0xbb, 0x61, 0xce, 0x0a, 0x25, 0x4f, 0x33, 0xa6, 0x77,
- 0xe3, 0x09, 0x2e, 0x10, 0x3f, 0x41, 0x20, 0x0f, 0x60, 0x62, 0xc5, 0x09, 0xa3, 0xbb, 0xd4, 0x09,
- 0xa2, 0x1d, 0xea, 0x44, 0x43, 0x58, 0xb0, 0xf1, 0x9b, 0xcb, 0xb8, 0xa8, 0xed, 0x49, 0xca, 0xf4,
- 0x9b, 0xcb, 0x1a, 0xdb, 0x58, 0x50, 0x0a, 0x43, 0x08, 0xca, 0x37, 0x61, 0xaa, 0x41, 0xdb, 0x4e,
- 0x77, 0xcf, 0x0f, 0xa8, 0x38, 0xbe, 0xbe, 0x0e, 0x13, 0x31, 0x28, 0x53, 0x5a, 0xf4, 0x62, 0x0d,
- 0x5f, 0xe9, 0x88, 0x44, 0x95, 0xe8, 0xc5, 0xe6, 0x6f, 0xe7, 0xe0, 0x5c, 0xad, 0x29, 0xce, 0xfa,
- 0x45, 0x81, 0xbc, 0x92, 0xfc, 0x94, 0xbf, 0x4d, 0xe6, 0xa0, 0x74, 0xdf, 0x79, 0xbc, 0x42, 0xf1,
- 0x55, 0x54, 0x9e, 0x24, 0x88, 0x9b, 0x5f, 0xce, 0x63, 0x3b, 0x3e, 0xf6, 0xb2, 0x12, 0x1c, 0x75,
- 0xb3, 0x59, 0x78, 0xca, 0xcd, 0xa6, 0x09, 0xa3, 0x77, 0xfd, 0x96, 0x2b, 0x16, 0x27, 0x71, 0x75,
- 0xb0, 0x87, 0x10, 0x4b, 0x94, 0x98, 0x3f, 0x34, 0x60, 0x32, 0xae, 0x31, 0x56, 0xe1, 0x53, 0xef,
- 0x92, 0xcb, 0x30, 0x86, 0x1f, 0x8a, 0xdf, 0xe4, 0xc1, 0x45, 0xa3, 0xc5, 0x40, 0xb6, 0xe7, 0x5a,
- 0xb2, 0x50, 0xed, 0x89, 0x91, 0xa7, 0xeb, 0x09, 0xf3, 0x9f, 0xe2, 0xad, 0x84, 0xda, 0x4a, 0xb6,
- 0x12, 0x29, 0x15, 0x31, 0x86, 0xac, 0x48, 0xee, 0x99, 0x0d, 0x49, 0x7e, 0xe0, 0x90, 0xfc, 0x52,
- 0x0e, 0xc6, 0xe3, 0xca, 0x7e, 0xc6, 0x42, 0xd7, 0xe3, 0x76, 0x0d, 0xe5, 0x48, 0xde, 0x50, 0x74,
- 0x85, 0xf0, 0xd7, 0xfe, 0x0a, 0x8c, 0x8a, 0xc9, 0x64, 0xa4, 0xae, 0xe6, 0x52, 0xa3, 0x9b, 0xbc,
- 0x9b, 0x8b, 0x03, 0x1a, 0x5a, 0x82, 0x0e, 0x3d, 0xf5, 0xb7, 0xe9, 0x8e, 0xb8, 0xa4, 0x7a, 0x6e,
- 0xd7, 0xa8, 0x6c, 0x4f, 0xfd, 0xa4, 0x61, 0x43, 0xad, 0x4e, 0xff, 0xa8, 0x00, 0x95, 0x34, 0xc9,
- 0xc9, 0xc9, 0x01, 0xd6, 0x7b, 0x3b, 0xe2, 0x59, 0x08, 0x4c, 0x0e, 0xd0, 0xed, 0xed, 0x58, 0x0c,
- 0x46, 0x2e, 0x43, 0x61, 0x3d, 0xf0, 0x1e, 0x62, 0xab, 0xc5, 0xab, 0x18, 0xdd, 0xc0, 0x7b, 0xa8,
- 0xba, 0xac, 0xb2, 0x72, 0xdc, 0xd0, 0xae, 0x34, 0x94, 0x27, 0xcb, 0xf9, 0x86, 0xb6, 0x15, 0xa6,
- 0xb3, 0xd0, 0x48, 0x34, 0xb6, 0x54, 0xd6, 0xa9, 0x13, 0x88, 0x40, 0x76, 0xa1, 0xce, 0x70, 0xa9,
- 0xdc, 0x41, 0x30, 0x4f, 0x31, 0x6b, 0xa9, 0x48, 0xa4, 0x05, 0x44, 0xf9, 0x29, 0x27, 0xf0, 0xc9,
- 0x7b, 0x3c, 0xf9, 0x9a, 0xd3, 0x8c, 0xca, 0xda, 0x56, 0x67, 0x73, 0x06, 0xdf, 0x67, 0x79, 0x46,
- 0xb8, 0x0e, 0x25, 0x3c, 0xf2, 0xc2, 0x83, 0x8c, 0xe2, 0x89, 0xcc, 0xa4, 0x7b, 0x30, 0xe0, 0x95,
- 0xbe, 0x1d, 0x1f, 0x67, 0x24, 0x4c, 0xc8, 0x7b, 0x30, 0xae, 0xfa, 0xb4, 0x72, 0xcf, 0xcb, 0x8b,
- 0x3c, 0x98, 0x69, 0x40, 0xb6, 0x36, 0x95, 0xc0, 0xfc, 0x82, 0x2a, 0x25, 0x62, 0xd1, 0x3e, 0x56,
- 0x4a, 0xcc, 0xdf, 0x44, 0x33, 0xbe, 0xed, 0x47, 0x54, 0x58, 0x2f, 0xcf, 0xad, 0x1e, 0x4b, 0x8e,
- 0x90, 0x47, 0x34, 0xb7, 0x12, 0xad, 0x75, 0x4f, 0xf0, 0x58, 0xf7, 0x1f, 0x18, 0x70, 0x26, 0x93,
- 0x96, 0x5c, 0x07, 0x48, 0x6c, 0x44, 0xd1, 0x4b, 0x3c, 0x77, 0x6f, 0x0c, 0xb5, 0x14, 0x0c, 0xf2,
- 0x8d, 0xb4, 0x75, 0x77, 0xf2, 0xe2, 0x24, 0x5f, 0xb8, 0x98, 0xd4, 0xad, 0xbb, 0x0c, 0x9b, 0xce,
- 0xfc, 0x5e, 0x1e, 0xa6, 0xfb, 0x5e, 0x46, 0x3c, 0xe1, 0x22, 0x7f, 0x3f, 0xf5, 0xee, 0x16, 0xbf,
- 0xee, 0xb8, 0x36, 0xe8, 0x5d, 0xc6, 0x8c, 0x57, 0xb8, 0xf0, 0x58, 0x4c, 0xa4, 0x8d, 0x3e, 0xe1,
- 0x31, 0xae, 0x30, 0xfb, 0xc5, 0xb6, 0xcf, 0x0f, 0xfc, 0xda, 0x33, 0x78, 0xb9, 0xed, 0xc7, 0xf8,
- 0x61, 0xab, 0xdf, 0xcc, 0xc1, 0xe9, 0xbe, 0x36, 0x3f, 0xb7, 0xb3, 0xee, 0x2b, 0xda, 0xea, 0xf6,
- 0xd2, 0xa0, 0x31, 0x1d, 0xca, 0x8a, 0xf8, 0x9f, 0x06, 0x9c, 0x1b, 0x40, 0x49, 0x0e, 0xd2, 0x42,
- 0xc4, 0xad, 0x8a, 0x1b, 0xc7, 0x7f, 0xf0, 0x99, 0x88, 0xd2, 0xa7, 0x26, 0x09, 0xbf, 0x98, 0x03,
- 0xd8, 0xa6, 0x3b, 0xcf, 0x77, 0xe6, 0xa3, 0x2f, 0x69, 0x02, 0xa0, 0x1c, 0x60, 0x0e, 0x9f, 0xf8,
- 0x68, 0x0d, 0x0f, 0x12, 0x87, 0x4f, 0x7b, 0x14, 0xbf, 0xe2, 0x91, 0xcb, 0x7e, 0xc5, 0xc3, 0xdc,
- 0x81, 0x99, 0x3b, 0x34, 0x4a, 0x56, 0x42, 0xb9, 0x87, 0x3c, 0x9e, 0xed, 0xeb, 0x50, 0x12, 0xf8,
- 0x7a, 0x46, 0x76, 0xe9, 0x95, 0xe6, 0xb9, 0x56, 0x82, 0x60, 0x52, 0x38, 0xb7, 0x48, 0x5b, 0x34,
- 0xa2, 0x9f, 0xee, 0x67, 0x1a, 0x40, 0x78, 0x53, 0xf8, 0xe3, 0x0e, 0x43, 0x7d, 0xe1, 0xc4, 0xfe,
- 0xd9, 0x82, 0x33, 0x71, 0xdd, 0x9f, 0x25, 0xdf, 0x39, 0x66, 0x4b, 0x88, 0xb0, 0xc0, 0x84, 0xe3,
- 0x31, 0x87, 0x88, 0x8f, 0xe1, 0x82, 0x24, 0xd8, 0xf6, 0xe2, 0x9b, 0x98, 0xa1, 0x68, 0xc9, 0x3b,
- 0x30, 0xae, 0xd0, 0x88, 0x18, 0x63, 0xbc, 0xed, 0x7c, 0xe4, 0x45, 0x7b, 0x76, 0xc8, 0xe1, 0xea,
- 0x6d, 0xa7, 0x82, 0x6e, 0x7e, 0x1d, 0x5e, 0x88, 0xfd, 0x56, 0x32, 0x3e, 0x9d, 0x62, 0x6e, 0x3c,
- 0x19, 0xf3, 0xd5, 0xa4, 0x59, 0xcb, 0x9d, 0xd8, 0x09, 0x5d, 0xf2, 0x26, 0x6a, 0xb3, 0x44, 0x63,
- 0x2e, 0x2a, 0x19, 0xe1, 0xc4, 0x5a, 0x94, 0x00, 0xcc, 0xb7, 0x95, 0xca, 0x66, 0x30, 0xd4, 0x88,
- 0x8d, 0x34, 0xf1, 0x2f, 0xe6, 0x60, 0x6a, 0x6d, 0x79, 0x71, 0x21, 0x3e, 0x46, 0xfe, 0x8c, 0xa5,
- 0x65, 0xd2, 0xda, 0x36, 0x58, 0xdf, 0x98, 0x9b, 0x70, 0x3a, 0xd5, 0x0d, 0xf8, 0x76, 0xcd, 0x7b,
- 0xdc, 0xbf, 0x24, 0x06, 0xcb, 0x95, 0xe5, 0x6c, 0x16, 0xfb, 0xad, 0x9b, 0x56, 0x0a, 0xdb, 0xfc,
- 0xde, 0x68, 0x8a, 0xaf, 0x50, 0x61, 0xaf, 0x43, 0x69, 0x39, 0x0c, 0x7b, 0x34, 0xd8, 0xb4, 0x56,
- 0x54, 0x1b, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0xae, 0x42, 0x51, 0x84, 0xa2,
- 0x49, 0x9d, 0x80, 0xd7, 0xe5, 0x71, 0x24, 0x9b, 0x15, 0x17, 0x93, 0x37, 0xa1, 0xcc, 0xff, 0xe7,
- 0xd2, 0x26, 0x3a, 0x1c, 0xcf, 0xaa, 0x04, 0x3a, 0x97, 0x4e, 0x4b, 0x43, 0x63, 0x3b, 0x33, 0xf9,
- 0x38, 0x26, 0xab, 0x51, 0x21, 0xd9, 0x99, 0xc9, 0x77, 0x34, 0xb1, 0x4e, 0x2a, 0x12, 0xb9, 0x06,
- 0xf9, 0xda, 0x82, 0xa5, 0x26, 0xa1, 0x76, 0x9a, 0x01, 0x4f, 0xe2, 0xae, 0xbd, 0x3f, 0x55, 0x5b,
- 0xb0, 0xc8, 0x3c, 0x14, 0xf1, 0x7d, 0x11, 0x97, 0x06, 0xc2, 0xf1, 0x14, 0xa5, 0xa6, 0x2b, 0x60,
- 0xea, 0xcd, 0xa3, 0xc4, 0x23, 0x73, 0x30, 0xb6, 0xe8, 0x85, 0xdd, 0x96, 0x73, 0x20, 0xf2, 0xb1,
- 0xe0, 0x65, 0x88, 0xcb, 0x41, 0xaa, 0x9c, 0x09, 0x2c, 0x72, 0x15, 0x46, 0x1a, 0x4d, 0xbf, 0xcb,
- 0x76, 0x5b, 0xb1, 0x6b, 0x4b, 0xc8, 0x00, 0x5a, 0x12, 0x06, 0x06, 0xc0, 0xe8, 0x68, 0x1e, 0xe4,
- 0x55, 0x52, 0xa2, 0xa3, 0xd3, 0xc1, 0x5d, 0x02, 0xa7, 0xdf, 0xff, 0x0f, 0x9e, 0xa5, 0xff, 0xdf,
- 0x0e, 0x9c, 0xbb, 0x83, 0xa6, 0x7e, 0x83, 0x06, 0x98, 0x02, 0x93, 0xbf, 0x55, 0xb4, 0x69, 0x2d,
- 0x8b, 0xc0, 0x36, 0x0c, 0x33, 0xe2, 0xbb, 0x01, 0x3b, 0xe4, 0x38, 0xf2, 0x99, 0xa3, 0xd4, 0x03,
- 0x0d, 0x83, 0x18, 0x91, 0xaf, 0xc2, 0x4c, 0x56, 0x91, 0x08, 0x71, 0x43, 0xd7, 0xf2, 0xec, 0x0f,
- 0xa8, 0xbe, 0xdd, 0x59, 0x1c, 0xc8, 0x0a, 0x54, 0x38, 0xbc, 0xe6, 0xb6, 0xbd, 0xce, 0x52, 0xdb,
- 0xf1, 0x5a, 0x18, 0xf0, 0x26, 0xa2, 0x16, 0x05, 0x57, 0x87, 0x15, 0xda, 0x94, 0x95, 0x6a, 0xde,
- 0x49, 0x29, 0x4a, 0x54, 0x47, 0x8d, 0xda, 0xfd, 0x95, 0x64, 0x4e, 0x7d, 0xb6, 0xee, 0x8d, 0xb4,
- 0xb6, 0x1d, 0x73, 0x6f, 0xb4, 0x09, 0xa7, 0x53, 0xdd, 0x20, 0xd5, 0x91, 0x06, 0x4e, 0xab, 0xa3,
- 0x14, 0x8d, 0x95, 0xc2, 0x36, 0xff, 0xd3, 0x68, 0x8a, 0xaf, 0x38, 0x2b, 0x32, 0x61, 0x94, 0x6b,
- 0x1b, 0x35, 0x61, 0x1b, 0xd7, 0x45, 0x96, 0x28, 0x21, 0xe7, 0x21, 0xdf, 0x68, 0xac, 0xa9, 0xe9,
- 0x24, 0xc3, 0xd0, 0xb7, 0x18, 0x8c, 0x8d, 0x10, 0x1e, 0x03, 0x29, 0x51, 0x5e, 0x4d, 0x1a, 0x44,
- 0xe2, 0xf5, 0xd4, 0x57, 0x93, 0x79, 0x5c, 0x48, 0xfa, 0x5b, 0xcc, 0xe3, 0x64, 0xf6, 0x2e, 0xc0,
- 0x6c, 0x2d, 0x0c, 0x69, 0x10, 0xf1, 0x1c, 0xf8, 0x61, 0xaf, 0x4d, 0x03, 0x21, 0x6b, 0x42, 0xc7,
- 0xf0, 0xb7, 0xd7, 0x9b, 0xa1, 0x35, 0x10, 0x91, 0x5c, 0x81, 0x62, 0xad, 0xe7, 0x7a, 0xb4, 0xd3,
- 0xd4, 0x1c, 0xdc, 0x1d, 0x01, 0xb3, 0xe2, 0x52, 0xf2, 0x21, 0x9c, 0x11, 0x44, 0x52, 0xe1, 0x88,
- 0x1e, 0xe0, 0xba, 0x86, 0xef, 0x60, 0xc5, 0x5c, 0x90, 0x6a, 0xca, 0x16, 0x5d, 0x92, 0x4d, 0x49,
- 0x6a, 0x50, 0x59, 0xc2, 0x7b, 0x52, 0xf9, 0x86, 0xb2, 0x1f, 0x88, 0x5c, 0xc7, 0xa8, 0xb9, 0xf8,
- 0x1d, 0xaa, 0xed, 0xc6, 0x85, 0x56, 0x1f, 0x3a, 0xb9, 0x07, 0xa7, 0xd3, 0x30, 0xa6, 0x8f, 0x4b,
- 0xc9, 0x1b, 0x67, 0x7d, 0x5c, 0x50, 0x31, 0x67, 0x51, 0x91, 0x1d, 0x98, 0xae, 0x45, 0x51, 0xe0,
- 0xed, 0xf4, 0x22, 0x9a, 0x52, 0x5d, 0xf2, 0xa0, 0x31, 0x2e, 0x97, 0xea, 0xeb, 0x05, 0x21, 0x8c,
- 0xa7, 0x9d, 0x98, 0x32, 0x56, 0x61, 0x56, 0x3f, 0x3b, 0xe2, 0xc6, 0xcf, 0x24, 0x8a, 0xa7, 0x04,
- 0x45, 0x54, 0x92, 0x3c, 0xd0, 0xad, 0x85, 0x07, 0xed, 0x36, 0x8d, 0x02, 0xbc, 0xb9, 0xc7, 0xa7,
- 0x06, 0x4d, 0xe1, 0x03, 0x74, 0x41, 0x79, 0x1d, 0x14, 0x9f, 0x93, 0xd4, 0xdc, 0x23, 0x35, 0x9e,
- 0xda, 0xf2, 0x51, 0x1e, 0x72, 0xf9, 0x68, 0xc1, 0xf4, 0x52, 0xa7, 0x19, 0x1c, 0x60, 0x78, 0xa4,
- 0xac, 0xdc, 0xc4, 0x09, 0x95, 0x93, 0xef, 0x88, 0x5c, 0x74, 0xa4, 0x84, 0x65, 0x55, 0xaf, 0x9f,
- 0xb1, 0xf9, 0xff, 0x41, 0x25, 0xdd, 0x97, 0x4f, 0xf9, 0x36, 0xf4, 0x93, 0xb8, 0x66, 0xb3, 0x91,
- 0x4e, 0xb7, 0x85, 0xcc, 0x69, 0x0f, 0x00, 0x1b, 0x49, 0x00, 0xbd, 0xf2, 0x54, 0xaf, 0xf6, 0xec,
- 0xaf, 0x9c, 0xc6, 0xb9, 0xac, 0x69, 0x6c, 0xfe, 0x72, 0x0e, 0xa6, 0xb9, 0x37, 0xe9, 0xf3, 0x6f,
- 0x2b, 0xbe, 0xa7, 0x29, 0x67, 0x79, 0x16, 0x98, 0x6a, 0xdd, 0x31, 0xd6, 0xe2, 0x47, 0x70, 0xa6,
- 0xaf, 0x2b, 0x50, 0x41, 0x2f, 0x4a, 0x3f, 0xde, 0x3e, 0x15, 0x3d, 0x9b, 0xfd, 0x91, 0xad, 0x9b,
- 0x56, 0x1f, 0x85, 0xf9, 0x8f, 0x73, 0x7d, 0xfc, 0x85, 0xdd, 0xa8, 0x5a, 0x82, 0xc6, 0x93, 0x59,
- 0x82, 0xb9, 0x4f, 0x64, 0x09, 0xe6, 0x87, 0xb1, 0x04, 0x3f, 0x84, 0x89, 0x0d, 0xea, 0x30, 0x8b,
- 0x46, 0x44, 0xac, 0x15, 0xb4, 0xc7, 0x79, 0x59, 0x99, 0xd4, 0x2f, 0x71, 0xb4, 0x6b, 0xc4, 0x08,
- 0x98, 0x6a, 0xe1, 0x21, 0x6c, 0x96, 0xce, 0x41, 0x5d, 0x34, 0x46, 0x06, 0x2f, 0x1a, 0xe6, 0xb7,
- 0x72, 0x30, 0xae, 0xb0, 0x27, 0x5f, 0x84, 0xf2, 0x5a, 0xb0, 0xeb, 0x74, 0xbc, 0x9f, 0x71, 0x94,
- 0xe3, 0x57, 0xac, 0xbe, 0xaf, 0xc0, 0x2d, 0x0d, 0x0b, 0xdd, 0x66, 0xa8, 0xd3, 0x56, 0x05, 0x9f,
- 0x55, 0xcf, 0x42, 0xa8, 0x12, 0x71, 0x9c, 0x1f, 0x22, 0xe2, 0x58, 0x0f, 0xd7, 0x2d, 0x3c, 0x79,
- 0xb8, 0xae, 0x16, 0x5d, 0x3b, 0xf2, 0x84, 0xd1, 0xb5, 0xe6, 0xaf, 0xe6, 0xa0, 0x22, 0x9e, 0xb1,
- 0x95, 0x87, 0x87, 0x9f, 0xad, 0x67, 0x2f, 0xf4, 0xc6, 0x1d, 0x73, 0x3d, 0x56, 0xf8, 0xad, 0xdf,
- 0xab, 0xe2, 0xa3, 0xa4, 0xe9, 0xee, 0x90, 0x8f, 0x92, 0xea, 0xf0, 0x74, 0xe4, 0x40, 0x9a, 0xca,
- 0x4a, 0xe3, 0x9b, 0x7f, 0x9e, 0x4b, 0xf3, 0x16, 0xd6, 0xd4, 0xab, 0x30, 0xc6, 0x5f, 0x21, 0x93,
- 0xce, 0xcd, 0x22, 0xcd, 0x14, 0x82, 0x2c, 0x59, 0xf6, 0x24, 0x31, 0x24, 0x27, 0xbd, 0x4c, 0x4b,
- 0x6e, 0x41, 0x19, 0xfd, 0x45, 0x6a, 0xae, 0x1b, 0xd0, 0x30, 0x14, 0x86, 0x16, 0xde, 0xdd, 0x3d,
- 0xa2, 0x3b, 0x36, 0xf7, 0x2b, 0x71, 0x5c, 0x37, 0xb0, 0x34, 0x3c, 0xb2, 0x00, 0x33, 0x9a, 0x7b,
- 0x92, 0xa4, 0x1f, 0x49, 0x56, 0x8b, 0x08, 0x0b, 0x38, 0x71, 0x26, 0xf2, 0xb3, 0x7b, 0x95, 0xdb,
- 0xfc, 0x6b, 0x83, 0xcd, 0xb5, 0xe6, 0xfe, 0x67, 0x2c, 0xba, 0x85, 0x35, 0xe9, 0x18, 0x63, 0xff,
- 0xcf, 0x0c, 0xee, 0x9f, 0x2e, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0x6f, 0x9e, 0x09, 0x4f, 0x6a, 0x95,
- 0x0b, 0x2f, 0x48, 0xee, 0xa7, 0xf8, 0xcb, 0x69, 0x96, 0x20, 0x60, 0x5b, 0x66, 0xdd, 0x4d, 0x1e,
- 0x0d, 0xcf, 0x7e, 0xff, 0x78, 0x89, 0xa5, 0xa6, 0x64, 0x1d, 0x2e, 0xd5, 0xb7, 0x71, 0x72, 0x4a,
- 0x56, 0xf3, 0xff, 0xe6, 0x78, 0x7b, 0x44, 0xa5, 0x86, 0xcd, 0x0d, 0x78, 0x19, 0x0a, 0xf8, 0xba,
- 0xae, 0x92, 0x80, 0x31, 0xf5, 0xb2, 0x2e, 0x96, 0xb3, 0x79, 0x83, 0xba, 0x56, 0x0d, 0xa8, 0x42,
- 0x75, 0xac, 0xce, 0x1b, 0xc4, 0xc0, 0x44, 0xda, 0xbe, 0x4b, 0xd5, 0xe9, 0xd0, 0xd1, 0x73, 0x9e,
- 0x63, 0x39, 0xb9, 0xa5, 0xf8, 0x35, 0xab, 0x07, 0x1a, 0xed, 0x07, 0x8e, 0xcd, 0xfd, 0x69, 0x55,
- 0x6d, 0x9b, 0xb8, 0x40, 0x2f, 0xc1, 0xa4, 0x1e, 0xf0, 0x2c, 0x36, 0x1d, 0x18, 0xa4, 0x98, 0x0a,
- 0x96, 0x56, 0xcd, 0x5b, 0x9d, 0x88, 0xd4, 0x61, 0x42, 0x8b, 0x6a, 0x55, 0xf3, 0xcf, 0xf2, 0x44,
- 0x36, 0x76, 0x7f, 0x3a, 0x06, 0x9d, 0x44, 0x39, 0x30, 0xff, 0x02, 0x54, 0xc4, 0xcc, 0x8c, 0x63,
- 0xdb, 0xd0, 0xb4, 0x5b, 0x5e, 0xb4, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, 0x5d,
- 0x03, 0xce, 0x8b, 0xb7, 0xdc, 0x2c, 0x1a, 0x32, 0x1b, 0x12, 0x03, 0xe2, 0x50, 0x1e, 0xbf, 0x48,
- 0xde, 0x91, 0x39, 0xb2, 0x74, 0x05, 0x99, 0xfe, 0x46, 0x7d, 0x42, 0x08, 0xe5, 0x08, 0x66, 0xc9,
- 0x92, 0xb9, 0xb1, 0xde, 0x12, 0xb9, 0xb1, 0x72, 0xc7, 0x13, 0xc7, 0xf3, 0xc2, 0xa5, 0x1d, 0x99,
- 0x13, 0xeb, 0x3b, 0x39, 0x38, 0x93, 0x51, 0xad, 0xad, 0x2f, 0x3e, 0xa7, 0xca, 0xa1, 0xae, 0x29,
- 0x07, 0x99, 0x3c, 0x71, 0x60, 0xc7, 0x67, 0xea, 0x8a, 0xdf, 0x31, 0xe0, 0x9c, 0x2e, 0x3d, 0x62,
- 0x2f, 0xba, 0x75, 0x93, 0xbc, 0x0d, 0xa3, 0x77, 0xa9, 0xe3, 0x52, 0x19, 0x82, 0x11, 0x27, 0x22,
- 0x13, 0xa7, 0xc3, 0xbc, 0x90, 0xb3, 0xfd, 0x73, 0x3e, 0x95, 0x4f, 0x59, 0x82, 0x84, 0x2c, 0x8a,
- 0xca, 0xf1, 0xeb, 0x29, 0x53, 0xde, 0xd4, 0x64, 0x7d, 0xea, 0x18, 0xc3, 0xf8, 0x0f, 0x0c, 0x78,
- 0xe1, 0x18, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, 0x81, 0xc3, 0x85, 0x05, 0xa1, 0xe4, 0x3d, 0x98,
- 0xda, 0x10, 0x91, 0x62, 0x72, 0x38, 0x94, 0xc4, 0xf6, 0x32, 0x88, 0xcc, 0x96, 0xe3, 0x92, 0x46,
- 0x66, 0xbb, 0xff, 0xbb, 0x7e, 0x18, 0x75, 0x92, 0x8c, 0x33, 0xb8, 0xfb, 0xdf, 0x13, 0x30, 0x2b,
- 0x2e, 0x65, 0x66, 0x81, 0x5e, 0x4d, 0xe1, 0x0e, 0xf1, 0x32, 0x8c, 0x32, 0x9c, 0xd8, 0xba, 0x46,
- 0x39, 0xc0, 0x97, 0xc6, 0x3c, 0xd7, 0x12, 0x45, 0xf1, 0xbe, 0x2e, 0x97, 0x79, 0x6b, 0xf1, 0x2d,
- 0x03, 0x2a, 0x3a, 0xef, 0xa7, 0x1d, 0x9a, 0x77, 0xb5, 0xa1, 0x79, 0x21, 0x7b, 0x68, 0x06, 0x8f,
- 0x49, 0x5f, 0xf2, 0x87, 0xa1, 0xc6, 0xc2, 0x84, 0xd1, 0x45, 0xbf, 0xed, 0x78, 0x1d, 0x35, 0x61,
- 0x81, 0x8b, 0x10, 0x4b, 0x94, 0x28, 0xbd, 0x95, 0x1f, 0xd8, 0x5b, 0xe6, 0xaf, 0x15, 0xe0, 0xbc,
- 0x45, 0x77, 0x3d, 0x66, 0x20, 0x6d, 0x86, 0x5e, 0x67, 0x57, 0xbb, 0x53, 0x32, 0x53, 0x1d, 0x2e,
- 0x3c, 0xe9, 0x18, 0x24, 0xee, 0xef, 0xab, 0x50, 0x64, 0x5a, 0x5a, 0xe9, 0x73, 0xdc, 0xf4, 0x60,
- 0xda, 0x1d, 0x3e, 0xae, 0xb2, 0x98, 0x5c, 0x13, 0x6b, 0x88, 0xe2, 0xeb, 0xcc, 0xd6, 0x90, 0xd4,
- 0x43, 0xe9, 0x7c, 0x1d, 0x89, 0x8d, 0xaa, 0xc2, 0x00, 0xa3, 0xea, 0x3e, 0xcc, 0xd4, 0x5c, 0xae,
- 0x9f, 0x9c, 0xd6, 0x7a, 0xe0, 0x75, 0x9a, 0x5e, 0xd7, 0x69, 0x49, 0xa3, 0x9c, 0x3f, 0x1b, 0x1f,
- 0x97, 0xdb, 0xdd, 0x18, 0xc1, 0xca, 0x24, 0x63, 0xcd, 0x58, 0x5c, 0x6d, 0xf0, 0xac, 0x2a, 0x3c,
- 0x96, 0x1d, 0x9b, 0xe1, 0x76, 0x42, 0x9e, 0x56, 0xc5, 0x8a, 0x8b, 0xd1, 0x9c, 0xc3, 0x70, 0x87,
- 0x8d, 0x95, 0xc6, 0x3d, 0x11, 0x3e, 0x20, 0x5d, 0xb1, 0x78, 0x74, 0x44, 0xd4, 0x0a, 0x71, 0xff,
- 0xae, 0xe1, 0x25, 0x74, 0x8d, 0xc6, 0x5d, 0x46, 0x57, 0xec, 0xa3, 0x0b, 0xc3, 0x3d, 0x95, 0x8e,
- 0xe3, 0x91, 0x39, 0x00, 0xee, 0xcc, 0x82, 0x02, 0x51, 0x4a, 0x8c, 0xbf, 0x00, 0xa1, 0xdc, 0xf8,
- 0x53, 0x50, 0xc8, 0x3b, 0x70, 0x7a, 0x69, 0x61, 0x5e, 0xc6, 0x05, 0x2c, 0xfa, 0xcd, 0x5e, 0x9b,
- 0x76, 0x22, 0x8c, 0x53, 0x29, 0xf3, 0x31, 0xa4, 0xcd, 0x79, 0x26, 0x05, 0x59, 0x68, 0x22, 0x3a,
- 0x80, 0xc7, 0x96, 0x2d, 0xf8, 0x2e, 0x0d, 0xb7, 0x6e, 0x7c, 0xc6, 0xa2, 0x03, 0x94, 0xb6, 0xe1,
- 0x6c, 0xbb, 0x91, 0x39, 0x33, 0xff, 0x3e, 0x46, 0x07, 0xf4, 0xe1, 0x92, 0x9f, 0x80, 0x11, 0xfc,
- 0x29, 0x56, 0xdc, 0xd3, 0x19, 0x6c, 0x93, 0xd5, 0xb6, 0xc9, 0x13, 0x64, 0x20, 0x01, 0x59, 0x4e,
- 0xf2, 0xf6, 0x3f, 0x81, 0x8f, 0xab, 0x08, 0x50, 0xd5, 0x1f, 0x6c, 0x71, 0xa1, 0xac, 0x7e, 0x90,
- 0xc9, 0xc8, 0x5d, 0x27, 0xdc, 0xa3, 0xee, 0x82, 0x7c, 0xe6, 0xb1, 0xcc, 0x65, 0x64, 0x0f, 0xa1,
- 0xf8, 0x98, 0x8c, 0xa5, 0xa0, 0x30, 0xed, 0xb0, 0x1c, 0x6e, 0x86, 0xa2, 0x2a, 0x62, 0x17, 0xe4,
- 0xe1, 0xee, 0xd5, 0xb5, 0x44, 0x11, 0x6a, 0x4b, 0x99, 0x66, 0x32, 0x70, 0x9a, 0xfb, 0x34, 0xd8,
- 0xba, 0xf1, 0x69, 0x68, 0x4b, 0xfd, 0x1b, 0xc7, 0x8c, 0xc9, 0xaf, 0x17, 0xe3, 0xfc, 0x2e, 0x1a,
- 0x32, 0xb3, 0x11, 0x93, 0x9b, 0x79, 0x23, 0xb1, 0x11, 0x93, 0x9b, 0x79, 0xd5, 0x46, 0x8c, 0x51,
- 0xe3, 0x24, 0xbf, 0xb9, 0x13, 0x92, 0xfc, 0x0e, 0xc8, 0x2b, 0x2e, 0x9d, 0x3a, 0x3f, 0x43, 0x4f,
- 0x36, 0x7c, 0x19, 0xca, 0xb5, 0x28, 0x72, 0x9a, 0x7b, 0xd4, 0xc5, 0x64, 0xd2, 0xca, 0x85, 0xa0,
- 0x23, 0xe0, 0xaa, 0xbb, 0x98, 0x8a, 0xab, 0x3c, 0xd9, 0x32, 0x36, 0xc4, 0x93, 0x2d, 0x73, 0x30,
- 0xb6, 0xdc, 0x79, 0xe8, 0xb1, 0x3e, 0x29, 0x26, 0xc9, 0x21, 0x3c, 0x0e, 0xd2, 0xdf, 0xf9, 0x40,
- 0x10, 0x79, 0x4b, 0xb1, 0x20, 0x4a, 0x89, 0x29, 0x2f, 0x1e, 0xa8, 0x96, 0x86, 0x84, 0x7a, 0xde,
- 0x2c, 0xd1, 0xc9, 0x2d, 0x18, 0x93, 0xbb, 0x67, 0x48, 0xcc, 0x77, 0x41, 0xe9, 0xf0, 0x12, 0x2d,
- 0x1f, 0x85, 0xd8, 0x3d, 0xbf, 0xa3, 0xc7, 0x8f, 0x8c, 0x2b, 0x71, 0xd9, 0x4a, 0xfc, 0x88, 0x16,
- 0x97, 0xad, 0x44, 0x92, 0xc4, 0x9b, 0xa1, 0xf2, 0x89, 0x9b, 0xa1, 0x2d, 0x28, 0xaf, 0x3b, 0x41,
- 0xe4, 0xb1, 0xe5, 0xa8, 0x13, 0xf1, 0xdc, 0x5c, 0xc9, 0x5e, 0x5d, 0x29, 0xaa, 0xbf, 0x24, 0xe3,
- 0x93, 0xbb, 0x0a, 0xbe, 0x1e, 0xd8, 0x9a, 0xc0, 0xc9, 0x6a, 0x86, 0x87, 0xa1, 0xc8, 0x57, 0x89,
- 0x57, 0x80, 0x6a, 0x72, 0x44, 0x5e, 0xaa, 0x1e, 0xa5, 0xf7, 0x3b, 0x27, 0xde, 0xe4, 0x63, 0x80,
- 0x7b, 0xc6, 0x29, 0x64, 0x83, 0xd9, 0x45, 0xd0, 0xae, 0x48, 0x6d, 0x1c, 0x63, 0x44, 0xf2, 0x0d,
- 0x28, 0xb3, 0xff, 0x31, 0x51, 0x91, 0x47, 0x79, 0xee, 0xad, 0xc4, 0xe3, 0x4c, 0x9f, 0xd0, 0x3c,
- 0x9b, 0x51, 0x83, 0x46, 0x7c, 0x02, 0x23, 0xe3, 0xf4, 0xc1, 0x8b, 0xc6, 0xcd, 0xfc, 0xa1, 0x01,
- 0xe7, 0x06, 0xf0, 0x18, 0xfa, 0xb1, 0xa6, 0xb9, 0x64, 0x41, 0x52, 0xf6, 0xe6, 0x62, 0x41, 0x52,
- 0x05, 0x43, 0x2e, 0x4d, 0xd9, 0x59, 0xb3, 0xf2, 0x9f, 0x5a, 0xd6, 0x2c, 0xf3, 0xd0, 0x80, 0x71,
- 0x65, 0x64, 0x9f, 0xe1, 0x9b, 0x09, 0x97, 0x45, 0xfa, 0xc8, 0x7c, 0x82, 0x97, 0x7a, 0xee, 0x99,
- 0xa7, 0x8b, 0xfc, 0x08, 0x60, 0xc5, 0x09, 0xa3, 0x5a, 0x33, 0xf2, 0x1e, 0xd2, 0x21, 0xd4, 0x58,
- 0x12, 0xa8, 0xef, 0x60, 0xce, 0x57, 0x46, 0xd6, 0x17, 0xa8, 0x1f, 0x33, 0x34, 0x57, 0x61, 0xb4,
- 0xe1, 0x07, 0x51, 0xfd, 0x80, 0xaf, 0x4d, 0x8b, 0x34, 0x6c, 0xaa, 0x27, 0x74, 0x1e, 0xee, 0xd5,
- 0x9b, 0x96, 0x28, 0x62, 0x06, 0xe2, 0x6d, 0x8f, 0xb6, 0x5c, 0xf5, 0x86, 0xe6, 0x01, 0x03, 0x58,
- 0x1c, 0x7e, 0xed, 0x7d, 0x98, 0x92, 0x19, 0xec, 0x36, 0x56, 0x1a, 0xd8, 0x82, 0x29, 0x18, 0xdf,
- 0x5a, 0xb2, 0x96, 0x6f, 0x7f, 0xcd, 0xbe, 0xbd, 0xb9, 0xb2, 0x52, 0x39, 0x45, 0x26, 0xa0, 0x24,
- 0x00, 0x0b, 0xb5, 0x8a, 0x41, 0xca, 0x50, 0x5c, 0x5e, 0x6d, 0x2c, 0x2d, 0x6c, 0x5a, 0x4b, 0x95,
- 0xdc, 0xb5, 0x57, 0x61, 0x32, 0xb9, 0x7f, 0xc1, 0x18, 0xcd, 0x31, 0xc8, 0x5b, 0xb5, 0xed, 0xca,
- 0x29, 0x02, 0x30, 0xba, 0x7e, 0x6f, 0xa1, 0x71, 0xe3, 0x46, 0xc5, 0xb8, 0xf6, 0x85, 0x8c, 0x37,
- 0xb6, 0x19, 0xa7, 0x06, 0xed, 0x3a, 0x81, 0x13, 0x51, 0xfe, 0x99, 0xfb, 0xbd, 0x56, 0xe4, 0x75,
- 0x5b, 0xf4, 0x71, 0xc5, 0xb8, 0xf6, 0x56, 0xdf, 0x53, 0xd9, 0xe4, 0x0c, 0x4c, 0x6f, 0xae, 0xd6,
- 0xee, 0xd7, 0x97, 0xef, 0x6c, 0xae, 0x6d, 0x36, 0xec, 0xfb, 0xb5, 0x8d, 0x85, 0xbb, 0x95, 0x53,
- 0xac, 0xc2, 0xf7, 0xd7, 0x1a, 0x1b, 0xb6, 0xb5, 0xb4, 0xb0, 0xb4, 0xba, 0x51, 0x31, 0xae, 0xfd,
- 0x8a, 0x01, 0x93, 0xfa, 0x43, 0x80, 0xe4, 0x12, 0x5c, 0xdc, 0x6c, 0x2c, 0x59, 0xf6, 0xc6, 0xda,
- 0xbd, 0xa5, 0x55, 0x7b, 0xb3, 0x51, 0xbb, 0xb3, 0x64, 0x6f, 0xae, 0x36, 0xd6, 0x97, 0x16, 0x96,
- 0x6f, 0x2f, 0x2f, 0x2d, 0x56, 0x4e, 0x91, 0x2a, 0xbc, 0xa0, 0x60, 0x58, 0x4b, 0x0b, 0x6b, 0x5b,
- 0x4b, 0x96, 0xbd, 0x5e, 0x6b, 0x34, 0xb6, 0xd7, 0xac, 0xc5, 0x8a, 0x41, 0x2e, 0xc0, 0xd9, 0x0c,
- 0x84, 0xfb, 0xb7, 0x6b, 0x95, 0x5c, 0x5f, 0xd9, 0xea, 0xd2, 0x76, 0x6d, 0xc5, 0xae, 0xaf, 0x6d,
- 0x54, 0xf2, 0xd7, 0xde, 0x67, 0x56, 0x48, 0xf2, 0xb2, 0x06, 0x29, 0x42, 0x61, 0x75, 0x6d, 0x75,
- 0xa9, 0x72, 0x8a, 0x8c, 0xc3, 0xd8, 0xfa, 0xd2, 0xea, 0xe2, 0xf2, 0xea, 0x1d, 0xde, 0xad, 0xb5,
- 0xf5, 0x75, 0x6b, 0x6d, 0x6b, 0x69, 0xb1, 0x92, 0x63, 0x7d, 0xb7, 0xb8, 0xb4, 0xca, 0x6a, 0x96,
- 0xbf, 0x66, 0xf2, 0x6c, 0xd2, 0x5a, 0x9a, 0x52, 0xd6, 0x5b, 0x4b, 0x5f, 0xdd, 0x58, 0x5a, 0x6d,
- 0x2c, 0xaf, 0xad, 0x56, 0x4e, 0x5d, 0xbb, 0x98, 0xc2, 0x91, 0x23, 0xd1, 0x68, 0xdc, 0xad, 0x9c,
- 0xba, 0xf6, 0x0d, 0x28, 0xab, 0x8b, 0x30, 0x39, 0x07, 0xa7, 0xd5, 0xdf, 0xeb, 0xb4, 0xe3, 0x7a,
- 0x9d, 0xdd, 0xca, 0xa9, 0x74, 0x81, 0xd5, 0xeb, 0x74, 0x58, 0x01, 0x36, 0x5e, 0x2d, 0xd8, 0xa0,
- 0x41, 0xdb, 0xeb, 0xb0, 0xf5, 0xb5, 0x92, 0xab, 0x57, 0xbe, 0xff, 0x57, 0x2f, 0x9d, 0xfa, 0xfe,
- 0x0f, 0x5e, 0x32, 0xfe, 0xfc, 0x07, 0x2f, 0x19, 0xff, 0xed, 0x07, 0x2f, 0x19, 0x3b, 0xa3, 0x28,
- 0xe8, 0x37, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x6c, 0xb1, 0xb1, 0xbb, 0xb7, 0x00,
- 0x00,
+ 0xe2, 0x5d, 0x54, 0x07, 0x23, 0x41, 0x36, 0x2d, 0x28, 0xab, 0xda, 0x84, 0xd4, 0x61, 0x42, 0xec,
+ 0xa1, 0x84, 0x15, 0xc2, 0xfb, 0xf9, 0x0a, 0x5b, 0xde, 0x04, 0xb7, 0xfe, 0x3d, 0x9d, 0x4e, 0x62,
+ 0xfe, 0x6c, 0x0e, 0x8a, 0x02, 0x32, 0xf7, 0x8c, 0x1a, 0x48, 0x6f, 0x68, 0x06, 0x92, 0xd4, 0xbb,
+ 0x8a, 0xe5, 0x3e, 0x77, 0xc2, 0x06, 0xec, 0x2d, 0x28, 0xcb, 0x2e, 0x40, 0x3b, 0xf3, 0x55, 0x18,
+ 0x93, 0x2e, 0x04, 0x6e, 0x65, 0x4e, 0x69, 0x3c, 0x37, 0xe7, 0x2c, 0x59, 0x6e, 0x7e, 0x7b, 0x44,
+ 0xd2, 0xf2, 0x2f, 0xb1, 0x2e, 0xac, 0xb9, 0x6e, 0xa0, 0x76, 0xa1, 0xe3, 0xba, 0x81, 0x85, 0x50,
+ 0x36, 0xf8, 0x6b, 0xbd, 0xed, 0x96, 0xd7, 0x44, 0x1c, 0x65, 0x26, 0x76, 0x11, 0x6a, 0x33, 0x54,
+ 0x75, 0xf0, 0x13, 0x64, 0x6d, 0xff, 0x93, 0x3f, 0x76, 0xff, 0xf3, 0x63, 0x50, 0x9a, 0x6f, 0xbb,
+ 0x9a, 0x7d, 0x64, 0x66, 0x74, 0xca, 0xcd, 0x18, 0x89, 0x5b, 0x46, 0x57, 0x44, 0x1f, 0x9d, 0x6b,
+ 0xb6, 0xdd, 0x7e, 0xab, 0x28, 0x61, 0xa9, 0x6d, 0x60, 0x46, 0x9e, 0x64, 0x03, 0xf3, 0x26, 0x94,
+ 0x36, 0x42, 0xba, 0xde, 0xeb, 0x74, 0x68, 0x0b, 0x6d, 0xa5, 0x22, 0xd7, 0x67, 0xbd, 0x90, 0xda,
+ 0x11, 0x42, 0xd5, 0x0a, 0xc4, 0xa8, 0xaa, 0x58, 0x8d, 0x1d, 0x23, 0x56, 0x9f, 0x87, 0x42, 0xad,
+ 0xdb, 0x95, 0x3b, 0xbb, 0x78, 0xf1, 0xee, 0x76, 0x71, 0x39, 0x9d, 0x74, 0xba, 0x5d, 0x7d, 0x9f,
+ 0x86, 0xd8, 0x84, 0x02, 0xb9, 0xdf, 0xdb, 0xa6, 0x41, 0x87, 0x46, 0x34, 0x14, 0xea, 0x3e, 0x9c,
+ 0x01, 0xe4, 0x31, 0x23, 0x1d, 0xe8, 0x69, 0x04, 0xdc, 0x95, 0x5f, 0xdc, 0xef, 0x6d, 0x53, 0x5b,
+ 0xac, 0x1b, 0x6a, 0xdf, 0x65, 0x30, 0xbc, 0xdc, 0x80, 0x49, 0xbd, 0xff, 0x9f, 0x82, 0xc5, 0xf3,
+ 0x41, 0xa1, 0x58, 0xac, 0x94, 0xcc, 0x9f, 0xcf, 0xc1, 0x78, 0xad, 0xdb, 0x7d, 0xc6, 0xdd, 0x2b,
+ 0x3f, 0xa2, 0xcd, 0xea, 0x0b, 0xc9, 0xe8, 0x9d, 0xc2, 0xb3, 0xf2, 0x97, 0x06, 0x4c, 0xa5, 0x28,
+ 0xd4, 0xda, 0x1b, 0x43, 0xba, 0x1b, 0x72, 0x43, 0xba, 0x1b, 0xf2, 0x83, 0xdd, 0x0d, 0xea, 0x9c,
+ 0x29, 0x3c, 0xc9, 0x9c, 0x79, 0x05, 0xf2, 0xb5, 0x6e, 0x57, 0xf4, 0x4a, 0x39, 0xe9, 0x95, 0xcd,
+ 0xdb, 0x7c, 0x71, 0x73, 0xba, 0x5d, 0x8b, 0x61, 0x98, 0xaf, 0x43, 0x09, 0xc1, 0xa8, 0xd1, 0xae,
+ 0x8a, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0xdf, 0x06, 0x8c, 0xe0, 0xef, 0x67,
+ 0x54, 0x5c, 0xe6, 0x34, 0x71, 0xa9, 0x28, 0xe2, 0x32, 0x8c, 0xa0, 0xfc, 0x41, 0x1e, 0x7b, 0x4b,
+ 0x88, 0x88, 0xd8, 0xb0, 0x1a, 0x19, 0x1b, 0xd6, 0x27, 0x50, 0xe0, 0xfb, 0xe9, 0xad, 0x6b, 0x1e,
+ 0x07, 0xe3, 0xc5, 0x74, 0x55, 0x9f, 0xca, 0xae, 0xf5, 0x1e, 0x90, 0xa5, 0x4e, 0x48, 0x9b, 0xbd,
+ 0x80, 0x36, 0xf6, 0xbd, 0xee, 0x26, 0x0d, 0xbc, 0x9d, 0x03, 0x61, 0x6d, 0xa2, 0x8e, 0xf5, 0x44,
+ 0xa9, 0x1d, 0xee, 0x7b, 0x5d, 0x66, 0x26, 0x78, 0x3b, 0x07, 0x56, 0x06, 0x0d, 0x79, 0x1f, 0xc6,
+ 0x2c, 0xfa, 0x28, 0xf0, 0x22, 0x2a, 0xfa, 0x76, 0x32, 0xde, 0x5b, 0x20, 0x94, 0xdb, 0x3b, 0x01,
+ 0xff, 0xa1, 0x8e, 0xbf, 0x28, 0xff, 0xe4, 0xf6, 0x77, 0xdf, 0x19, 0xc1, 0xb9, 0x70, 0xc2, 0x31,
+ 0xe0, 0x31, 0xde, 0x07, 0x7d, 0x30, 0xf3, 0xa7, 0x19, 0xcc, 0x4d, 0x28, 0xb3, 0x2d, 0x65, 0xca,
+ 0x0d, 0x71, 0x25, 0x19, 0xcb, 0x9b, 0x6a, 0xf1, 0x71, 0x27, 0x80, 0x1a, 0x1f, 0x62, 0xa7, 0x85,
+ 0x84, 0x9f, 0x2c, 0x3e, 0xaf, 0x30, 0xce, 0x10, 0x8f, 0x58, 0x75, 0x34, 0x79, 0x67, 0x9d, 0x5a,
+ 0x30, 0x46, 0x9f, 0x4c, 0x30, 0xc6, 0x3e, 0x8e, 0x60, 0xa4, 0xcf, 0x5e, 0x8b, 0xa7, 0x39, 0x7b,
+ 0xbd, 0xfc, 0x3e, 0x4c, 0xf7, 0xf5, 0xf0, 0x69, 0xce, 0x2f, 0x3f, 0x39, 0xb1, 0xfc, 0xa9, 0xb8,
+ 0x5f, 0xc8, 0x1c, 0x6e, 0x71, 0xbd, 0x80, 0x36, 0x23, 0x54, 0xbd, 0x42, 0x5b, 0x06, 0x02, 0x96,
+ 0xda, 0x83, 0x23, 0x8c, 0xbc, 0x07, 0x63, 0xfc, 0xfc, 0x27, 0x9c, 0xc9, 0xe1, 0xd8, 0x4f, 0x88,
+ 0x2f, 0x72, 0xa8, 0x38, 0x84, 0xe7, 0x18, 0x6a, 0xaf, 0x0a, 0x22, 0xf3, 0x2e, 0x8c, 0x8a, 0xf3,
+ 0xa3, 0xe3, 0xe7, 0x45, 0x15, 0x46, 0x36, 0x93, 0x9e, 0x41, 0x9f, 0x3f, 0x6f, 0x84, 0xc5, 0xe1,
+ 0xe6, 0x2f, 0x1a, 0x30, 0xa9, 0xb7, 0x92, 0xdc, 0x84, 0x51, 0x71, 0xc0, 0x69, 0xe0, 0x01, 0x27,
+ 0x6b, 0xcd, 0x28, 0x3f, 0xda, 0xd4, 0x0e, 0x34, 0x05, 0x16, 0x53, 0xfd, 0x82, 0x03, 0xb6, 0x45,
+ 0xa8, 0x7e, 0x21, 0xa4, 0x96, 0x2c, 0x63, 0xdb, 0x38, 0x8b, 0x86, 0xbd, 0x56, 0xa4, 0x6e, 0xe3,
+ 0x02, 0x84, 0x58, 0xa2, 0xc4, 0x3c, 0x34, 0x00, 0x1a, 0x8d, 0x7b, 0xf7, 0xe9, 0xc1, 0x9a, 0xe3,
+ 0x05, 0xb8, 0x15, 0xc6, 0xd9, 0x78, 0x5f, 0x8c, 0x56, 0x59, 0x6c, 0x85, 0xf9, 0xcc, 0xdd, 0xa7,
+ 0x07, 0xda, 0x56, 0x58, 0xa2, 0xe2, 0x94, 0x0f, 0xbc, 0x87, 0x4e, 0x44, 0x19, 0x61, 0x0e, 0x09,
+ 0xf9, 0x94, 0xe7, 0xd0, 0x14, 0xa5, 0x82, 0x4c, 0xbe, 0x0e, 0x93, 0xc9, 0x2f, 0x8c, 0xaa, 0xc8,
+ 0xe3, 0x3e, 0x51, 0x4a, 0x84, 0x5e, 0x58, 0x7f, 0xe1, 0xe8, 0xb0, 0x7a, 0x59, 0xe1, 0x6a, 0x33,
+ 0x2c, 0x85, 0x75, 0x8a, 0x99, 0xf9, 0x3b, 0x06, 0xc0, 0xfa, 0x72, 0x43, 0x36, 0xf0, 0x1a, 0x14,
+ 0x62, 0x2f, 0x55, 0x99, 0xef, 0xb7, 0x53, 0x1b, 0x4a, 0x2c, 0x27, 0x2f, 0x42, 0x3e, 0x69, 0xc9,
+ 0xf4, 0xd1, 0x61, 0x75, 0x42, 0x6f, 0x01, 0x2b, 0x25, 0x77, 0x61, 0x6c, 0xa8, 0x3a, 0xa3, 0x74,
+ 0x66, 0xd4, 0x55, 0x52, 0xe3, 0x28, 0x7c, 0xb0, 0xb5, 0xfe, 0xe9, 0x1d, 0x85, 0x6f, 0xe5, 0x60,
+ 0x8a, 0xf5, 0x6b, 0xad, 0x17, 0xed, 0xf9, 0x81, 0x17, 0x1d, 0x3c, 0xb3, 0xbb, 0xe2, 0x77, 0x34,
+ 0x83, 0xe8, 0xb2, 0x54, 0x5b, 0x6a, 0xdb, 0x86, 0xda, 0x1c, 0xff, 0xf9, 0x18, 0x9c, 0xcd, 0xa0,
+ 0x22, 0xaf, 0x89, 0xd0, 0xa2, 0xc4, 0x0f, 0x85, 0xa1, 0x43, 0x3f, 0x3c, 0xac, 0x96, 0x25, 0xfa,
+ 0x7a, 0x12, 0x4a, 0x34, 0x07, 0xe3, 0x62, 0xeb, 0xb3, 0x92, 0x58, 0xd4, 0x18, 0x93, 0x22, 0xfd,
+ 0x6c, 0xa8, 0x9a, 0x54, 0x24, 0x52, 0x83, 0xf2, 0xfc, 0x1e, 0x6d, 0xee, 0x7b, 0x9d, 0xdd, 0xfb,
+ 0xf4, 0x80, 0xdb, 0x4b, 0xe5, 0xfa, 0xf3, 0x6c, 0xa7, 0xd5, 0x14, 0x70, 0x36, 0xa4, 0xfa, 0x26,
+ 0x4e, 0x23, 0x21, 0xef, 0xc1, 0x78, 0xc3, 0xdb, 0xed, 0x48, 0x0e, 0x05, 0xe4, 0x70, 0xe5, 0xe8,
+ 0xb0, 0x7a, 0x21, 0xe4, 0xe0, 0x7e, 0x06, 0x2a, 0x01, 0x79, 0x15, 0x46, 0x2c, 0xbf, 0x45, 0xf9,
+ 0x32, 0x2c, 0x82, 0x55, 0x02, 0x06, 0x50, 0x5d, 0xb7, 0x88, 0x41, 0xee, 0xc1, 0x18, 0xfb, 0xe7,
+ 0x81, 0xd3, 0x9d, 0x19, 0x45, 0xbd, 0x4d, 0x62, 0x03, 0x1f, 0xa1, 0x5d, 0xaf, 0xb3, 0xab, 0xda,
+ 0xf8, 0x2d, 0x6a, 0xb7, 0x9d, 0xae, 0xb6, 0x2e, 0x72, 0x44, 0xb2, 0x09, 0xe3, 0x89, 0x22, 0x08,
+ 0x67, 0xc6, 0xb4, 0x83, 0xae, 0xa4, 0xa4, 0xfe, 0x19, 0xc1, 0xec, 0x62, 0xd4, 0x0a, 0x51, 0xb6,
+ 0xbb, 0x0c, 0x5f, 0x6f, 0x8c, 0xc2, 0x48, 0xdb, 0x83, 0x14, 0x07, 0xef, 0x41, 0x8c, 0x13, 0xf7,
+ 0x20, 0x2e, 0x80, 0xe8, 0xa4, 0x5a, 0x6b, 0x57, 0xc4, 0x96, 0xbd, 0x3a, 0x58, 0xc0, 0x6e, 0x26,
+ 0xc8, 0x38, 0x27, 0xb9, 0xb7, 0x4b, 0xf4, 0xbf, 0xd3, 0xda, 0xd5, 0xbc, 0x5d, 0x31, 0x2a, 0xeb,
+ 0x86, 0x44, 0xd5, 0xc8, 0x1d, 0xb8, 0xec, 0x86, 0xa4, 0x24, 0xe9, 0x86, 0x8f, 0x1e, 0x45, 0x83,
+ 0xba, 0x41, 0x61, 0x44, 0x56, 0x00, 0x6a, 0xcd, 0xc8, 0x7b, 0x48, 0x51, 0x24, 0xc6, 0xb5, 0x8e,
+ 0x98, 0xaf, 0xdd, 0xa7, 0x07, 0x0d, 0x1a, 0xc5, 0x61, 0x1b, 0xe7, 0x1d, 0x44, 0x4d, 0x89, 0x89,
+ 0xa5, 0x70, 0x20, 0x5d, 0x38, 0x5f, 0x73, 0x5d, 0x8f, 0xc7, 0x1b, 0xae, 0x07, 0x4c, 0x7e, 0x5d,
+ 0x64, 0x5d, 0xce, 0x66, 0xfd, 0xaa, 0x60, 0xfd, 0x19, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xfe,
+ 0x4c, 0x36, 0x63, 0x73, 0x15, 0x26, 0xf5, 0x2e, 0xd5, 0x23, 0xed, 0xca, 0x50, 0xb4, 0x1a, 0x35,
+ 0xbb, 0x71, 0xaf, 0x76, 0xab, 0x62, 0x90, 0x0a, 0x94, 0xc5, 0xaf, 0x39, 0x7b, 0xee, 0x8d, 0x37,
+ 0x2b, 0x39, 0x0d, 0xf2, 0xc6, 0xad, 0xb9, 0x4a, 0xde, 0xfc, 0x03, 0x03, 0x8a, 0xb2, 0x7e, 0xe4,
+ 0x4d, 0xc8, 0x37, 0x1a, 0xf7, 0x52, 0xe7, 0xab, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53,
+ 0x17, 0x99, 0x46, 0xe3, 0x1e, 0xa3, 0x5b, 0x5f, 0x6e, 0x08, 0xa3, 0x25, 0x43, 0x5c, 0xa7, 0x07,
+ 0x1c, 0x3a, 0xbd, 0x09, 0xf9, 0x0f, 0xb6, 0xd6, 0xc5, 0x6e, 0x28, 0x63, 0x7c, 0x91, 0xee, 0xa3,
+ 0x47, 0xea, 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x8d, 0x88, 0xb6, 0x1f, 0xc7,
+ 0xa0, 0x09, 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x65, 0xbf, 0xe9, 0xb4, 0x84, 0x35,
+ 0x82, 0x36, 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xd0, 0x80, 0xca, 0x5a, 0xe0, 0x3f, 0xf4,
+ 0x98, 0x06, 0x5e, 0xf7, 0xf7, 0x69, 0x67, 0xf3, 0x16, 0x79, 0x5d, 0x2a, 0x01, 0x6e, 0xc2, 0x5d,
+ 0x64, 0x54, 0xa8, 0x04, 0x7e, 0x78, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x2b, 0x97, 0x8a,
+ 0x40, 0x09, 0xe5, 0xcb, 0x0d, 0x1f, 0x1e, 0x74, 0x42, 0x28, 0x5f, 0x15, 0x46, 0xb0, 0x3a, 0x4a,
+ 0x84, 0xc6, 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0xdb, 0xb9, 0xbe, 0x36, 0xcc, 0x7d,
+ 0xaa, 0x42, 0x6c, 0xf4, 0xc6, 0x0d, 0xb5, 0x88, 0x7d, 0x05, 0xce, 0xa5, 0xbb, 0x04, 0xfd, 0x22,
+ 0x35, 0x98, 0xd2, 0xe1, 0xd2, 0x45, 0x72, 0x31, 0xf3, 0x5b, 0x9b, 0x73, 0x56, 0x1a, 0xdf, 0xfc,
+ 0xbe, 0x01, 0x25, 0xfc, 0xd7, 0xea, 0xb5, 0x28, 0xb3, 0x6c, 0x6a, 0x5b, 0x0d, 0x71, 0xc8, 0xa5,
+ 0x1e, 0x44, 0x39, 0x8f, 0x42, 0x5b, 0x9c, 0x88, 0x69, 0x7a, 0x24, 0x46, 0x16, 0xa4, 0xfc, 0x48,
+ 0x2f, 0x14, 0x12, 0x1a, 0x93, 0xf2, 0xb3, 0xbf, 0x30, 0x45, 0x2a, 0x90, 0xd9, 0xf8, 0xb1, 0x5f,
+ 0x7e, 0x4b, 0xba, 0x86, 0x71, 0xfc, 0x90, 0xce, 0xd7, 0x8e, 0x4e, 0x24, 0x1a, 0x79, 0x1d, 0x46,
+ 0xd9, 0xa7, 0x2d, 0x79, 0x30, 0x82, 0xbb, 0x0a, 0xac, 0x63, 0xa0, 0x9d, 0x30, 0x72, 0x24, 0xf3,
+ 0x9f, 0xe7, 0xd2, 0x1d, 0x28, 0xac, 0x80, 0x53, 0xce, 0x8d, 0xb7, 0x61, 0xa4, 0xd6, 0x6a, 0xf9,
+ 0x8f, 0x84, 0x96, 0x90, 0x6e, 0x9a, 0xb8, 0xff, 0xf8, 0x0a, 0xeb, 0x30, 0x14, 0xed, 0x68, 0x9b,
+ 0x01, 0xc8, 0x3c, 0x94, 0x6a, 0x5b, 0x8d, 0xa5, 0xa5, 0x85, 0xf5, 0xf5, 0x65, 0x11, 0x41, 0xfd,
+ 0xb2, 0xec, 0x1f, 0xcf, 0x73, 0xed, 0x28, 0x6a, 0x0d, 0x08, 0xb0, 0x4c, 0xe8, 0xc8, 0xbb, 0x00,
+ 0x1f, 0xf8, 0x5e, 0xe7, 0x01, 0x8d, 0xf6, 0x7c, 0x57, 0x34, 0x9e, 0x99, 0x14, 0xe3, 0x1f, 0xf9,
+ 0x5e, 0xc7, 0x6e, 0x23, 0x98, 0xd5, 0x3d, 0x41, 0xb2, 0x94, 0xff, 0x59, 0x4f, 0xd7, 0xfd, 0x08,
+ 0x6d, 0x98, 0x91, 0xa4, 0xa7, 0xb7, 0xfd, 0x28, 0x7d, 0x6e, 0x23, 0xd1, 0xcc, 0x5f, 0xca, 0xc1,
+ 0x24, 0xdf, 0xa9, 0x72, 0x81, 0x79, 0x66, 0x27, 0xe3, 0xdb, 0xda, 0x64, 0xbc, 0x24, 0x17, 0x06,
+ 0xa5, 0x69, 0x43, 0x4d, 0xc5, 0x3d, 0x20, 0xfd, 0x34, 0xc4, 0x92, 0xfe, 0x94, 0x61, 0x66, 0xe1,
+ 0xad, 0xe4, 0x3c, 0x3a, 0x44, 0x22, 0x1b, 0x55, 0x61, 0x68, 0x69, 0x3c, 0xcc, 0x5f, 0xcc, 0xc1,
+ 0x84, 0x62, 0x4f, 0x3e, 0xb3, 0x1d, 0xff, 0x45, 0xad, 0xe3, 0xe5, 0x19, 0x84, 0xd2, 0xb2, 0xa1,
+ 0xfa, 0xbd, 0x07, 0xd3, 0x7d, 0x24, 0x69, 0xb3, 0xdc, 0x18, 0xc6, 0x2c, 0x7f, 0xad, 0xff, 0xc0,
+ 0x9c, 0x47, 0x5b, 0xc7, 0x07, 0xe6, 0xea, 0x09, 0xfd, 0xb7, 0x72, 0x70, 0x4e, 0xfc, 0xaa, 0xf5,
+ 0x5c, 0x2f, 0x9a, 0xf7, 0x3b, 0x3b, 0xde, 0xee, 0x33, 0x3b, 0x16, 0x35, 0x6d, 0x2c, 0xaa, 0xfa,
+ 0x58, 0x28, 0x0d, 0x1c, 0x3c, 0x24, 0xe6, 0xbf, 0x2a, 0xc2, 0xcc, 0x20, 0x02, 0xb6, 0xed, 0x57,
+ 0x76, 0x55, 0xb8, 0xed, 0x4f, 0xed, 0x58, 0xf9, 0x7e, 0x2a, 0x09, 0x10, 0xc9, 0x0d, 0x11, 0x20,
+ 0xb2, 0x0c, 0x15, 0xfc, 0x54, 0x83, 0x86, 0xac, 0x13, 0xc2, 0x24, 0xd4, 0xf3, 0xea, 0xd1, 0x61,
+ 0xf5, 0x8a, 0xc3, 0xca, 0xec, 0x50, 0x14, 0xda, 0xbd, 0xc0, 0x53, 0x78, 0xf4, 0x51, 0x92, 0xdf,
+ 0x31, 0x60, 0x12, 0x81, 0x8b, 0x0f, 0x69, 0x27, 0x42, 0x66, 0x05, 0x71, 0x48, 0x13, 0xdf, 0xa8,
+ 0x69, 0x44, 0x81, 0xd7, 0xd9, 0x45, 0x47, 0x52, 0x58, 0xdf, 0x66, 0xbd, 0xf0, 0x67, 0x87, 0xd5,
+ 0x77, 0x3e, 0xce, 0x2d, 0x1d, 0xc1, 0x2a, 0x64, 0x1b, 0x79, 0x5e, 0x51, 0x8a, 0x9f, 0x4d, 0x55,
+ 0x33, 0x55, 0x23, 0xf2, 0xa3, 0x70, 0x71, 0xb1, 0xe3, 0x6c, 0xb7, 0xe8, 0xbc, 0xdf, 0x89, 0xbc,
+ 0x4e, 0xcf, 0xef, 0x85, 0x75, 0xa7, 0xb9, 0xdf, 0xeb, 0x86, 0xc2, 0xd9, 0x89, 0x2d, 0x6f, 0xc6,
+ 0x85, 0xf6, 0x36, 0x2f, 0x55, 0x58, 0x0e, 0x62, 0x40, 0xee, 0xc1, 0x34, 0x2f, 0xaa, 0xf5, 0x22,
+ 0xbf, 0xd1, 0x74, 0x5a, 0x5e, 0x67, 0x17, 0x7d, 0xa0, 0xc5, 0xfa, 0x65, 0xb6, 0xb7, 0x74, 0x7a,
+ 0x91, 0x6f, 0x87, 0x1c, 0xae, 0xf0, 0xeb, 0x27, 0x22, 0x4b, 0x30, 0x65, 0x51, 0xc7, 0x7d, 0xe0,
+ 0x3c, 0x9e, 0x77, 0xba, 0x4e, 0xd3, 0x8b, 0x0e, 0x70, 0x67, 0x96, 0xaf, 0x57, 0x8f, 0x0e, 0xab,
+ 0xcf, 0x05, 0xd4, 0x71, 0xed, 0xb6, 0xf3, 0xd8, 0x6e, 0x8a, 0x42, 0x85, 0x59, 0x9a, 0x2e, 0x66,
+ 0xe5, 0x75, 0x62, 0x56, 0xa5, 0x34, 0x2b, 0xaf, 0x33, 0x98, 0x55, 0x42, 0x27, 0x59, 0xad, 0x3b,
+ 0xc1, 0x2e, 0x8d, 0xb8, 0x93, 0x10, 0xae, 0x1a, 0xd7, 0x0d, 0x85, 0x55, 0x84, 0x65, 0x36, 0x3a,
+ 0x0c, 0xd3, 0xac, 0x14, 0x3a, 0x26, 0x79, 0x5b, 0x81, 0x17, 0x51, 0xb5, 0x85, 0xe3, 0x58, 0x2d,
+ 0xec, 0x7f, 0x74, 0x93, 0x0e, 0x6a, 0x62, 0x1f, 0x65, 0xc2, 0x4d, 0x69, 0x64, 0xb9, 0x8f, 0x5b,
+ 0x76, 0x2b, 0xfb, 0x28, 0x63, 0x6e, 0x6a, 0x3b, 0x27, 0xb0, 0x9d, 0x0a, 0xb7, 0x01, 0x0d, 0xed,
+ 0xa3, 0x24, 0x2b, 0xac, 0xd3, 0x22, 0xda, 0x61, 0x12, 0x2d, 0x9c, 0xa4, 0x93, 0x58, 0xb5, 0x97,
+ 0xc4, 0x9e, 0xba, 0x12, 0xc8, 0x62, 0x3b, 0xc3, 0x65, 0x9a, 0x26, 0xfe, 0xa0, 0x50, 0x1c, 0xa9,
+ 0x8c, 0x5a, 0x15, 0x2e, 0xf2, 0x11, 0x13, 0x1c, 0xd4, 0xc5, 0xe6, 0x6f, 0xe4, 0xe0, 0x92, 0x54,
+ 0xc7, 0x34, 0x7a, 0xe4, 0x07, 0xfb, 0x5e, 0x67, 0xf7, 0x19, 0xd7, 0xaa, 0x77, 0x34, 0xad, 0xfa,
+ 0x52, 0x6a, 0x85, 0x4b, 0xb5, 0xf2, 0x18, 0xd5, 0xfa, 0xa7, 0x23, 0xf0, 0xfc, 0xb1, 0x54, 0xe4,
+ 0x43, 0xb6, 0x0a, 0x7a, 0xb4, 0x13, 0x2d, 0xb9, 0x2d, 0xca, 0xb6, 0x61, 0x7e, 0x2f, 0x12, 0xce,
+ 0xec, 0x17, 0x8f, 0x0e, 0xab, 0x67, 0xf9, 0x45, 0x13, 0xdb, 0x73, 0x5b, 0xd4, 0x8e, 0x78, 0xb1,
+ 0x36, 0x4c, 0xfd, 0xd4, 0x8c, 0x65, 0x7c, 0xed, 0x6d, 0xa9, 0x13, 0xd1, 0xe0, 0xa1, 0xc3, 0xe3,
+ 0xed, 0x05, 0xcb, 0x7d, 0x4a, 0xbb, 0xb6, 0xc3, 0x4a, 0x6d, 0x4f, 0x14, 0xeb, 0x2c, 0xfb, 0xa8,
+ 0xc9, 0x1d, 0x85, 0xe5, 0x3c, 0xdb, 0x1c, 0x3c, 0x70, 0x1e, 0x0b, 0x8b, 0x17, 0xfd, 0xab, 0x0a,
+ 0x4b, 0x1e, 0x63, 0xd7, 0x76, 0x1e, 0x5b, 0xfd, 0x24, 0xe4, 0xeb, 0x70, 0x5e, 0x28, 0x6e, 0xa6,
+ 0xc4, 0x02, 0xbf, 0x25, 0x5b, 0x5c, 0x40, 0x5e, 0xaf, 0x1c, 0x1d, 0x56, 0x2f, 0x0a, 0xb5, 0x6f,
+ 0x37, 0x39, 0x46, 0x66, 0xab, 0xb3, 0xb9, 0x90, 0x75, 0xb6, 0x90, 0xa5, 0xba, 0xe3, 0x01, 0x0d,
+ 0x43, 0x67, 0x57, 0x5a, 0xc7, 0xfc, 0x44, 0x49, 0xe9, 0x4c, 0xbb, 0xcd, 0xcb, 0xad, 0x81, 0x94,
+ 0xe4, 0x1e, 0x4c, 0x6e, 0xd1, 0x6d, 0x75, 0x7c, 0x46, 0xe3, 0x29, 0x5e, 0x79, 0x44, 0xb7, 0x07,
+ 0x0f, 0x4e, 0x8a, 0x8e, 0x78, 0x30, 0xbd, 0x16, 0xf8, 0x8f, 0x0f, 0xd8, 0x56, 0x8f, 0x76, 0x68,
+ 0x80, 0xc1, 0x5d, 0x63, 0xe8, 0xae, 0x9a, 0x49, 0x2c, 0x4b, 0xbd, 0xbc, 0xfe, 0x99, 0xa3, 0xc3,
+ 0xea, 0xf3, 0x5d, 0x06, 0xb6, 0x5b, 0x02, 0x6e, 0xa7, 0x6e, 0x9d, 0xf5, 0x73, 0x25, 0x3f, 0x0e,
+ 0x53, 0x96, 0xdf, 0x8b, 0xbc, 0xce, 0x6e, 0x23, 0x0a, 0x9c, 0x88, 0xee, 0x72, 0x45, 0x9e, 0x44,
+ 0x91, 0xa5, 0x4a, 0xb9, 0x63, 0x3a, 0xe0, 0x40, 0x3b, 0x14, 0x50, 0x4d, 0x93, 0xea, 0x04, 0xe6,
+ 0xaf, 0xe5, 0x60, 0x46, 0x0c, 0x83, 0x45, 0x9b, 0x7e, 0xe0, 0x3e, 0xfb, 0xd3, 0x7e, 0x51, 0x9b,
+ 0xf6, 0x2f, 0xc6, 0x31, 0x4a, 0x59, 0x8d, 0x3c, 0x66, 0xd6, 0xff, 0xbe, 0x01, 0x57, 0x8e, 0x23,
+ 0x62, 0xbd, 0x13, 0xc7, 0xf5, 0x95, 0xfa, 0xe2, 0xf7, 0xba, 0x70, 0x16, 0xc7, 0x13, 0x1d, 0xc7,
+ 0xe1, 0x3d, 0x3f, 0x8c, 0xd0, 0x7b, 0x97, 0xd3, 0x02, 0x09, 0xea, 0xbe, 0xdf, 0x42, 0x3d, 0x5f,
+ 0x7f, 0x8d, 0xa9, 0xf3, 0x3f, 0x3b, 0xac, 0x02, 0x03, 0xf1, 0x48, 0x3c, 0xb6, 0xe6, 0x73, 0x89,
+ 0x41, 0xbf, 0x74, 0x68, 0x63, 0xf4, 0xc7, 0x3e, 0x3d, 0x08, 0xad, 0x2c, 0xd6, 0xe8, 0xa1, 0xa9,
+ 0xf5, 0xa2, 0xbd, 0xb5, 0x80, 0xee, 0xd0, 0x80, 0x76, 0x9a, 0xf4, 0x53, 0xe6, 0xa1, 0xd1, 0x1b,
+ 0x37, 0xd4, 0xf6, 0xe4, 0x2f, 0xc6, 0xe0, 0x5c, 0x16, 0x19, 0xeb, 0x17, 0xc5, 0x22, 0x4e, 0x5f,
+ 0x51, 0xfe, 0xff, 0x0d, 0x28, 0x37, 0x68, 0xd3, 0xef, 0xb8, 0x77, 0x9c, 0x66, 0xe4, 0xcb, 0x90,
+ 0x0c, 0x9b, 0x6b, 0x36, 0x06, 0xb7, 0x77, 0xb0, 0x40, 0xf3, 0x0c, 0x7c, 0x69, 0x38, 0x43, 0xb4,
+ 0xe9, 0x63, 0x20, 0x6c, 0xc4, 0x64, 0x32, 0xf9, 0x04, 0x9e, 0x6a, 0x68, 0x1f, 0x25, 0x75, 0x98,
+ 0x98, 0xf7, 0x3b, 0x1d, 0xca, 0x7e, 0x28, 0x61, 0x9d, 0x18, 0x88, 0xd9, 0x94, 0x05, 0x69, 0x0f,
+ 0x81, 0x4e, 0x42, 0x6e, 0x43, 0x7e, 0x63, 0xee, 0x8e, 0x18, 0x03, 0x19, 0xac, 0xb6, 0x31, 0x77,
+ 0x07, 0xf7, 0xba, 0xcc, 0x7e, 0x98, 0xe8, 0xcd, 0xed, 0xa8, 0x3e, 0xd0, 0x8d, 0xb9, 0x3b, 0x64,
+ 0x15, 0xa6, 0x2d, 0xfa, 0x8d, 0x9e, 0x17, 0x50, 0x31, 0x01, 0x1e, 0xdc, 0xa9, 0xe1, 0x58, 0x14,
+ 0xb9, 0x1e, 0x0b, 0x78, 0xa1, 0xb4, 0xed, 0xed, 0xf6, 0x8e, 0x7a, 0x2d, 0xaf, 0x9f, 0x96, 0xfc,
+ 0x34, 0x9c, 0x5f, 0xf0, 0x42, 0x51, 0x67, 0xee, 0x7c, 0x74, 0xf1, 0x1c, 0x72, 0x74, 0xc0, 0x74,
+ 0xf8, 0x42, 0xe6, 0x74, 0xf8, 0x8c, 0x1b, 0x33, 0xb1, 0xb9, 0x67, 0xd3, 0x4d, 0xc7, 0xc3, 0x66,
+ 0x7f, 0x87, 0x7c, 0x04, 0x93, 0xe8, 0xed, 0x41, 0x7f, 0x2c, 0x86, 0x48, 0x8f, 0x0d, 0xf8, 0xf2,
+ 0xe7, 0x32, 0xbf, 0x7c, 0x19, 0x9d, 0x47, 0x36, 0x7a, 0x75, 0x31, 0x9c, 0x5a, 0xdb, 0x23, 0x68,
+ 0x9c, 0xc9, 0x07, 0x30, 0x25, 0x16, 0x9d, 0xd5, 0x9d, 0xf5, 0x3d, 0xba, 0xe0, 0x1c, 0x88, 0x20,
+ 0x04, 0xb4, 0xff, 0xc4, 0x4a, 0x65, 0xfb, 0x3b, 0x76, 0xb4, 0x47, 0x6d, 0xd7, 0xd1, 0xd4, 0x73,
+ 0x8a, 0x90, 0xfc, 0x24, 0x8c, 0x2f, 0xfb, 0x78, 0xf0, 0x84, 0xaa, 0xa6, 0x84, 0x7c, 0xbe, 0x82,
+ 0xd7, 0x72, 0x39, 0x38, 0xb5, 0x88, 0xfc, 0xf0, 0xb0, 0xfa, 0xf6, 0x69, 0xa5, 0x50, 0xf9, 0x80,
+ 0xa5, 0x7e, 0x8d, 0xcc, 0x43, 0x71, 0x8b, 0x6e, 0xb3, 0xd6, 0xa6, 0xaf, 0x94, 0x49, 0x30, 0xd7,
+ 0x17, 0x8f, 0xc4, 0x2f, 0xf5, 0x54, 0x47, 0x62, 0x90, 0x00, 0xa6, 0xb1, 0x7f, 0xd6, 0x9c, 0x30,
+ 0x7c, 0xe4, 0x07, 0x6e, 0x8b, 0x86, 0xf2, 0x78, 0xa4, 0xbf, 0xf3, 0xe7, 0x32, 0x3b, 0xff, 0x0a,
+ 0xef, 0xfc, 0xae, 0xc2, 0x41, 0x15, 0xb7, 0x3e, 0xf6, 0xe6, 0xbf, 0x30, 0x50, 0xea, 0xc9, 0x0d,
+ 0x0c, 0x3e, 0x8b, 0xa3, 0xda, 0x71, 0x37, 0xeb, 0x74, 0xbb, 0x7a, 0x5c, 0x3a, 0x47, 0x61, 0x5b,
+ 0xdf, 0x3b, 0x4e, 0x93, 0x46, 0xd2, 0x47, 0x8a, 0xc8, 0x3b, 0x08, 0x51, 0xb7, 0xbe, 0x1c, 0x87,
+ 0x7c, 0x19, 0xce, 0x2d, 0xd0, 0x87, 0x5e, 0x93, 0xd6, 0xa2, 0x88, 0x86, 0xbc, 0x87, 0xe7, 0x6b,
+ 0xfc, 0x30, 0xb1, 0x54, 0x7f, 0xe9, 0xe8, 0xb0, 0x7a, 0xd5, 0xc5, 0x72, 0xdb, 0x49, 0x10, 0xec,
+ 0xa6, 0xa3, 0xf2, 0xca, 0xe4, 0x60, 0xfe, 0x4f, 0x23, 0xe9, 0x75, 0xf2, 0x0a, 0x14, 0xac, 0xb5,
+ 0xb8, 0xfe, 0xfc, 0x9c, 0x30, 0x55, 0x7d, 0x44, 0x20, 0x5f, 0x85, 0xf3, 0x0a, 0x1f, 0xec, 0x11,
+ 0xea, 0xb2, 0x0a, 0xf1, 0xc6, 0xbc, 0x8c, 0x07, 0x43, 0x4a, 0x4d, 0x1c, 0x8e, 0x91, 0xaa, 0x51,
+ 0x36, 0x0f, 0xd6, 0x58, 0xa5, 0x60, 0x81, 0x76, 0x3c, 0xce, 0x5b, 0x69, 0xac, 0xca, 0xdb, 0x45,
+ 0x84, 0x74, 0x63, 0xb3, 0x38, 0x7c, 0x50, 0x28, 0x16, 0x2a, 0x23, 0xe6, 0x5f, 0x1a, 0x4a, 0x4e,
+ 0x85, 0x67, 0x74, 0xc5, 0x7a, 0x53, 0x5b, 0xb1, 0xce, 0x09, 0xd2, 0xb8, 0x55, 0xac, 0x2c, 0xd3,
+ 0xca, 0x98, 0x82, 0x09, 0x0d, 0x09, 0xc3, 0x6c, 0x37, 0x42, 0x1a, 0x70, 0x9f, 0xe4, 0xa7, 0x2b,
+ 0xcc, 0x36, 0x6e, 0xd7, 0x50, 0xd1, 0x93, 0x7f, 0x6e, 0xc0, 0x54, 0x8a, 0x82, 0xf5, 0x06, 0x03,
+ 0xa9, 0xbd, 0xd1, 0x0b, 0x69, 0x60, 0x21, 0x94, 0x07, 0xe5, 0x2d, 0xeb, 0x41, 0x79, 0x2d, 0x8b,
+ 0xc1, 0xc8, 0x97, 0x60, 0x64, 0x03, 0x77, 0x10, 0x7a, 0x5c, 0x47, 0xcc, 0x1f, 0x0b, 0xf9, 0x0c,
+ 0xeb, 0xb1, 0x7f, 0x55, 0x05, 0x81, 0x65, 0xa4, 0x01, 0x63, 0xf3, 0x01, 0xc5, 0xec, 0x09, 0x85,
+ 0xe1, 0x0f, 0xe0, 0x9a, 0x9c, 0x24, 0x7d, 0x00, 0x27, 0x38, 0x99, 0xbf, 0x9a, 0x03, 0x92, 0xb4,
+ 0x91, 0x36, 0x03, 0x1a, 0x85, 0xcf, 0xec, 0xa0, 0xbf, 0xaf, 0x0d, 0xfa, 0xf3, 0x7d, 0x83, 0xce,
+ 0x9b, 0x37, 0xd4, 0xd8, 0xff, 0xa1, 0x01, 0x17, 0xb2, 0x09, 0xc9, 0x8b, 0x30, 0xba, 0xba, 0xbe,
+ 0x26, 0x43, 0x83, 0x44, 0x53, 0xfc, 0x2e, 0x5a, 0xc6, 0x96, 0x28, 0x22, 0xaf, 0xc3, 0xe8, 0x87,
+ 0xd6, 0x3c, 0x5b, 0x32, 0x95, 0xdb, 0x33, 0xdf, 0x08, 0xec, 0xa6, 0xbe, 0xe5, 0x12, 0x48, 0xea,
+ 0xd8, 0xe6, 0x9f, 0xda, 0xd8, 0x7e, 0x2b, 0x07, 0x53, 0xb5, 0x66, 0x93, 0x86, 0x21, 0x33, 0x88,
+ 0x68, 0x18, 0x3d, 0xb3, 0x03, 0x9b, 0x1d, 0xf4, 0xa3, 0xb5, 0x6d, 0xa8, 0x51, 0xfd, 0x23, 0x03,
+ 0xce, 0x4b, 0xaa, 0x87, 0x1e, 0x7d, 0xb4, 0xbe, 0x17, 0xd0, 0x70, 0xcf, 0x6f, 0xb9, 0xc3, 0xde,
+ 0x03, 0xc3, 0x55, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x1d, 0xd4, 0x3b, 0x08, 0xd1, 0x56, 0x69, 0x84,
+ 0x90, 0x59, 0x18, 0xab, 0x75, 0xbb, 0x81, 0xff, 0x90, 0x4f, 0xfb, 0x09, 0x71, 0x1e, 0xc9, 0x41,
+ 0xda, 0xf9, 0x25, 0x07, 0xb1, 0x6a, 0x2c, 0xd0, 0x0e, 0x8f, 0x68, 0x9e, 0xe0, 0xd5, 0x70, 0x69,
+ 0x47, 0xb5, 0xd0, 0xb0, 0xdc, 0xfc, 0x66, 0x01, 0xca, 0x6a, 0x43, 0x88, 0x09, 0xa3, 0x3c, 0x3c,
+ 0x45, 0x0d, 0x13, 0x70, 0x10, 0x62, 0x89, 0x92, 0x24, 0xea, 0x27, 0x77, 0x62, 0xd4, 0xcf, 0x16,
+ 0x4c, 0xac, 0x05, 0x7e, 0xd7, 0x0f, 0xa9, 0xcb, 0x13, 0xe0, 0x70, 0xad, 0x75, 0x36, 0x0e, 0x85,
+ 0xe5, 0x7d, 0xce, 0x8a, 0xf8, 0x76, 0xa0, 0x2b, 0xb0, 0xed, 0x74, 0x7a, 0x1c, 0x9d, 0x0f, 0x77,
+ 0xf0, 0x3b, 0xa1, 0xb8, 0x2e, 0x10, 0x3b, 0xf8, 0x19, 0x44, 0x77, 0xf0, 0x33, 0x88, 0x3a, 0x2d,
+ 0x46, 0x9e, 0xd6, 0xb4, 0x20, 0xbf, 0x6a, 0xc0, 0x78, 0xad, 0xd3, 0x11, 0x51, 0x3f, 0xf2, 0x16,
+ 0xf9, 0xf9, 0xc4, 0xc9, 0xcf, 0xc3, 0x42, 0xb9, 0x8f, 0xff, 0x6b, 0xc2, 0xc7, 0xff, 0xf6, 0xc7,
+ 0xf2, 0xf1, 0xaf, 0x07, 0x8e, 0x17, 0x85, 0x78, 0x98, 0x9b, 0x7c, 0x50, 0x0d, 0xfd, 0x55, 0xea,
+ 0x41, 0xde, 0x86, 0x4a, 0x2c, 0x8f, 0x4b, 0x1d, 0x97, 0x3e, 0xa6, 0x3c, 0x48, 0x6a, 0x82, 0xdf,
+ 0x30, 0xd4, 0x0e, 0x2f, 0xd2, 0x88, 0xe6, 0xb7, 0x0c, 0xb8, 0xa0, 0x0a, 0x44, 0xa3, 0xb7, 0xdd,
+ 0xf6, 0x70, 0xfb, 0x43, 0x6e, 0x42, 0x49, 0x8c, 0x57, 0x6c, 0xc8, 0xf5, 0x67, 0x4d, 0x4a, 0x50,
+ 0xc8, 0x22, 0x1b, 0x22, 0xc6, 0x43, 0xf8, 0x0a, 0xce, 0xa6, 0xa6, 0x1b, 0x2b, 0xaa, 0xcf, 0x88,
+ 0xce, 0xae, 0x04, 0xf8, 0x5b, 0x1f, 0x3b, 0x06, 0x31, 0xdf, 0x83, 0x69, 0xbd, 0x96, 0x0d, 0x8a,
+ 0x57, 0xd0, 0x64, 0xd3, 0x8c, 0xec, 0xa6, 0xc9, 0x72, 0x73, 0x0b, 0x48, 0x1f, 0x7d, 0x88, 0x07,
+ 0x55, 0x34, 0x92, 0x07, 0xa9, 0xd2, 0xdd, 0xd5, 0x87, 0x18, 0xe7, 0x0f, 0x1b, 0x57, 0xbb, 0x1b,
+ 0x49, 0xcd, 0x3f, 0x06, 0x38, 0x9b, 0xa1, 0x3a, 0x4e, 0x58, 0xda, 0xab, 0xfa, 0xe4, 0x29, 0xc5,
+ 0x11, 0x01, 0x72, 0xca, 0xbc, 0x27, 0x73, 0x45, 0x1d, 0x33, 0x55, 0x8e, 0x4b, 0x20, 0xf5, 0x49,
+ 0x2c, 0xef, 0x6a, 0xd0, 0xce, 0xc8, 0x53, 0x0b, 0xda, 0xa9, 0xc3, 0x84, 0x68, 0x95, 0x98, 0xca,
+ 0xa3, 0x89, 0x5b, 0x20, 0xe0, 0x05, 0x76, 0xdf, 0x94, 0xd6, 0x49, 0x38, 0x8f, 0xd0, 0x6f, 0x3d,
+ 0xa4, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x0b, 0x32, 0x79, 0x28, 0x24, 0xe4, 0x1f, 0x19, 0x40, 0x04,
+ 0x44, 0x9d, 0xcf, 0xc5, 0xe3, 0xe6, 0xb3, 0xfb, 0x74, 0xe6, 0xf3, 0xf3, 0xb2, 0x8e, 0xd9, 0xf3,
+ 0x3a, 0xa3, 0x5a, 0xe4, 0x1f, 0x18, 0x30, 0xcd, 0x23, 0x47, 0xd4, 0xca, 0x96, 0x8e, 0xab, 0x6c,
+ 0xf3, 0xe9, 0x54, 0xf6, 0x4a, 0x88, 0x9f, 0x1d, 0x50, 0xd7, 0xfe, 0x4a, 0x91, 0x1f, 0x05, 0x88,
+ 0x67, 0x94, 0x8c, 0x50, 0xbc, 0x92, 0xa1, 0x05, 0x62, 0xa4, 0xe4, 0x92, 0x65, 0x14, 0xd3, 0xa9,
+ 0x31, 0x3d, 0x09, 0x37, 0xf2, 0xd3, 0x70, 0x8e, 0xcd, 0x97, 0x18, 0x22, 0xe2, 0xdc, 0x66, 0xc6,
+ 0xf1, 0x2b, 0x9f, 0x1f, 0xbc, 0xb4, 0xdf, 0xcc, 0x22, 0xe3, 0xf7, 0x44, 0x92, 0x6b, 0xfc, 0x51,
+ 0x5b, 0xdd, 0xf2, 0x65, 0x51, 0x60, 0x40, 0x2b, 0xd6, 0x3e, 0x9c, 0x29, 0xe3, 0x37, 0x33, 0xf5,
+ 0xdb, 0x25, 0x39, 0x17, 0xb8, 0x7e, 0x0b, 0xf5, 0x8b, 0x1e, 0x08, 0x22, 0x1f, 0x02, 0x69, 0xf4,
+ 0x76, 0x77, 0x69, 0x18, 0x51, 0x97, 0xc3, 0x68, 0x10, 0xce, 0x4c, 0xa0, 0x7e, 0x40, 0x37, 0x55,
+ 0x28, 0x4b, 0xed, 0x40, 0x16, 0xab, 0x42, 0xd2, 0x4f, 0x4c, 0x56, 0xe0, 0x9c, 0x68, 0x34, 0x83,
+ 0xca, 0x9b, 0xf5, 0xe1, 0xcc, 0x24, 0x32, 0xc5, 0x53, 0x58, 0xe5, 0x1e, 0xbe, 0xb6, 0xbf, 0xcd,
+ 0xa2, 0xbb, 0xbc, 0x0d, 0x97, 0x06, 0x76, 0x5b, 0xc6, 0xa5, 0x90, 0x59, 0xfd, 0x52, 0xc8, 0xa5,
+ 0x41, 0xea, 0x35, 0x54, 0x2f, 0x86, 0xfc, 0x96, 0x91, 0xd2, 0xa7, 0xc2, 0xf8, 0xe1, 0x69, 0xfa,
+ 0x06, 0x2d, 0x38, 0x39, 0x4c, 0x18, 0xc0, 0x35, 0x6e, 0x2e, 0x31, 0xba, 0x98, 0xc6, 0x55, 0x35,
+ 0x36, 0xea, 0xde, 0x27, 0x54, 0xad, 0xe6, 0x3f, 0x35, 0x80, 0xf0, 0x1a, 0xce, 0x3b, 0x5d, 0x67,
+ 0xdb, 0x6b, 0x79, 0x91, 0x47, 0x43, 0x72, 0x1f, 0x2a, 0x82, 0x85, 0xb3, 0xdd, 0xa2, 0x6a, 0xbc,
+ 0x97, 0x38, 0x10, 0x8e, 0xcb, 0xec, 0xb4, 0x99, 0xd4, 0x47, 0x38, 0x40, 0x18, 0x72, 0x4f, 0x20,
+ 0x0c, 0xe6, 0x0f, 0x0c, 0xb8, 0xd4, 0x5f, 0x6d, 0xf1, 0xe5, 0xb8, 0xf3, 0x8c, 0x13, 0x3a, 0x2f,
+ 0xab, 0x95, 0x39, 0x74, 0xa5, 0x3e, 0xb5, 0x56, 0xe6, 0x13, 0xcf, 0xec, 0xe9, 0x5b, 0xf9, 0x0b,
+ 0x39, 0x28, 0xaf, 0xb5, 0x7a, 0xbb, 0x5e, 0x67, 0xc1, 0x89, 0x9c, 0x67, 0x76, 0x8b, 0xf2, 0x96,
+ 0xb6, 0x45, 0x89, 0x23, 0xbc, 0xe2, 0x86, 0x0d, 0x97, 0x32, 0xcd, 0x80, 0xa9, 0x84, 0x84, 0xcf,
+ 0xd2, 0x7b, 0x50, 0x60, 0x3f, 0x84, 0xc5, 0x73, 0xb5, 0x8f, 0x31, 0x62, 0xdd, 0x8c, 0xff, 0x13,
+ 0x9b, 0x06, 0x3d, 0x51, 0x1d, 0x72, 0xb8, 0xfc, 0x05, 0x9e, 0x67, 0xea, 0xf4, 0x39, 0x31, 0xff,
+ 0x89, 0x01, 0x95, 0x74, 0x4b, 0xc8, 0x7d, 0x18, 0x63, 0x9c, 0xbc, 0x38, 0x67, 0xd5, 0x4b, 0x03,
+ 0xda, 0x7c, 0x53, 0xa0, 0xf1, 0xea, 0x61, 0xe7, 0x53, 0x0e, 0xb1, 0x24, 0x87, 0xcb, 0x16, 0x94,
+ 0x55, 0xac, 0x8c, 0xda, 0xbd, 0xa6, 0xab, 0xa6, 0x0b, 0xd9, 0xfd, 0xa0, 0xd6, 0xfa, 0x37, 0xb5,
+ 0x5a, 0x0b, 0xa5, 0x34, 0x6c, 0xf2, 0x41, 0xbc, 0xe2, 0xc6, 0xf5, 0xa8, 0x2a, 0x67, 0x52, 0xf9,
+ 0xea, 0x57, 0xdc, 0x38, 0x8c, 0xed, 0x6d, 0xf8, 0xf7, 0x84, 0x9c, 0xe1, 0xde, 0xa6, 0x8b, 0x10,
+ 0xd5, 0x3e, 0xe6, 0x38, 0xe6, 0xdf, 0xce, 0xc3, 0x85, 0xa4, 0x7a, 0x3c, 0x15, 0xe3, 0x9a, 0x13,
+ 0x38, 0xed, 0xf0, 0x84, 0x19, 0x70, 0xbd, 0xaf, 0x6a, 0x78, 0x85, 0x5b, 0x56, 0x4d, 0xa9, 0x90,
+ 0x99, 0xaa, 0x10, 0x6e, 0x0a, 0x79, 0x85, 0x64, 0x35, 0xc8, 0x7d, 0xc8, 0x37, 0x68, 0x24, 0x2e,
+ 0x7a, 0x5e, 0xeb, 0xeb, 0x55, 0xb5, 0x5e, 0x37, 0x1b, 0x34, 0xe2, 0x83, 0xc8, 0x63, 0xe5, 0xa9,
+ 0x16, 0xbb, 0xce, 0xcc, 0xfb, 0x2d, 0x18, 0x5d, 0x7c, 0xdc, 0xa5, 0xcd, 0x48, 0xdc, 0xef, 0x7c,
+ 0xf5, 0x78, 0x7e, 0x1c, 0x57, 0xb9, 0x45, 0x4a, 0x11, 0xa0, 0x76, 0x16, 0x47, 0xb9, 0xfc, 0x26,
+ 0x14, 0xe5, 0xc7, 0x4f, 0x75, 0x1b, 0xf2, 0x2d, 0x18, 0x57, 0x3e, 0x72, 0x2a, 0xa1, 0xff, 0x2b,
+ 0x03, 0x46, 0x99, 0xd2, 0xdb, 0x7c, 0xe3, 0x19, 0xd5, 0x48, 0xb7, 0x35, 0x8d, 0x34, 0xad, 0x5c,
+ 0xdb, 0xc1, 0x79, 0xf9, 0xc6, 0x09, 0xba, 0xe8, 0xd0, 0x00, 0x48, 0x90, 0xc9, 0x5d, 0x18, 0x13,
+ 0xf9, 0x59, 0x44, 0x9e, 0x53, 0xf5, 0x1e, 0x90, 0xcc, 0x03, 0x15, 0x5b, 0x4d, 0x7e, 0x37, 0x6d,
+ 0x66, 0x4a, 0x6a, 0xb2, 0x90, 0xc4, 0x4a, 0xab, 0x17, 0x4f, 0x19, 0x9b, 0x79, 0xbf, 0xc3, 0xef,
+ 0x85, 0x28, 0x19, 0xa5, 0x06, 0x04, 0x4d, 0xd7, 0x84, 0xa3, 0x24, 0x7f, 0x1c, 0x93, 0x0b, 0x82,
+ 0x49, 0xb6, 0x0f, 0xe5, 0x7f, 0x8d, 0xf3, 0x9b, 0x16, 0xb2, 0x62, 0xef, 0x42, 0xf9, 0x8e, 0x1f,
+ 0x3c, 0x72, 0x02, 0xb7, 0xb6, 0x4b, 0x45, 0x94, 0x7b, 0x11, 0x43, 0xd5, 0x27, 0x76, 0x38, 0xdc,
+ 0x76, 0x58, 0xc1, 0x0f, 0x0f, 0xab, 0x85, 0xba, 0xef, 0xb7, 0x2c, 0x0d, 0x9d, 0xac, 0xc2, 0xc4,
+ 0x03, 0xe7, 0xb1, 0x38, 0x73, 0x5c, 0x5f, 0x5f, 0x16, 0xb1, 0x32, 0xaf, 0x1e, 0x1d, 0x56, 0x2f,
+ 0xb5, 0x9d, 0xc7, 0xf1, 0x59, 0xe5, 0xe0, 0x70, 0x6e, 0x9d, 0x9e, 0x78, 0x30, 0xb9, 0xe6, 0x07,
+ 0x91, 0xf8, 0x08, 0xb3, 0x91, 0xf3, 0x03, 0x4e, 0xad, 0x66, 0x33, 0x4f, 0xad, 0x2e, 0xb1, 0x8d,
+ 0x81, 0xbd, 0x13, 0x93, 0x6b, 0xd7, 0x03, 0x35, 0xc6, 0xe4, 0x5d, 0x98, 0x9e, 0xa7, 0x41, 0xe4,
+ 0xed, 0x78, 0x4d, 0x27, 0xa2, 0x77, 0xfc, 0xa0, 0xed, 0x44, 0xc2, 0x41, 0x83, 0x1b, 0xf4, 0x26,
+ 0xe5, 0x9c, 0xda, 0x4e, 0x64, 0xf5, 0x63, 0x92, 0xaf, 0x66, 0x45, 0x1f, 0x8d, 0x60, 0xf3, 0x5f,
+ 0x67, 0x46, 0x41, 0x46, 0xf4, 0xd1, 0x80, 0x2e, 0xc8, 0x88, 0x43, 0xda, 0x3d, 0xee, 0xe8, 0xb6,
+ 0x58, 0xbf, 0x25, 0x8e, 0x91, 0x4f, 0x3e, 0x9a, 0x8d, 0xc7, 0x6d, 0xc0, 0x11, 0xed, 0x1c, 0xe4,
+ 0xeb, 0x6b, 0x77, 0xd0, 0xe5, 0x22, 0x8e, 0x4a, 0x69, 0x67, 0xcf, 0xe9, 0x34, 0xd1, 0x96, 0x11,
+ 0xf1, 0x17, 0xaa, 0xc2, 0xab, 0xaf, 0xdd, 0x21, 0x0e, 0x9c, 0x5d, 0xa3, 0x41, 0xdb, 0x8b, 0xbe,
+ 0x7c, 0xeb, 0x96, 0x32, 0x50, 0x45, 0xac, 0xda, 0xac, 0xa8, 0x5a, 0xb5, 0x8b, 0x28, 0xf6, 0xe3,
+ 0x5b, 0xb7, 0x32, 0x87, 0x23, 0xae, 0x58, 0x16, 0x2f, 0xb2, 0x08, 0x93, 0x0f, 0x9c, 0xc7, 0xe2,
+ 0x50, 0x3d, 0xde, 0x33, 0xe6, 0x31, 0xba, 0x1f, 0x05, 0xab, 0x99, 0x14, 0xa9, 0x43, 0xac, 0x13,
+ 0x91, 0x77, 0x60, 0x3c, 0x11, 0xaf, 0x10, 0x8f, 0x53, 0xf3, 0x7c, 0x43, 0xa1, 0x08, 0xa7, 0xe6,
+ 0x9b, 0x52, 0xd0, 0xc9, 0x46, 0xbc, 0xe5, 0xe7, 0x06, 0x29, 0x1e, 0xa0, 0x96, 0xea, 0xb3, 0xea,
+ 0x96, 0xdf, 0xc1, 0x12, 0xad, 0x59, 0x53, 0xb1, 0x89, 0xce, 0xa3, 0x7d, 0x2c, 0x9d, 0x8b, 0xe2,
+ 0x49, 0x58, 0x0b, 0xfc, 0x76, 0x37, 0xc2, 0xa8, 0xc7, 0x94, 0x27, 0xa1, 0x8b, 0x25, 0x19, 0x9e,
+ 0x04, 0x4e, 0x92, 0x1d, 0x2b, 0x30, 0xf1, 0x04, 0xb1, 0x02, 0x14, 0x0a, 0xcb, 0x7e, 0x73, 0x1f,
+ 0xc3, 0x1c, 0x4b, 0xf5, 0x0f, 0x99, 0xfe, 0x68, 0xf9, 0xcd, 0xfd, 0xa7, 0x77, 0xc6, 0x8d, 0xec,
+ 0xc9, 0x0a, 0x6b, 0x3b, 0x13, 0x2b, 0xf1, 0xe9, 0x99, 0x29, 0xed, 0xe4, 0x4e, 0x2b, 0xe3, 0x86,
+ 0x0a, 0x97, 0x42, 0xd9, 0x10, 0x4b, 0x27, 0x27, 0x14, 0x2a, 0x0b, 0x34, 0xdc, 0x8f, 0xfc, 0xee,
+ 0x7c, 0xcb, 0xeb, 0x6e, 0xfb, 0x4e, 0xe0, 0xce, 0x54, 0x06, 0x28, 0x8c, 0x57, 0x32, 0x15, 0xc6,
+ 0xb4, 0xcb, 0xe9, 0xed, 0xa6, 0x64, 0x60, 0xf5, 0xb1, 0x24, 0x5f, 0x85, 0x49, 0x36, 0x5b, 0x16,
+ 0x1f, 0x47, 0xb4, 0xc3, 0x45, 0x69, 0x1a, 0x97, 0xfa, 0x73, 0xca, 0x45, 0xc9, 0xb8, 0x90, 0x0b,
+ 0x29, 0x6a, 0x0f, 0x1a, 0x13, 0xa8, 0x42, 0xaa, 0xb3, 0x22, 0x2e, 0xcc, 0x3c, 0x70, 0x1e, 0x2b,
+ 0x69, 0x85, 0x14, 0xa9, 0x27, 0x28, 0xb1, 0xd7, 0x8f, 0x0e, 0xab, 0x2f, 0x31, 0x89, 0xdd, 0x8f,
+ 0x91, 0x06, 0x4c, 0x80, 0x81, 0x9c, 0xcc, 0x1f, 0x4d, 0xf5, 0x3c, 0x59, 0x82, 0x31, 0xd1, 0x4e,
+ 0xb1, 0xb6, 0xf5, 0xf7, 0xd8, 0xf3, 0x99, 0x3d, 0x36, 0x26, 0x7a, 0xcc, 0x92, 0xf4, 0xe6, 0xbf,
+ 0x36, 0x60, 0x42, 0x6b, 0x14, 0x79, 0x53, 0x09, 0xf4, 0x49, 0x02, 0xf4, 0x34, 0x9c, 0xcc, 0x57,
+ 0x0a, 0xde, 0x14, 0xd1, 0x5d, 0xb9, 0xc1, 0x74, 0x99, 0x79, 0xdb, 0x64, 0x7a, 0x84, 0xfc, 0xf1,
+ 0xe9, 0x11, 0x0a, 0x03, 0xd2, 0x23, 0xfc, 0xf2, 0x04, 0x4c, 0xea, 0xcb, 0x28, 0xb3, 0x6b, 0x97,
+ 0xfd, 0x5d, 0xaf, 0x23, 0x77, 0xc7, 0x3c, 0xe1, 0x07, 0x42, 0xb4, 0x94, 0xff, 0x08, 0x21, 0x2f,
+ 0x03, 0xc4, 0x07, 0xca, 0x72, 0x03, 0x2c, 0x1e, 0x28, 0x50, 0x0a, 0xc8, 0x8f, 0x01, 0xac, 0xf8,
+ 0x2e, 0x8d, 0x73, 0xc6, 0x1c, 0xe3, 0x06, 0x7b, 0x45, 0xb8, 0xc1, 0xc4, 0xa3, 0x02, 0x47, 0x87,
+ 0xd5, 0xf3, 0x1d, 0xdf, 0xa5, 0xfd, 0xc9, 0x62, 0x14, 0x8e, 0xe4, 0x8b, 0x30, 0x62, 0xf5, 0x5a,
+ 0x54, 0xa6, 0x30, 0x19, 0x97, 0xd3, 0xaa, 0xd7, 0x52, 0x92, 0x8d, 0x06, 0xbd, 0xf4, 0xe9, 0x07,
+ 0x03, 0x90, 0xf7, 0x01, 0x98, 0xe4, 0xdc, 0x0d, 0xfc, 0x5e, 0x57, 0xde, 0x91, 0xc6, 0xcd, 0xb2,
+ 0x22, 0x74, 0xbb, 0x58, 0xa8, 0x7e, 0x3c, 0x21, 0x21, 0xab, 0x30, 0x26, 0x94, 0x94, 0x38, 0x5d,
+ 0x78, 0x21, 0xcb, 0xaf, 0xa5, 0x58, 0x2a, 0x22, 0xa7, 0x08, 0x82, 0x75, 0x57, 0x13, 0xdf, 0xec,
+ 0xbf, 0x03, 0x25, 0xc6, 0x9e, 0x6d, 0xe8, 0x43, 0xb1, 0x42, 0x61, 0xa4, 0xa5, 0x52, 0x21, 0xb6,
+ 0xf9, 0xd7, 0x32, 0x9b, 0xc5, 0x04, 0xe4, 0xab, 0x98, 0x05, 0x48, 0x74, 0xf5, 0xb1, 0xee, 0xd1,
+ 0x6b, 0x7d, 0x5d, 0x7d, 0xce, 0xe9, 0x76, 0x33, 0xd2, 0xa6, 0xc5, 0xfc, 0xc8, 0x6e, 0x7c, 0x1b,
+ 0x29, 0xce, 0x38, 0x7d, 0xcc, 0x07, 0x6e, 0xf4, 0x7d, 0x60, 0x46, 0x5e, 0xb0, 0xe9, 0xcf, 0xfd,
+ 0xa3, 0xf1, 0x25, 0x5d, 0xa8, 0x24, 0xf3, 0x59, 0x7c, 0x0b, 0x8e, 0xfb, 0xd6, 0xeb, 0x7d, 0xdf,
+ 0x52, 0x07, 0xb0, 0xef, 0x73, 0x7d, 0xdc, 0x89, 0x9b, 0x64, 0x07, 0x16, 0xdf, 0x1b, 0x3f, 0xee,
+ 0x7b, 0x2f, 0xf7, 0x7d, 0xef, 0xac, 0xbb, 0xdd, 0xff, 0x9d, 0x14, 0x4f, 0xf2, 0x0e, 0x4c, 0x48,
+ 0x08, 0xce, 0x0f, 0x74, 0x4b, 0x8a, 0x5d, 0x84, 0xbb, 0x8d, 0xe1, 0x75, 0x7a, 0xe2, 0x1b, 0x15,
+ 0x59, 0xa5, 0xe6, 0xd2, 0x31, 0xa1, 0x51, 0xa7, 0xa5, 0x42, 0x47, 0x26, 0x5f, 0x81, 0xf1, 0xa5,
+ 0x36, 0x6b, 0x88, 0xdf, 0x71, 0x22, 0x8a, 0x4b, 0x5e, 0xe2, 0xea, 0x55, 0x4a, 0x14, 0x51, 0xe5,
+ 0x19, 0x36, 0x93, 0x22, 0xd5, 0x64, 0x50, 0x28, 0x58, 0xe7, 0x71, 0x27, 0x8f, 0x90, 0xe1, 0x50,
+ 0x2c, 0x70, 0xcf, 0x67, 0xb8, 0x5b, 0x15, 0xf6, 0xb8, 0x62, 0x70, 0xdf, 0x91, 0x2d, 0x26, 0x84,
+ 0xd6, 0x79, 0x3a, 0x4f, 0xf2, 0x2e, 0x8c, 0x8b, 0xbb, 0x9f, 0x35, 0x6b, 0x25, 0x9c, 0xa9, 0x60,
+ 0xe3, 0x31, 0x6b, 0x9d, 0xbc, 0x26, 0x6a, 0x3b, 0x41, 0xea, 0xcc, 0x2d, 0xc1, 0x27, 0x5f, 0x86,
+ 0x73, 0x5b, 0x5e, 0xc7, 0xf5, 0x1f, 0x85, 0x42, 0x81, 0x0b, 0x45, 0x37, 0x9d, 0x44, 0x16, 0x3d,
+ 0xe2, 0xe5, 0xb6, 0x5c, 0x1c, 0xfb, 0x14, 0x5f, 0x26, 0x07, 0xf2, 0x53, 0x7d, 0x9c, 0xb9, 0x04,
+ 0x91, 0xe3, 0x24, 0x68, 0xae, 0x4f, 0x82, 0xfa, 0x3f, 0x9f, 0x16, 0xa7, 0xcc, 0xcf, 0x10, 0x1f,
+ 0x88, 0x6e, 0xd9, 0x7c, 0xe0, 0x7b, 0x9d, 0x99, 0xb3, 0xda, 0x7b, 0x2e, 0x71, 0x70, 0x31, 0xe2,
+ 0xad, 0xf9, 0x2d, 0xaf, 0x79, 0x50, 0x37, 0x8f, 0x0e, 0xab, 0x2f, 0xa4, 0x6d, 0xa6, 0x8f, 0x7c,
+ 0xcd, 0x85, 0x91, 0xc1, 0x9a, 0x7c, 0x05, 0xca, 0xec, 0x6f, 0x6c, 0x60, 0x9e, 0xd3, 0x0e, 0xe8,
+ 0x14, 0x4c, 0xf1, 0x1d, 0x1c, 0x23, 0xbc, 0x9c, 0x9a, 0x61, 0x7b, 0x6a, 0xac, 0xcc, 0x1f, 0x18,
+ 0x70, 0x2e, 0xab, 0xae, 0x27, 0x64, 0x02, 0x32, 0x53, 0x47, 0xf5, 0xe8, 0xfd, 0xe0, 0x47, 0xf5,
+ 0xf1, 0x01, 0x7d, 0x15, 0x46, 0xd8, 0x8e, 0x5c, 0x86, 0x92, 0xe1, 0x72, 0xc8, 0x76, 0xed, 0xa1,
+ 0xc5, 0xe1, 0x0c, 0x01, 0xaf, 0x1d, 0xe0, 0x7a, 0x39, 0xc2, 0x11, 0xf0, 0x6e, 0x82, 0xc5, 0xe1,
+ 0x0c, 0x81, 0x2d, 0xbb, 0x72, 0x99, 0x40, 0x04, 0xb6, 0x1a, 0x87, 0x16, 0x87, 0x93, 0x6b, 0x30,
+ 0xb6, 0xda, 0x59, 0xa6, 0xce, 0x43, 0x2a, 0xce, 0xc9, 0xd0, 0x5b, 0xe3, 0x77, 0xec, 0x16, 0x83,
+ 0x59, 0xb2, 0xd0, 0xfc, 0x8e, 0x01, 0xd3, 0x7d, 0xdd, 0x74, 0x72, 0xb2, 0xa3, 0xe3, 0x0f, 0x25,
+ 0x87, 0x69, 0x1f, 0xaf, 0x7e, 0x21, 0xbb, 0xfa, 0xe6, 0xef, 0x17, 0xe0, 0xe2, 0x80, 0x55, 0x2b,
+ 0x09, 0x28, 0x30, 0x4e, 0x0c, 0x28, 0xf8, 0x1a, 0x5b, 0x25, 0x1c, 0xaf, 0x1d, 0xae, 0xfb, 0x49,
+ 0x8d, 0x93, 0xb3, 0x17, 0x2c, 0x93, 0xd9, 0x44, 0x64, 0xe6, 0x8b, 0x4b, 0x4d, 0xa4, 0xb0, 0x23,
+ 0xbf, 0xcf, 0x33, 0xad, 0x33, 0xeb, 0x3b, 0xd2, 0xcf, 0xff, 0x35, 0x39, 0xd2, 0xd7, 0x0f, 0xd2,
+ 0x0a, 0x4f, 0xf5, 0x20, 0x2d, 0xdb, 0x15, 0x3f, 0xf2, 0x24, 0xa7, 0x4f, 0xf3, 0x30, 0xd1, 0xa0,
+ 0x4e, 0xd0, 0xdc, 0xab, 0x85, 0x7c, 0x90, 0x46, 0x91, 0x1b, 0xaa, 0xe4, 0x10, 0x0b, 0x6c, 0x27,
+ 0xec, 0x1f, 0x0b, 0x8d, 0xc6, 0xfc, 0x77, 0xa9, 0x48, 0x84, 0xbf, 0x8e, 0xf2, 0xf2, 0x2a, 0x8c,
+ 0x6c, 0xed, 0xd1, 0x40, 0x1a, 0xc9, 0x58, 0x91, 0x47, 0x0c, 0xa0, 0x56, 0x04, 0x31, 0xcc, 0x9f,
+ 0x84, 0xb2, 0xfa, 0x31, 0x54, 0x08, 0xec, 0xb7, 0x98, 0x91, 0x5c, 0x21, 0x30, 0x80, 0xc5, 0xe1,
+ 0x27, 0x26, 0x20, 0x4b, 0x7a, 0x21, 0x7f, 0x52, 0x2f, 0xb0, 0x8f, 0xa3, 0xbc, 0x29, 0x1f, 0xc7,
+ 0xdf, 0xea, 0xc7, 0x23, 0x06, 0xb0, 0x38, 0xfc, 0xa9, 0x7e, 0xfc, 0xdf, 0x1a, 0x50, 0xc0, 0xe4,
+ 0x0f, 0x6f, 0x40, 0x49, 0xba, 0x94, 0xd5, 0x84, 0x08, 0x67, 0xa5, 0xc7, 0x39, 0xd4, 0xe3, 0x48,
+ 0x04, 0x90, 0x7d, 0x6a, 0x93, 0x06, 0xdb, 0x5a, 0xb8, 0xd1, 0x43, 0x06, 0x50, 0x3f, 0x85, 0x18,
+ 0xa7, 0x18, 0x0f, 0x0c, 0xa9, 0x12, 0x3b, 0x42, 0xae, 0xb2, 0x78, 0x48, 0x55, 0xdf, 0xf6, 0x4f,
+ 0x62, 0x99, 0xbf, 0x6e, 0xc0, 0xf9, 0x4c, 0x4b, 0x86, 0x7d, 0x95, 0x9b, 0x4c, 0x8a, 0x38, 0xa6,
+ 0xed, 0x25, 0x8e, 0x71, 0x9a, 0xd0, 0xa9, 0x53, 0xc8, 0xd6, 0x67, 0xa0, 0x14, 0xef, 0x30, 0xc9,
+ 0x39, 0x39, 0x74, 0xe8, 0x77, 0x94, 0xdb, 0xb1, 0xbf, 0x32, 0x60, 0x94, 0x55, 0xe1, 0x99, 0xbd,
+ 0x49, 0x93, 0xed, 0x85, 0x66, 0x4d, 0x1a, 0xea, 0xfe, 0xcc, 0xef, 0x8c, 0x02, 0x24, 0xc8, 0x64,
+ 0x1b, 0x26, 0x57, 0x97, 0x16, 0xe6, 0x97, 0x5c, 0xda, 0x89, 0xf0, 0x34, 0x34, 0x95, 0x51, 0x81,
+ 0x6d, 0x8d, 0x83, 0x8e, 0xd3, 0x12, 0x08, 0x07, 0x89, 0x6e, 0xf0, 0x3d, 0xb7, 0x69, 0x7b, 0x31,
+ 0x9d, 0x6a, 0x52, 0xea, 0x1c, 0xd9, 0x37, 0x1a, 0xb5, 0x07, 0xcb, 0xca, 0x37, 0x72, 0x43, 0x7e,
+ 0x23, 0x74, 0xda, 0xad, 0x01, 0xdf, 0xd0, 0x39, 0x92, 0x3d, 0xa8, 0xdc, 0xc5, 0xd5, 0x47, 0xf9,
+ 0x4a, 0xfe, 0xf8, 0xaf, 0xbc, 0x28, 0xbe, 0xf2, 0x1c, 0x5f, 0xb6, 0xb2, 0xbf, 0xd3, 0xc7, 0x35,
+ 0x91, 0xdc, 0xc2, 0x89, 0x92, 0xfb, 0x37, 0x0c, 0x18, 0xe5, 0xcb, 0x5b, 0xfc, 0x28, 0x4b, 0xe6,
+ 0x02, 0xba, 0xf5, 0x74, 0x16, 0xd0, 0x0a, 0x6a, 0x2e, 0xcd, 0x85, 0xc0, 0xcb, 0xc8, 0x42, 0xea,
+ 0x85, 0x17, 0x79, 0xd4, 0x80, 0xa6, 0x35, 0x2f, 0x49, 0x02, 0xd0, 0xf8, 0xe3, 0x2e, 0x2a, 0x17,
+ 0x8e, 0xa1, 0xbe, 0x37, 0x39, 0xf6, 0x84, 0xef, 0x4d, 0x2e, 0x43, 0x49, 0x44, 0x54, 0xd5, 0x0f,
+ 0xc4, 0x06, 0x5a, 0xba, 0x88, 0x62, 0xb8, 0x92, 0x68, 0x9c, 0x83, 0xec, 0x6d, 0x2d, 0x4d, 0x60,
+ 0x8c, 0x48, 0x56, 0xa1, 0x94, 0x5c, 0x03, 0x2a, 0x69, 0xe7, 0xc5, 0x31, 0x5c, 0x84, 0x1c, 0xf3,
+ 0x9b, 0xa6, 0x99, 0xb7, 0x7e, 0x12, 0x1e, 0xe6, 0x37, 0x0d, 0xa8, 0xa4, 0xe5, 0x85, 0xbc, 0x03,
+ 0xe3, 0xf1, 0x4d, 0xac, 0x38, 0x0e, 0x03, 0x1d, 0xbe, 0xc9, 0xd5, 0x2d, 0x2d, 0x22, 0x43, 0x45,
+ 0x27, 0x73, 0x50, 0x64, 0xd3, 0x4e, 0xc9, 0x13, 0x8d, 0xfa, 0xa4, 0x27, 0x60, 0xea, 0xf9, 0xa7,
+ 0xc4, 0x53, 0x66, 0xed, 0xbf, 0xcf, 0xc3, 0xb8, 0x32, 0x58, 0xe4, 0x55, 0x28, 0x2e, 0x85, 0xcb,
+ 0x7e, 0x73, 0x9f, 0xba, 0xe2, 0x58, 0x05, 0x9f, 0x13, 0xf5, 0x42, 0xbb, 0x85, 0x40, 0x2b, 0x2e,
+ 0x26, 0x75, 0x98, 0xe0, 0xff, 0xc9, 0x1b, 0xb7, 0xb9, 0xc4, 0x25, 0xcc, 0x91, 0xe5, 0x5d, 0x5b,
+ 0x75, 0x79, 0xd7, 0x48, 0xc8, 0xd7, 0x01, 0x38, 0x80, 0x8d, 0xef, 0x10, 0x01, 0xd5, 0x72, 0x02,
+ 0x9f, 0x17, 0x1f, 0x88, 0x3c, 0xb5, 0x85, 0x28, 0x0a, 0x0a, 0x43, 0x7c, 0xca, 0xd0, 0x6f, 0xee,
+ 0x0f, 0xff, 0x98, 0x69, 0xf2, 0x94, 0xa1, 0xdf, 0xdc, 0xb7, 0xb3, 0xa3, 0xeb, 0x54, 0x96, 0xe4,
+ 0x5b, 0x06, 0x5c, 0xb6, 0x68, 0xd3, 0x7f, 0x48, 0x83, 0x83, 0x5a, 0x84, 0x58, 0xea, 0x17, 0x4f,
+ 0x0e, 0xe5, 0xbb, 0x2d, 0xbe, 0xf8, 0x4a, 0x20, 0xb8, 0xe0, 0x35, 0xa0, 0x76, 0x37, 0xb2, 0x8f,
+ 0xa9, 0xc2, 0x31, 0x9f, 0x34, 0xff, 0xd4, 0x50, 0xa6, 0x00, 0x59, 0x81, 0x52, 0x2c, 0x2c, 0xc2,
+ 0x65, 0x1a, 0x5b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xfa, 0x73, 0xe2, 0x04, 0xe4, 0x6c, 0x2c, 0x72,
+ 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x25, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0x58, 0x4c, 0x2e, 0x35, 0x05,
+ 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x9f, 0x13, 0xd1, 0x30, 0x79, 0x2d, 0x65, 0x2f, 0x03, 0xb1,
+ 0x7a, 0xc4, 0x6b, 0x4c, 0x12, 0xd0, 0xa9, 0x48, 0xeb, 0xdf, 0xcc, 0x41, 0x25, 0x3d, 0xf1, 0xc8,
+ 0xfb, 0x50, 0x96, 0x57, 0xba, 0xee, 0x39, 0xe1, 0x9e, 0x48, 0x03, 0x8a, 0xbb, 0x56, 0x79, 0x0f,
+ 0xcc, 0xde, 0x73, 0xb4, 0x74, 0x71, 0x1a, 0x01, 0x5b, 0x90, 0xd7, 0xc5, 0x3d, 0x01, 0x65, 0x02,
+ 0x45, 0x7e, 0xd4, 0x4d, 0xa5, 0x01, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xf3, 0x7b, 0x8e, 0x6a, 0x0e,
+ 0xa9, 0x07, 0x77, 0x6a, 0xfc, 0x9a, 0x16, 0x3f, 0x74, 0xd7, 0x4f, 0x2f, 0x18, 0x3e, 0x59, 0x56,
+ 0x6e, 0xc9, 0x8d, 0x6a, 0xb9, 0x74, 0x24, 0x38, 0x6e, 0xdc, 0xc9, 0xd7, 0xe5, 0x3e, 0x28, 0x14,
+ 0xf3, 0x95, 0x82, 0xb8, 0x17, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, 0xd0, 0xde, 0x10,
+ 0xa7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0x69, 0x62, 0x88, 0x13, 0xf4, 0xb1, 0x50, 0x98, 0x17,
+ 0x33, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, 0xb1, 0xa1, 0x30, 0xc8, 0xa2,
+ 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xc7, 0x80, 0x97, 0xac, 0x9c, 0xe7,
+ 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0x61, 0xd9, 0x22, 0xe3, 0xc6,
+ 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x2b, 0xda, 0x0b, 0x87, 0x7a, 0x8c, 0x34,
+ 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x2b, 0x50, 0x60, 0xa3, 0x29, 0xd6, 0x83, 0x38,
+ 0x33, 0xe0, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, 0x20, 0x2f, 0x41, 0xbe, 0x37,
+ 0xb7, 0x23, 0x34, 0x7d, 0x25, 0xb9, 0x02, 0x1b, 0xa3, 0xb1, 0x62, 0x72, 0x1b, 0x8a, 0x8f, 0xf4,
+ 0xcb, 0x8e, 0xe7, 0x53, 0xc3, 0x18, 0xe3, 0xc7, 0x88, 0xf5, 0x22, 0x8c, 0xf2, 0x6b, 0x7e, 0xe6,
+ 0x0b, 0x00, 0xc9, 0xa7, 0xfb, 0x03, 0x1d, 0xcc, 0xaf, 0x43, 0x29, 0xfe, 0x24, 0x79, 0x1e, 0x60,
+ 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0xcf, 0xd8, 0x94, 0xad, 0xd2, 0x3e, 0x3d, 0xb8, 0x87,
+ 0x00, 0x72, 0x11, 0xc6, 0xba, 0x6c, 0x54, 0x65, 0x12, 0x5b, 0x6b, 0xb4, 0xdb, 0xdb, 0x66, 0x12,
+ 0x3a, 0x03, 0x63, 0xe8, 0xfc, 0x10, 0x13, 0x6d, 0xc2, 0x92, 0x3f, 0xcd, 0xdf, 0xca, 0x61, 0x7a,
+ 0x03, 0xa5, 0x9e, 0xe4, 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0x99, 0x45, 0xe2, 0x3b,
+ 0xe5, 0x04, 0xb8, 0xe4, 0x92, 0x6b, 0x30, 0x95, 0x64, 0xd5, 0xb5, 0x9b, 0xdb, 0xe2, 0xaa, 0x73,
+ 0xd9, 0x9a, 0xe8, 0xca, 0xb4, 0xba, 0xf3, 0xdb, 0x78, 0x77, 0xa1, 0xa2, 0x5e, 0xf1, 0x8b, 0x64,
+ 0x86, 0xdc, 0x92, 0x35, 0xa5, 0xc0, 0xf1, 0xe0, 0xe4, 0x02, 0x8c, 0x3a, 0xce, 0x6e, 0xcf, 0xe3,
+ 0x71, 0xd4, 0x65, 0x4b, 0xfc, 0x22, 0x9f, 0x85, 0xe9, 0xd0, 0xdb, 0xed, 0x38, 0x51, 0x2f, 0x10,
+ 0xf9, 0x25, 0x68, 0x80, 0x22, 0x35, 0x61, 0x55, 0xe2, 0x82, 0x79, 0x0e, 0x27, 0xaf, 0x03, 0x51,
+ 0xbf, 0xe7, 0x6f, 0x7f, 0x44, 0x9b, 0x5c, 0xd4, 0xca, 0xd6, 0xb4, 0x52, 0xb2, 0x8a, 0x05, 0xe4,
+ 0x33, 0x50, 0x0e, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0xcd, 0xb1, 0xc6, 0x25, 0xec, 0x3e,
+ 0x3d, 0x30, 0xeb, 0x30, 0xdd, 0x37, 0x1f, 0xc9, 0xeb, 0xdc, 0xba, 0x17, 0xeb, 0x73, 0x99, 0x6f,
+ 0x66, 0x98, 0x92, 0x4a, 0x3d, 0x45, 0xcd, 0x91, 0xcc, 0x0e, 0x94, 0x55, 0xfd, 0x7a, 0xc2, 0x25,
+ 0xf2, 0x0b, 0x18, 0x80, 0xc9, 0x95, 0xcf, 0xe8, 0xd1, 0x61, 0x35, 0xe7, 0xb9, 0x18, 0x76, 0x79,
+ 0x1d, 0x8a, 0xd2, 0x4a, 0x50, 0x9f, 0x5c, 0x11, 0x06, 0xe5, 0x81, 0x15, 0x97, 0x9a, 0xaf, 0xc0,
+ 0x98, 0x50, 0xa1, 0xc7, 0x3b, 0xa2, 0xcc, 0x9f, 0xcb, 0xc1, 0x94, 0x45, 0xd9, 0x04, 0x17, 0x8f,
+ 0x99, 0x7c, 0xca, 0xf2, 0x0b, 0x6b, 0x6d, 0x3b, 0x26, 0x67, 0xc3, 0x77, 0x0d, 0x38, 0x9b, 0x81,
+ 0xfb, 0xb1, 0x12, 0x92, 0xbd, 0x09, 0xa5, 0x05, 0xcf, 0x69, 0xd5, 0x5c, 0x37, 0x0e, 0x24, 0x45,
+ 0x6b, 0xd0, 0x65, 0xd3, 0xc9, 0x61, 0x50, 0x75, 0x31, 0x8d, 0x51, 0xc9, 0x0d, 0x21, 0x14, 0x49,
+ 0xca, 0x44, 0x99, 0xc1, 0x18, 0x78, 0x9d, 0x92, 0xfc, 0xc5, 0x78, 0xfd, 0x8f, 0x03, 0x93, 0x03,
+ 0xd2, 0x67, 0x76, 0xe8, 0xb2, 0xaf, 0xff, 0xa5, 0x9b, 0x37, 0xd4, 0xb6, 0xf3, 0x9b, 0x39, 0xb8,
+ 0x90, 0x4d, 0xf8, 0x71, 0x73, 0xcb, 0x61, 0xc2, 0x0c, 0x25, 0x49, 0x34, 0xe6, 0x96, 0xe3, 0xd9,
+ 0x35, 0x10, 0x3f, 0x41, 0x20, 0x3b, 0x30, 0xb1, 0xec, 0x84, 0xd1, 0x3d, 0xea, 0x04, 0xd1, 0x36,
+ 0x75, 0xa2, 0x21, 0x2c, 0xd8, 0xf8, 0xc1, 0x67, 0x5c, 0xd4, 0xf6, 0x24, 0x65, 0xfa, 0xc1, 0x67,
+ 0x8d, 0x6d, 0x2c, 0x28, 0x85, 0x21, 0x04, 0xe5, 0x1b, 0x30, 0xd5, 0xa0, 0x6d, 0xa7, 0xbb, 0xe7,
+ 0x07, 0x54, 0xf8, 0xce, 0x6f, 0xc2, 0x44, 0x0c, 0xca, 0x94, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a,
+ 0x22, 0x51, 0x25, 0x7a, 0xb1, 0xf9, 0x1b, 0x39, 0xb8, 0x58, 0x6b, 0x8a, 0x83, 0x06, 0x51, 0x20,
+ 0xcf, 0x43, 0x3f, 0xe1, 0x6f, 0x93, 0x59, 0x28, 0x3d, 0x70, 0x1e, 0x2f, 0x53, 0x7c, 0x92, 0x95,
+ 0x67, 0x28, 0xe2, 0xe6, 0x97, 0xf3, 0xd8, 0x8e, 0xdd, 0x5e, 0x56, 0x82, 0xa3, 0x6e, 0x36, 0x0b,
+ 0x4f, 0xb8, 0xd9, 0x34, 0x61, 0xf4, 0x9e, 0xdf, 0x72, 0xc5, 0xe2, 0x24, 0xce, 0x2d, 0xf6, 0x10,
+ 0x62, 0x89, 0x12, 0xf3, 0x07, 0x06, 0x4c, 0xc6, 0x35, 0xc6, 0x2a, 0x7c, 0xe2, 0x5d, 0x72, 0x0d,
+ 0xc6, 0xf0, 0x43, 0xf1, 0x83, 0x40, 0xb8, 0x68, 0xb4, 0x18, 0xc8, 0xf6, 0x5c, 0x4b, 0x16, 0xaa,
+ 0x3d, 0x31, 0xf2, 0x64, 0x3d, 0x61, 0xfe, 0x43, 0x3c, 0x12, 0x51, 0x5b, 0xc9, 0x56, 0x22, 0xa5,
+ 0x22, 0xc6, 0x90, 0x15, 0xc9, 0x3d, 0xb5, 0x21, 0xc9, 0x0f, 0x1c, 0x92, 0x9f, 0xcf, 0xc1, 0x78,
+ 0x5c, 0xd9, 0x4f, 0xd9, 0xbd, 0xf9, 0xb8, 0x5d, 0x43, 0x45, 0xb1, 0x37, 0x14, 0x5d, 0x21, 0x82,
+ 0xc5, 0xbf, 0x04, 0xa3, 0x62, 0x32, 0x19, 0xa9, 0x73, 0xc1, 0xd4, 0xe8, 0x26, 0x8f, 0xf6, 0xe2,
+ 0x80, 0x86, 0x96, 0xa0, 0xc3, 0x6b, 0x02, 0x5b, 0x74, 0x5b, 0x9c, 0x90, 0x3d, 0xb3, 0x6b, 0x54,
+ 0xf6, 0x35, 0x81, 0xa4, 0x61, 0x43, 0xad, 0x4e, 0x7f, 0xb7, 0x00, 0x95, 0x34, 0xc9, 0xc9, 0x99,
+ 0x09, 0xd6, 0x7a, 0xdb, 0xe2, 0x4d, 0x0a, 0xcc, 0x4c, 0xd0, 0xed, 0x6d, 0x5b, 0x0c, 0x46, 0xae,
+ 0x41, 0x61, 0x2d, 0xf0, 0x1e, 0x62, 0xab, 0xc5, 0x93, 0x1c, 0xdd, 0xc0, 0x7b, 0xa8, 0xc6, 0xcb,
+ 0xb2, 0x72, 0xdc, 0xd0, 0x2e, 0x37, 0x94, 0xf7, 0xd2, 0xf9, 0x86, 0xb6, 0x15, 0xa6, 0x53, 0xe0,
+ 0x48, 0x34, 0xb6, 0x54, 0xd6, 0xa9, 0x13, 0x88, 0x5b, 0xf4, 0x42, 0x9d, 0xe1, 0x52, 0xb9, 0x8d,
+ 0x60, 0x9e, 0xdf, 0xd6, 0x52, 0x91, 0x48, 0x0b, 0x88, 0xf2, 0x53, 0x4e, 0xe0, 0x93, 0xf7, 0x78,
+ 0xf2, 0x29, 0xa9, 0x73, 0x2a, 0x6b, 0x5b, 0x9d, 0xcd, 0x19, 0x7c, 0x9f, 0xa6, 0x8f, 0x70, 0x0d,
+ 0x4a, 0xe8, 0xf2, 0x42, 0x47, 0x46, 0xf1, 0x44, 0x66, 0x32, 0x36, 0x19, 0x30, 0x9e, 0xc0, 0x8e,
+ 0xdd, 0x19, 0x09, 0x13, 0xf2, 0x1e, 0x8c, 0xab, 0x01, 0xb5, 0x3c, 0xec, 0xf3, 0x0a, 0xbf, 0x49,
+ 0x35, 0x20, 0x55, 0x9c, 0x4a, 0x60, 0x7e, 0x4e, 0x95, 0x12, 0xb1, 0x68, 0x1f, 0x2b, 0x25, 0xe6,
+ 0xaf, 0xa1, 0x19, 0xdf, 0xf6, 0x23, 0x2a, 0xac, 0x97, 0x67, 0x56, 0x8f, 0x25, 0x2e, 0xe4, 0x11,
+ 0x2d, 0xa6, 0x45, 0x6b, 0xdd, 0x29, 0x5e, 0x0a, 0xff, 0x5d, 0x03, 0xce, 0x67, 0xd2, 0x92, 0x9b,
+ 0x00, 0x89, 0x8d, 0x28, 0x7a, 0x89, 0x27, 0x0e, 0x8e, 0xa1, 0x96, 0x82, 0x41, 0xbe, 0x96, 0xb6,
+ 0xee, 0x4e, 0x5e, 0x9c, 0xe4, 0xf3, 0x1a, 0x93, 0xba, 0x75, 0x97, 0x61, 0xd3, 0x99, 0xdf, 0xcd,
+ 0xc3, 0x74, 0xdf, 0xb3, 0x8c, 0x27, 0x44, 0x11, 0xec, 0xa7, 0x1e, 0xfd, 0xe2, 0xc7, 0x1d, 0x37,
+ 0x06, 0x3d, 0x0a, 0x99, 0xf1, 0x04, 0x18, 0xba, 0xc5, 0x44, 0xce, 0xea, 0x13, 0x5e, 0x02, 0x0b,
+ 0xb3, 0x9f, 0x8b, 0xfb, 0xec, 0xc0, 0xaf, 0x3d, 0x85, 0x67, 0xe3, 0xfe, 0x1a, 0xbf, 0xaa, 0xf5,
+ 0x6b, 0x39, 0x38, 0xdb, 0xd7, 0xe6, 0x67, 0x76, 0xd6, 0x7d, 0x49, 0x5b, 0xdd, 0x5e, 0x18, 0x34,
+ 0xa6, 0x43, 0x59, 0x11, 0xff, 0xc3, 0x80, 0x8b, 0x03, 0x28, 0xc9, 0x41, 0x5a, 0x88, 0xb8, 0x55,
+ 0x71, 0xeb, 0xf8, 0x0f, 0x3e, 0x15, 0x51, 0xfa, 0xc4, 0x24, 0xe1, 0xe7, 0x72, 0x00, 0x5b, 0x74,
+ 0xfb, 0xd9, 0x4e, 0xbb, 0xf4, 0x05, 0x4d, 0x00, 0x14, 0x07, 0xe6, 0xf0, 0x59, 0x97, 0x56, 0xd1,
+ 0x91, 0x38, 0x7c, 0xce, 0xa5, 0xf8, 0x09, 0x91, 0x5c, 0xf6, 0x13, 0x22, 0xe6, 0x36, 0x9c, 0xbb,
+ 0x4b, 0xa3, 0x64, 0x25, 0x94, 0x7b, 0xc8, 0xe3, 0xd9, 0xbe, 0x06, 0x25, 0x81, 0xaf, 0xa7, 0x83,
+ 0x97, 0x21, 0x71, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, 0x8b, 0x0b, 0xb4, 0x45, 0x23, 0xfa, 0xc9,
+ 0x7e, 0xa6, 0x01, 0x84, 0x37, 0x85, 0xbf, 0x2c, 0x31, 0xd4, 0x17, 0x4e, 0xec, 0x9f, 0x4d, 0x38,
+ 0x1f, 0xd7, 0xfd, 0x69, 0xf2, 0x9d, 0x65, 0xb6, 0x84, 0xb8, 0x93, 0x98, 0x70, 0x3c, 0xc6, 0x89,
+ 0xf8, 0x18, 0x2e, 0x4b, 0x82, 0x2d, 0x2f, 0x3e, 0x89, 0x19, 0x8a, 0x96, 0xbc, 0x03, 0xe3, 0x0a,
+ 0x8d, 0xb8, 0xe0, 0x8c, 0xa7, 0x9d, 0x8f, 0xbc, 0x68, 0xcf, 0x0e, 0x39, 0x5c, 0x3d, 0xed, 0x54,
+ 0xd0, 0xcd, 0xaf, 0xc2, 0x73, 0x71, 0xdc, 0x4a, 0xc6, 0xa7, 0x53, 0xcc, 0x8d, 0xd3, 0x31, 0x5f,
+ 0x49, 0x9a, 0xb5, 0xd4, 0x89, 0x23, 0xe0, 0x25, 0x6f, 0xa2, 0x36, 0x4b, 0x34, 0xe6, 0x8a, 0x92,
+ 0x8e, 0x4e, 0xac, 0x45, 0x09, 0xc0, 0x7c, 0x5b, 0xa9, 0x6c, 0x06, 0x43, 0x8d, 0xd8, 0x48, 0x13,
+ 0xff, 0x5c, 0x0e, 0xa6, 0x56, 0x97, 0x16, 0xe6, 0x63, 0x37, 0xf2, 0xa7, 0x2c, 0x27, 0x94, 0xd6,
+ 0xb6, 0xc1, 0xfa, 0xc6, 0xdc, 0x80, 0xb3, 0xa9, 0x6e, 0xc0, 0x87, 0x73, 0xde, 0xe3, 0xf1, 0x25,
+ 0x31, 0x58, 0xae, 0x2c, 0x17, 0xb2, 0xd8, 0x6f, 0xde, 0xb6, 0x52, 0xd8, 0xe6, 0x77, 0x47, 0x53,
+ 0x7c, 0x85, 0x0a, 0x7b, 0x0d, 0x4a, 0x4b, 0x61, 0xd8, 0xa3, 0xc1, 0x86, 0xb5, 0xac, 0xda, 0x88,
+ 0x1e, 0x02, 0xed, 0x5e, 0xd0, 0xb2, 0x12, 0x04, 0xf2, 0x2a, 0x14, 0xc5, 0x3d, 0x38, 0xa9, 0x13,
+ 0xf0, 0xb8, 0x3c, 0xbe, 0x46, 0x67, 0xc5, 0xc5, 0xe4, 0x0d, 0x28, 0xf3, 0xff, 0xb9, 0xb4, 0x89,
+ 0x0e, 0x47, 0x5f, 0x95, 0x40, 0xe7, 0xd2, 0x69, 0x69, 0x68, 0x6c, 0x67, 0x26, 0x5f, 0xe6, 0x64,
+ 0x35, 0x2a, 0x24, 0x3b, 0x33, 0xf9, 0x88, 0x27, 0xd6, 0x49, 0x45, 0x22, 0x37, 0x20, 0x5f, 0x9b,
+ 0xb7, 0xd4, 0x0c, 0xd8, 0x4e, 0x33, 0xe0, 0x19, 0xe4, 0xb5, 0xc7, 0xaf, 0x6a, 0xf3, 0x16, 0x99,
+ 0x83, 0x22, 0x3e, 0x6e, 0xe2, 0xd2, 0x40, 0x44, 0xbd, 0xa2, 0xd4, 0x74, 0x05, 0x4c, 0x3d, 0x79,
+ 0x94, 0x78, 0x64, 0x16, 0xc6, 0x16, 0xbc, 0xb0, 0xdb, 0x72, 0x0e, 0x44, 0x32, 0x18, 0x3c, 0x0c,
+ 0x71, 0x39, 0x48, 0x95, 0x33, 0x81, 0x45, 0x5e, 0x85, 0x91, 0x46, 0xd3, 0xef, 0xb2, 0xdd, 0x56,
+ 0x1c, 0xda, 0x12, 0x32, 0x80, 0x96, 0x01, 0x82, 0x01, 0xf0, 0x6a, 0x36, 0xbf, 0x61, 0x56, 0x52,
+ 0xae, 0x66, 0xa7, 0x6f, 0x96, 0x09, 0x9c, 0xfe, 0xe0, 0x43, 0x78, 0x9a, 0xc1, 0x87, 0xdb, 0x70,
+ 0xf1, 0x2e, 0x9a, 0xfa, 0x0d, 0x1a, 0x60, 0xfe, 0x4d, 0xfe, 0x50, 0xd2, 0x86, 0xb5, 0x24, 0x6e,
+ 0xd5, 0xe1, 0x1d, 0x27, 0xbe, 0x1b, 0xb0, 0x43, 0x8e, 0x23, 0xdf, 0x58, 0x4a, 0xbd, 0x0e, 0x31,
+ 0x88, 0x11, 0xf9, 0x32, 0x9c, 0xcb, 0x2a, 0x12, 0xf7, 0xeb, 0x30, 0xae, 0x3d, 0xfb, 0x03, 0x6a,
+ 0x60, 0x79, 0x16, 0x07, 0xb2, 0x0c, 0x15, 0x0e, 0xaf, 0xb9, 0x6d, 0xaf, 0xb3, 0xd8, 0x76, 0xbc,
+ 0x16, 0xde, 0xb6, 0x13, 0x57, 0x26, 0x05, 0x57, 0x87, 0x15, 0xda, 0x94, 0x95, 0x6a, 0xd1, 0x49,
+ 0x29, 0x4a, 0x54, 0x47, 0x8d, 0xda, 0x83, 0xe5, 0x64, 0x4e, 0x7d, 0xba, 0xce, 0x8d, 0xb4, 0xb6,
+ 0x1d, 0x73, 0x6e, 0xb4, 0x01, 0x67, 0x53, 0xdd, 0x20, 0xd5, 0x91, 0x06, 0x4e, 0xab, 0xa3, 0x14,
+ 0x8d, 0x95, 0xc2, 0x36, 0xff, 0xe3, 0x68, 0x8a, 0xaf, 0xf0, 0x15, 0x99, 0x30, 0xca, 0xb5, 0x8d,
+ 0x9a, 0x2d, 0x8e, 0xeb, 0x22, 0x4b, 0x94, 0x90, 0x4b, 0x90, 0x6f, 0x34, 0x56, 0xd5, 0x5c, 0x96,
+ 0x61, 0xe8, 0x5b, 0x0c, 0xc6, 0x46, 0x08, 0xdd, 0x40, 0xca, 0x15, 0xb3, 0x26, 0x0d, 0x22, 0xf1,
+ 0x74, 0xeb, 0xcb, 0xc9, 0x3c, 0x2e, 0x24, 0xfd, 0x2d, 0xe6, 0x71, 0x32, 0x7b, 0xe7, 0x61, 0xa6,
+ 0x16, 0x86, 0x34, 0x88, 0x78, 0x02, 0xfe, 0xb0, 0xd7, 0xa6, 0x81, 0x90, 0x35, 0xa1, 0x63, 0xf8,
+ 0xc3, 0xef, 0xcd, 0xd0, 0x1a, 0x88, 0x48, 0xae, 0x43, 0xb1, 0xd6, 0x73, 0x3d, 0xda, 0x69, 0x6a,
+ 0xd1, 0xf5, 0x8e, 0x80, 0x59, 0x71, 0x29, 0xf9, 0x10, 0xce, 0x0b, 0x22, 0xa9, 0x70, 0x44, 0x0f,
+ 0x70, 0x5d, 0xc3, 0x77, 0xb0, 0x62, 0x2e, 0x48, 0x35, 0x65, 0x8b, 0x2e, 0xc9, 0xa6, 0x24, 0x35,
+ 0xa8, 0x2c, 0xe2, 0x39, 0xa9, 0x7c, 0xc0, 0xd9, 0x0f, 0x44, 0xa2, 0x65, 0xd4, 0x5c, 0xfc, 0x0c,
+ 0xd5, 0x76, 0xe3, 0x42, 0xab, 0x0f, 0x9d, 0xdc, 0x87, 0xb3, 0x69, 0x18, 0xd3, 0xc7, 0xa5, 0xe4,
+ 0x81, 0xb5, 0x3e, 0x2e, 0xa8, 0x98, 0xb3, 0xa8, 0xc8, 0x36, 0x4c, 0xd7, 0xa2, 0x28, 0xf0, 0xb6,
+ 0x7b, 0x11, 0x4d, 0xa9, 0x2e, 0xe9, 0x68, 0x8c, 0xcb, 0xa5, 0xfa, 0x7a, 0x4e, 0x08, 0xe3, 0x59,
+ 0x27, 0xa6, 0x8c, 0x55, 0x98, 0xd5, 0xcf, 0x8e, 0xb8, 0xf1, 0x1b, 0x8d, 0xe2, 0x1d, 0x43, 0x71,
+ 0x25, 0x4a, 0x3a, 0x74, 0x6b, 0xe1, 0x41, 0xbb, 0x4d, 0xa3, 0x00, 0x4f, 0xee, 0xf1, 0x9d, 0x43,
+ 0x53, 0xc4, 0x00, 0x5d, 0x56, 0x9e, 0x26, 0xc5, 0xb7, 0x2c, 0xb5, 0xf0, 0x48, 0x8d, 0xa7, 0xb6,
+ 0x7c, 0x94, 0x87, 0x5c, 0x3e, 0x5a, 0x30, 0xbd, 0xd8, 0x69, 0x06, 0x07, 0x78, 0x37, 0x53, 0x56,
+ 0x6e, 0xe2, 0x84, 0xca, 0xc9, 0x47, 0x4c, 0xae, 0x38, 0x52, 0xc2, 0xb2, 0xaa, 0xd7, 0xcf, 0xd8,
+ 0xfc, 0xff, 0xa0, 0x92, 0xee, 0xcb, 0x27, 0x7c, 0x98, 0xfa, 0x34, 0xa1, 0xd9, 0x6c, 0xa4, 0xd3,
+ 0x6d, 0x21, 0xb3, 0xda, 0xeb, 0xc3, 0x46, 0x72, 0x7b, 0x5f, 0x79, 0x27, 0x58, 0x7b, 0x73, 0x58,
+ 0x4e, 0xe3, 0x5c, 0xd6, 0x34, 0x36, 0x7f, 0x21, 0x07, 0xd3, 0x3c, 0x9a, 0xf4, 0xd9, 0xb7, 0x15,
+ 0xdf, 0xd3, 0x94, 0xb3, 0xf4, 0x05, 0xa6, 0x5a, 0x77, 0x8c, 0xb5, 0xf8, 0x75, 0x38, 0xdf, 0xd7,
+ 0x15, 0xa8, 0xa0, 0x17, 0x64, 0x1c, 0x6f, 0x9f, 0x8a, 0x9e, 0xc9, 0xfe, 0xc8, 0xe6, 0x6d, 0xab,
+ 0x8f, 0xc2, 0xfc, 0xfb, 0xb9, 0x3e, 0xfe, 0xc2, 0x6e, 0x54, 0x2d, 0x41, 0xe3, 0x74, 0x96, 0x60,
+ 0xee, 0x63, 0x59, 0x82, 0xf9, 0x61, 0x2c, 0xc1, 0x0f, 0x61, 0x62, 0x9d, 0x3a, 0xcc, 0xa2, 0x11,
+ 0xd7, 0xe5, 0x0a, 0xda, 0xcb, 0xc0, 0xac, 0x4c, 0xea, 0x97, 0xf8, 0xaa, 0x6d, 0xc4, 0x08, 0x98,
+ 0x6a, 0xe1, 0xf7, 0xe7, 0x2c, 0x9d, 0x83, 0xba, 0x68, 0x8c, 0x0c, 0x5e, 0x34, 0xcc, 0x00, 0xc6,
+ 0x1b, 0x8d, 0xd5, 0x2d, 0x27, 0x60, 0xda, 0x22, 0x64, 0x26, 0xa3, 0x0c, 0x13, 0x35, 0x12, 0xc5,
+ 0xdb, 0x1f, 0x1f, 0x2a, 0xb1, 0x98, 0x62, 0x91, 0xc4, 0x22, 0xa4, 0x82, 0x47, 0xc4, 0x09, 0x98,
+ 0x16, 0x11, 0x27, 0x60, 0xe6, 0xdf, 0x2b, 0x40, 0x85, 0x87, 0x3e, 0xb2, 0x7d, 0xaf, 0x48, 0xd1,
+ 0xd3, 0xf7, 0x34, 0x82, 0x71, 0xfa, 0xa7, 0x11, 0x3e, 0x46, 0x8c, 0xad, 0x72, 0x17, 0x3b, 0x3f,
+ 0xc4, 0x5d, 0xec, 0xb7, 0xb4, 0x8b, 0xcc, 0x85, 0xe4, 0xed, 0xcd, 0xfd, 0xde, 0x36, 0x3d, 0xfe,
+ 0x0a, 0xf3, 0x9b, 0xea, 0x8d, 0xe3, 0x91, 0x24, 0xfa, 0x04, 0x29, 0x8f, 0xb9, 0x6b, 0x1c, 0x6b,
+ 0xb1, 0xd1, 0xd3, 0xc4, 0x9b, 0x8f, 0xfd, 0x3f, 0x8d, 0x37, 0x5f, 0x04, 0x50, 0xf2, 0xb6, 0x14,
+ 0x93, 0x27, 0x38, 0x4f, 0xce, 0xd9, 0xa2, 0x10, 0x9a, 0xff, 0xa1, 0x08, 0xd3, 0x8d, 0xc6, 0xea,
+ 0x82, 0xe7, 0xec, 0x76, 0xfc, 0x30, 0xf2, 0x9a, 0x4b, 0x9d, 0x1d, 0x9f, 0x4d, 0xe1, 0x75, 0x1a,
+ 0x46, 0x77, 0x5a, 0xfe, 0x23, 0x35, 0xf6, 0x39, 0xa2, 0x61, 0x64, 0xef, 0xb4, 0xfc, 0x47, 0x56,
+ 0x5c, 0xcc, 0x96, 0x88, 0xc5, 0x20, 0x88, 0x5f, 0xfb, 0xc0, 0x25, 0x82, 0x32, 0x80, 0xc5, 0xe1,
+ 0x6c, 0x96, 0x34, 0x7a, 0x3c, 0x01, 0x07, 0xcf, 0xb9, 0x86, 0xb3, 0x24, 0xe4, 0x20, 0x4b, 0x96,
+ 0x11, 0xda, 0x2f, 0xb0, 0x42, 0x6b, 0x5e, 0xd4, 0xa2, 0xd6, 0x93, 0x62, 0xf1, 0x6c, 0x1c, 0x42,
+ 0x71, 0x74, 0xed, 0x2e, 0xc2, 0x55, 0xe3, 0xbd, 0x6f, 0x0e, 0x44, 0x70, 0x9e, 0x19, 0x97, 0xfd,
+ 0x36, 0xc7, 0xc8, 0xf1, 0x36, 0xc7, 0xcb, 0x42, 0x27, 0x3c, 0x9f, 0x61, 0x73, 0xa8, 0x8f, 0x01,
+ 0x64, 0x32, 0x27, 0xbf, 0x60, 0xc0, 0xf3, 0x99, 0x25, 0xf1, 0xc4, 0xd6, 0x2f, 0x0d, 0x28, 0xfa,
+ 0x02, 0xf3, 0x95, 0x7c, 0x16, 0x6f, 0x69, 0x64, 0x7c, 0xda, 0xce, 0xd0, 0x02, 0xc7, 0x7f, 0x89,
+ 0xfc, 0x4b, 0x03, 0x2e, 0x6a, 0x18, 0x98, 0x6f, 0xb0, 0x4d, 0x3b, 0x27, 0x89, 0xf4, 0x47, 0x4f,
+ 0x47, 0xa4, 0x5f, 0xd4, 0xdb, 0xc2, 0x93, 0x2f, 0xe3, 0xe7, 0xd5, 0x4d, 0xe2, 0x80, 0x1a, 0x92,
+ 0x1f, 0x87, 0x69, 0x2c, 0x92, 0xa6, 0x0f, 0x13, 0x57, 0x94, 0xfe, 0x72, 0x7d, 0xee, 0xcf, 0x0e,
+ 0xab, 0x13, 0x5a, 0x01, 0xde, 0x28, 0xc4, 0xaf, 0xc5, 0x96, 0x92, 0xd7, 0xd9, 0xf1, 0xb5, 0x44,
+ 0xa2, 0x69, 0x66, 0xe4, 0xdf, 0x18, 0x30, 0xc3, 0xa0, 0xbc, 0xc2, 0x77, 0x02, 0xbf, 0x1d, 0x97,
+ 0x9f, 0x90, 0x27, 0xa0, 0xf5, 0x74, 0x3a, 0xe8, 0x65, 0xac, 0x32, 0x9f, 0xf8, 0xf6, 0x4e, 0xe0,
+ 0xb7, 0x93, 0xea, 0x6b, 0xb9, 0x42, 0x06, 0x55, 0x92, 0xfc, 0xac, 0x01, 0x97, 0xb4, 0x1d, 0x94,
+ 0x7a, 0x1f, 0x2f, 0xe5, 0x17, 0x50, 0x8b, 0xea, 0x37, 0x85, 0x90, 0x5f, 0xc3, 0x1a, 0x24, 0x4b,
+ 0x02, 0xd6, 0xc5, 0x6e, 0x73, 0x2c, 0xa5, 0x0a, 0x83, 0xbf, 0x62, 0x7e, 0x33, 0x07, 0xe3, 0xca,
+ 0x9a, 0x4a, 0x3e, 0x0f, 0xe5, 0xd5, 0x60, 0xd7, 0xe9, 0x78, 0x3f, 0xe1, 0x28, 0x67, 0x8e, 0xb8,
+ 0x66, 0xfb, 0x0a, 0xdc, 0xd2, 0xb0, 0x30, 0x56, 0x94, 0x3a, 0x6d, 0xd5, 0xda, 0x63, 0x6b, 0xb2,
+ 0x85, 0xd0, 0x53, 0xae, 0x2b, 0xef, 0x67, 0xac, 0x2b, 0xa7, 0x4a, 0x90, 0xf1, 0x4e, 0xff, 0xea,
+ 0x32, 0x7c, 0x3e, 0x0b, 0xf3, 0x97, 0x72, 0x50, 0x11, 0x0f, 0xc7, 0xcb, 0x13, 0xb3, 0x4f, 0xd7,
+ 0x43, 0x53, 0x7a, 0xe3, 0x8e, 0x89, 0x09, 0x29, 0xfc, 0xfa, 0x6f, 0x57, 0xf1, 0x19, 0xf0, 0x74,
+ 0x77, 0xc8, 0x67, 0xc0, 0x75, 0x78, 0xfa, 0xba, 0x5c, 0x9a, 0xca, 0x4a, 0xe3, 0x9b, 0x7f, 0x92,
+ 0x4b, 0xf3, 0x16, 0x2e, 0x84, 0x97, 0x61, 0x8c, 0xbf, 0xfb, 0x29, 0x6f, 0xf4, 0x88, 0xc4, 0x8e,
+ 0x08, 0xb2, 0x64, 0xd9, 0x69, 0x2e, 0x4e, 0x9e, 0xf4, 0x16, 0x3c, 0x79, 0x13, 0xca, 0x18, 0x24,
+ 0x59, 0x73, 0xdd, 0x80, 0x2d, 0x81, 0x85, 0x24, 0x87, 0xe3, 0x23, 0xba, 0x6d, 0xf3, 0x60, 0x4a,
+ 0xc7, 0x75, 0x03, 0x4b, 0xc3, 0x23, 0xf3, 0x70, 0x4e, 0x8b, 0xc9, 0x95, 0xf4, 0x23, 0xc9, 0x16,
+ 0x29, 0xc2, 0x02, 0x4e, 0x9c, 0x89, 0x8c, 0x69, 0x83, 0xf9, 0xb3, 0xfc, 0x68, 0xd9, 0xe8, 0xf9,
+ 0xef, 0xe4, 0xa4, 0x97, 0x07, 0xf5, 0x04, 0x13, 0x4f, 0xb4, 0x9d, 0xae, 0x96, 0xcb, 0x85, 0x23,
+ 0x9a, 0x7f, 0x61, 0xb0, 0xb9, 0xd6, 0xdc, 0xff, 0x94, 0x5d, 0xe9, 0x64, 0x4d, 0x3a, 0xc6, 0xc3,
+ 0xf5, 0xc7, 0x06, 0xbf, 0x94, 0x25, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0xaf, 0x8c, 0x8a, 0xeb, 0x43,
+ 0x2a, 0x17, 0x5e, 0x90, 0x04, 0x65, 0xf0, 0xb7, 0x4a, 0x2d, 0x41, 0xa0, 0x1a, 0xfd, 0xb9, 0xa1,
+ 0x8c, 0x7e, 0x25, 0x09, 0xfa, 0x70, 0x8f, 0x6b, 0x18, 0x27, 0x27, 0x41, 0x37, 0xff, 0x4f, 0x8e,
+ 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0x6c, 0xbc, 0xd7, 0xa0, 0x80, 0xef, 0xd9, 0x2b, 0x29, 0x8f, 0x53,
+ 0x6f, 0xd9, 0x63, 0x39, 0x9b, 0x37, 0xa8, 0x6b, 0xd5, 0x5b, 0xc4, 0xa8, 0x8e, 0xd5, 0x79, 0x83,
+ 0x18, 0xf8, 0x74, 0x85, 0xef, 0x52, 0x75, 0x3a, 0x74, 0xf4, 0x57, 0x46, 0xb0, 0x9c, 0x59, 0xf4,
+ 0xf1, 0x65, 0x1e, 0xd5, 0x8b, 0xdf, 0xde, 0x71, 0x6c, 0x7e, 0x89, 0x44, 0xd5, 0xb6, 0xc9, 0xbd,
+ 0x9f, 0x45, 0x98, 0xd4, 0x53, 0x8c, 0x08, 0x4f, 0x1b, 0xa6, 0x05, 0x48, 0xa5, 0x27, 0x51, 0x7d,
+ 0x3a, 0x3a, 0x11, 0xdb, 0x31, 0x69, 0x79, 0x24, 0xd4, 0x8c, 0xef, 0x3c, 0x75, 0x9c, 0xdd, 0x9f,
+ 0x00, 0x49, 0x27, 0x51, 0x4e, 0x89, 0x3f, 0x07, 0x15, 0x31, 0x33, 0xe3, 0x0b, 0xdd, 0xe8, 0xcf,
+ 0x58, 0x5a, 0xb0, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, 0x1d, 0x03, 0x2e, 0x89,
+ 0xd7, 0x53, 0x2d, 0x1a, 0x46, 0x81, 0xc7, 0xef, 0x87, 0xa3, 0x3c, 0x7e, 0x9e, 0xbc, 0x23, 0xb3,
+ 0x52, 0xea, 0x0a, 0x32, 0xfd, 0x8d, 0xfa, 0x84, 0x10, 0xca, 0x11, 0xcc, 0x4b, 0x29, 0xb3, 0x51,
+ 0xbe, 0x25, 0xb2, 0x51, 0xe6, 0x8e, 0x27, 0x8e, 0xe7, 0x85, 0x4b, 0x3b, 0x32, 0x0b, 0xe5, 0xb7,
+ 0x73, 0x70, 0x3e, 0xa3, 0x5a, 0x9b, 0x9f, 0x7f, 0x46, 0x95, 0x43, 0x5d, 0x53, 0x0e, 0x32, 0x5d,
+ 0xf1, 0xc0, 0x8e, 0xcf, 0xd4, 0x15, 0xbf, 0x69, 0xc0, 0x45, 0x5d, 0x7a, 0x84, 0x03, 0x76, 0xf3,
+ 0x36, 0x79, 0x1b, 0x46, 0xef, 0x51, 0xc7, 0xa5, 0xf2, 0xde, 0x61, 0x9c, 0xfa, 0x53, 0x1c, 0x89,
+ 0xf2, 0x42, 0xce, 0xf6, 0x4f, 0xf8, 0x54, 0x3e, 0x63, 0x09, 0x12, 0xb2, 0x20, 0x2a, 0xc7, 0x63,
+ 0x32, 0x4c, 0x19, 0x9e, 0x90, 0xf5, 0xa9, 0x63, 0xbc, 0x41, 0xbf, 0x6b, 0xc0, 0x73, 0xc7, 0xd0,
+ 0xb0, 0x81, 0x63, 0x43, 0xaf, 0x0e, 0x1c, 0x2e, 0x2c, 0x08, 0x25, 0xef, 0xc1, 0xd4, 0xba, 0x30,
+ 0x5d, 0xe5, 0x70, 0x28, 0x4f, 0xc9, 0x48, 0xab, 0xd6, 0x96, 0xe3, 0x92, 0x46, 0x26, 0xd7, 0xa1,
+ 0x78, 0xcf, 0x0f, 0xa3, 0x4e, 0x92, 0xe3, 0x0d, 0x5d, 0xde, 0x7b, 0x02, 0x66, 0xc5, 0xa5, 0xcc,
+ 0x2c, 0xd0, 0xab, 0x29, 0x62, 0x00, 0x5f, 0x84, 0x51, 0x86, 0x13, 0xbb, 0x94, 0x50, 0x0e, 0xf0,
+ 0x6d, 0x4f, 0xcf, 0xb5, 0x44, 0x51, 0xec, 0xcc, 0xcc, 0x65, 0x1e, 0xd5, 0x7f, 0xd3, 0x80, 0x8a,
+ 0xce, 0xfb, 0x49, 0x87, 0xe6, 0x5d, 0x6d, 0x68, 0x9e, 0xcb, 0x1e, 0x9a, 0xc1, 0x63, 0xd2, 0x97,
+ 0x6e, 0x69, 0xa8, 0xb1, 0x30, 0x61, 0x74, 0xc1, 0x6f, 0x3b, 0x5e, 0x47, 0x4d, 0x11, 0xe4, 0x22,
+ 0xc4, 0x12, 0x25, 0x4a, 0x6f, 0xe5, 0x07, 0xf6, 0x96, 0xf9, 0xcb, 0x05, 0xb8, 0x64, 0xd1, 0x5d,
+ 0x8f, 0x19, 0x48, 0x1b, 0xa1, 0xd7, 0xd9, 0xd5, 0x02, 0x29, 0xcc, 0x54, 0x87, 0x8b, 0xf0, 0x71,
+ 0x06, 0x89, 0xfb, 0xfb, 0x55, 0x28, 0x32, 0x2d, 0xad, 0xf4, 0x39, 0xba, 0x09, 0x30, 0xd1, 0x1d,
+ 0x1f, 0x57, 0x59, 0x4c, 0x6e, 0x88, 0x35, 0x44, 0xb9, 0xe0, 0xc3, 0xd6, 0x90, 0x1f, 0x1e, 0x56,
+ 0x81, 0xbf, 0xe5, 0xc0, 0x4a, 0xc5, 0x3a, 0x12, 0x1b, 0x55, 0x85, 0x01, 0x46, 0xd5, 0x03, 0x38,
+ 0x57, 0x73, 0xb9, 0x7e, 0x72, 0x5a, 0x6b, 0x81, 0xd7, 0x69, 0x7a, 0x5d, 0xa7, 0x25, 0x8d, 0x72,
+ 0x74, 0x16, 0x39, 0x71, 0xb9, 0xdd, 0x8d, 0x11, 0xac, 0x4c, 0x32, 0xd6, 0x8c, 0x85, 0x95, 0x06,
+ 0xcf, 0x63, 0xc6, 0x3d, 0x40, 0xd8, 0x0c, 0xb7, 0x13, 0xf2, 0x44, 0x66, 0x56, 0x5c, 0x8c, 0xe6,
+ 0x1c, 0xde, 0xf1, 0x5b, 0x5f, 0x6e, 0xdc, 0x17, 0x77, 0xe6, 0x64, 0xfc, 0x31, 0xbf, 0x12, 0x18,
+ 0xb5, 0x42, 0x74, 0x5a, 0x6b, 0x78, 0x09, 0x5d, 0xa3, 0x71, 0x8f, 0xd1, 0x15, 0xfb, 0xe8, 0xc2,
+ 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0x64, 0x16, 0x80, 0x47, 0x70, 0xa2, 0x40, 0x94, 0x12, 0xe3, 0x2f,
+ 0x40, 0x28, 0x37, 0xfe, 0x14, 0x14, 0xf2, 0x0e, 0x9c, 0x5d, 0x9c, 0x9f, 0x93, 0x97, 0xe1, 0x16,
+ 0xfc, 0x66, 0x8f, 0xed, 0x9b, 0xf1, 0x72, 0x66, 0x99, 0x8f, 0x21, 0x6d, 0xce, 0x31, 0x29, 0xc8,
+ 0x42, 0x13, 0x57, 0xe2, 0xf8, 0x85, 0xea, 0x79, 0xdf, 0xa5, 0xe1, 0xe6, 0xad, 0x4f, 0xd9, 0x95,
+ 0x38, 0xa5, 0x6d, 0x38, 0xdb, 0x6e, 0x65, 0xce, 0xcc, 0xbf, 0x85, 0x57, 0xe2, 0xfa, 0x70, 0xc9,
+ 0x8f, 0xc0, 0x08, 0xfe, 0x14, 0x2b, 0xee, 0xd9, 0x0c, 0xb6, 0xc9, 0x6a, 0xdb, 0xe4, 0x29, 0xa9,
+ 0x90, 0x80, 0x2c, 0x25, 0x2f, 0xe5, 0x9c, 0xe2, 0x62, 0x87, 0xc8, 0xca, 0xa0, 0x3f, 0x91, 0xe6,
+ 0x42, 0x59, 0xfd, 0x20, 0x93, 0x91, 0x7b, 0x4e, 0xb8, 0x47, 0xdd, 0x79, 0xf9, 0xb0, 0x72, 0x99,
+ 0xcb, 0xc8, 0x1e, 0x42, 0xf1, 0xf9, 0x36, 0x4b, 0x41, 0x61, 0xda, 0x61, 0x29, 0xdc, 0x08, 0x45,
+ 0x55, 0xc4, 0x2e, 0xc8, 0xc3, 0xdd, 0xab, 0x6b, 0x89, 0x22, 0xd4, 0x96, 0xd2, 0x4f, 0x18, 0x38,
+ 0xcd, 0x7d, 0x1a, 0x6c, 0xde, 0xfa, 0x24, 0xb4, 0xa5, 0xfe, 0x8d, 0x63, 0xc6, 0xe4, 0x57, 0x8a,
+ 0x71, 0x46, 0x35, 0x0d, 0x99, 0xd9, 0x88, 0x49, 0x38, 0x9a, 0x91, 0xd8, 0x88, 0x49, 0x38, 0x9a,
+ 0x6a, 0x23, 0xc6, 0xa8, 0x71, 0x5a, 0xfd, 0xdc, 0x09, 0x69, 0xf5, 0x07, 0xbc, 0xe4, 0x21, 0x6f,
+ 0x32, 0x7c, 0x8a, 0x1e, 0x49, 0xfa, 0x22, 0x94, 0x6b, 0x51, 0xe4, 0x34, 0xf7, 0xa8, 0x8b, 0xcf,
+ 0x37, 0x28, 0x51, 0x30, 0x8e, 0x80, 0xab, 0x31, 0xd2, 0x2a, 0xae, 0xf2, 0x48, 0xda, 0xd8, 0x10,
+ 0x8f, 0xa4, 0xcd, 0xc2, 0xd8, 0x52, 0xe7, 0xa1, 0xc7, 0xfa, 0xa4, 0x98, 0x64, 0x44, 0xf2, 0x38,
+ 0x48, 0x7f, 0x59, 0x0b, 0x41, 0xe4, 0x2d, 0xc5, 0x82, 0x28, 0x25, 0xa6, 0x3c, 0xdf, 0x66, 0xd9,
+ 0xd2, 0x90, 0x50, 0x8f, 0x1f, 0x24, 0x3a, 0x79, 0x13, 0xc6, 0xe4, 0xee, 0x19, 0x12, 0xf3, 0x5d,
+ 0x50, 0x3a, 0xbc, 0x44, 0x4b, 0xc2, 0x24, 0x76, 0xcf, 0xef, 0xe8, 0x97, 0x26, 0xc7, 0x95, 0x64,
+ 0x24, 0xca, 0xa5, 0x49, 0x2d, 0x19, 0x89, 0x72, 0x7d, 0x32, 0xde, 0x0c, 0x95, 0x4f, 0xdc, 0x0c,
+ 0x6d, 0x42, 0x79, 0xcd, 0x09, 0x22, 0x8f, 0x2d, 0x47, 0x9d, 0x88, 0x67, 0xc3, 0x4c, 0xf6, 0xea,
+ 0x4a, 0x51, 0xfd, 0x05, 0x99, 0x94, 0xa3, 0xab, 0xe0, 0xeb, 0xd9, 0x1c, 0x12, 0x38, 0x59, 0xc9,
+ 0x08, 0xab, 0x17, 0x19, 0xa2, 0xd1, 0x75, 0xae, 0xa6, 0x23, 0xe6, 0xa5, 0xaa, 0x67, 0xb4, 0x3f,
+ 0x22, 0xff, 0x36, 0x1f, 0x03, 0xdc, 0x33, 0x4e, 0x21, 0x1b, 0x4c, 0xa9, 0x85, 0x76, 0x45, 0x6a,
+ 0xe3, 0x18, 0x23, 0x92, 0xaf, 0x41, 0x99, 0xfd, 0x8f, 0xa9, 0x01, 0x3d, 0xca, 0xb3, 0x5d, 0x26,
+ 0x61, 0xd6, 0xfa, 0x84, 0xe6, 0xf9, 0x03, 0x1b, 0x34, 0xe2, 0x13, 0x18, 0x19, 0xa7, 0x1d, 0x2f,
+ 0x1a, 0x37, 0xf3, 0x07, 0x06, 0x5c, 0x1c, 0xc0, 0x63, 0xe8, 0xe7, 0x11, 0x67, 0x93, 0x05, 0x49,
+ 0xd9, 0x9b, 0x8b, 0x05, 0x49, 0x15, 0x0c, 0xb9, 0x34, 0x65, 0xe7, 0xa9, 0xcc, 0x7f, 0x62, 0x79,
+ 0x2a, 0xcd, 0x43, 0x03, 0xc6, 0x95, 0x91, 0x7d, 0x8a, 0xaf, 0x14, 0x5d, 0x13, 0x09, 0x9b, 0xf3,
+ 0x09, 0x5e, 0x3b, 0xb5, 0x0f, 0xc7, 0x04, 0xcd, 0x5f, 0x07, 0x58, 0x76, 0xc2, 0xa8, 0xd6, 0x8c,
+ 0xbc, 0x87, 0x74, 0x08, 0x35, 0x96, 0x64, 0xa7, 0x71, 0x30, 0xcb, 0x3a, 0x23, 0xeb, 0xcb, 0x4e,
+ 0x13, 0x33, 0x34, 0x57, 0x60, 0xb4, 0xe1, 0x07, 0x51, 0xfd, 0x80, 0xaf, 0x4d, 0x0b, 0x34, 0x6c,
+ 0xaa, 0x1e, 0x3a, 0x0f, 0xf7, 0xea, 0x4d, 0x4b, 0x14, 0x31, 0x03, 0xf1, 0x8e, 0x47, 0x5b, 0xae,
+ 0x7a, 0xe6, 0xb4, 0xc3, 0x00, 0x16, 0x87, 0xdf, 0x78, 0x1f, 0xa6, 0x64, 0xce, 0xd8, 0xf5, 0xe5,
+ 0x06, 0xb6, 0x60, 0x0a, 0xc6, 0x37, 0x17, 0xad, 0xa5, 0x3b, 0x5f, 0xb1, 0xef, 0x6c, 0x2c, 0x2f,
+ 0x57, 0xce, 0x90, 0x09, 0x28, 0x09, 0xc0, 0x7c, 0xad, 0x62, 0x90, 0x32, 0x14, 0x97, 0x56, 0x1a,
+ 0x8b, 0xf3, 0x1b, 0xd6, 0x62, 0x25, 0x77, 0xe3, 0x65, 0x98, 0x4c, 0x82, 0x0e, 0x30, 0x31, 0xc1,
+ 0x18, 0xe4, 0xad, 0xda, 0x56, 0xe5, 0x0c, 0x01, 0x18, 0x5d, 0xbb, 0x3f, 0xdf, 0xb8, 0x75, 0xab,
+ 0x62, 0xdc, 0xf8, 0x1c, 0x4c, 0xa3, 0xd7, 0x6e, 0x99, 0x19, 0xd1, 0x1d, 0x1a, 0xe0, 0x97, 0xca,
+ 0x50, 0x6c, 0xd0, 0xae, 0x13, 0x38, 0x11, 0xe5, 0x9f, 0x79, 0xd0, 0x6b, 0x45, 0x5e, 0xb7, 0x45,
+ 0x1f, 0x57, 0x8c, 0x1b, 0x6f, 0xc1, 0x94, 0xe5, 0xf7, 0x22, 0xaf, 0xb3, 0x2b, 0xf3, 0xcb, 0x93,
+ 0xf3, 0x30, 0xbd, 0xb1, 0x52, 0x7b, 0x50, 0x5f, 0xba, 0xbb, 0xb1, 0xba, 0xd1, 0xb0, 0x1f, 0xd4,
+ 0xd6, 0xe7, 0xef, 0x55, 0xce, 0xb0, 0x0a, 0x3f, 0x58, 0x6d, 0xac, 0xdb, 0xd6, 0xe2, 0xfc, 0xe2,
+ 0xca, 0x7a, 0xc5, 0xb8, 0xf1, 0x8b, 0x06, 0x4c, 0xea, 0x4f, 0xef, 0x92, 0xab, 0x70, 0x65, 0xa3,
+ 0xb1, 0x68, 0xd9, 0xeb, 0xab, 0xf7, 0x17, 0x57, 0xec, 0x8d, 0x46, 0xed, 0xee, 0xa2, 0xbd, 0xb1,
+ 0xd2, 0x58, 0x5b, 0x9c, 0x5f, 0xba, 0xb3, 0xb4, 0xb8, 0x50, 0x39, 0x43, 0xaa, 0xf0, 0x9c, 0x82,
+ 0x61, 0x2d, 0xce, 0xaf, 0x6e, 0x2e, 0x5a, 0xf6, 0x5a, 0xad, 0xd1, 0xd8, 0x5a, 0xb5, 0x16, 0x2a,
+ 0x06, 0xb9, 0x0c, 0x17, 0x32, 0x10, 0x1e, 0xdc, 0xa9, 0x55, 0x72, 0x7d, 0x65, 0x2b, 0x8b, 0x5b,
+ 0xb5, 0x65, 0xbb, 0xbe, 0xba, 0x5e, 0xc9, 0xdf, 0x78, 0x9f, 0x59, 0x21, 0xc9, 0x5b, 0x56, 0xa4,
+ 0x08, 0x85, 0x95, 0xd5, 0x95, 0xc5, 0xca, 0x19, 0x32, 0x0e, 0x63, 0x6b, 0x8b, 0x2b, 0x0b, 0x4b,
+ 0x2b, 0x77, 0x79, 0xb7, 0xd6, 0xd6, 0xd6, 0xac, 0xd5, 0xcd, 0xc5, 0x85, 0x4a, 0x8e, 0xf5, 0xdd,
+ 0xc2, 0xe2, 0x0a, 0xab, 0x59, 0xfe, 0x86, 0xc9, 0xdf, 0x6f, 0xd0, 0x12, 0x83, 0xb3, 0xde, 0x5a,
+ 0xfc, 0xf2, 0xfa, 0xe2, 0x4a, 0x63, 0x69, 0x75, 0xa5, 0x72, 0xe6, 0xc6, 0x95, 0x14, 0x8e, 0x1c,
+ 0x89, 0x46, 0xe3, 0x5e, 0xe5, 0xcc, 0x8d, 0xaf, 0x41, 0x59, 0x5d, 0x84, 0xc9, 0x45, 0x38, 0xab,
+ 0xfe, 0x5e, 0xa3, 0x1d, 0xd7, 0xeb, 0xec, 0x56, 0xce, 0xa4, 0x0b, 0xac, 0x5e, 0xa7, 0xc3, 0x0a,
+ 0xb0, 0xf1, 0x6a, 0xc1, 0x3a, 0x0d, 0xda, 0x5e, 0x87, 0xad, 0xaf, 0x95, 0x5c, 0xbd, 0xf2, 0xbd,
+ 0x3f, 0x7f, 0xe1, 0xcc, 0xf7, 0xbe, 0xff, 0x82, 0xf1, 0x27, 0xdf, 0x7f, 0xc1, 0xf8, 0xaf, 0xdf,
+ 0x7f, 0xc1, 0xd8, 0x1e, 0x45, 0x41, 0xbf, 0xfd, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xe4,
+ 0xaa, 0x4b, 0x2d, 0xbf, 0x00, 0x00,
}
func (m *KeepAlive) Marshal() (dAtA []byte, err error) {
@@ -15829,6 +16070,56 @@ func (m *ClaimMapping) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *TraitMapping) 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 *TraitMapping) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *TraitMapping) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.XXX_unrecognized != nil {
+ i -= len(m.XXX_unrecognized)
+ copy(dAtA[i:], m.XXX_unrecognized)
+ }
+ if len(m.Roles) > 0 {
+ for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Roles[iNdEx])
+ copy(dAtA[i:], m.Roles[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx])))
+ i--
+ dAtA[i] = 0x1a
+ }
+ }
+ if len(m.Value) > 0 {
+ i -= len(m.Value)
+ copy(dAtA[i:], m.Value)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Value)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Trait) > 0 {
+ i -= len(m.Trait)
+ copy(dAtA[i:], m.Trait)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Trait)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *Rule) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -19103,6 +19394,279 @@ func (m *GithubConnectorSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *SSOWarnings) 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 *SSOWarnings) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *SSOWarnings) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.XXX_unrecognized != nil {
+ i -= len(m.XXX_unrecognized)
+ copy(dAtA[i:], m.XXX_unrecognized)
+ }
+ if len(m.Warnings) > 0 {
+ for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Warnings[iNdEx])
+ copy(dAtA[i:], m.Warnings[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Warnings[iNdEx])))
+ i--
+ dAtA[i] = 0x12
+ }
+ }
+ if len(m.Message) > 0 {
+ i -= len(m.Message)
+ copy(dAtA[i:], m.Message)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Message)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *CreateUserParams) 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 *CreateUserParams) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *CreateUserParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.XXX_unrecognized != nil {
+ i -= len(m.XXX_unrecognized)
+ copy(dAtA[i:], m.XXX_unrecognized)
+ }
+ if m.SessionTTL != 0 {
+ i = encodeVarintTypes(dAtA, i, uint64(m.SessionTTL))
+ i--
+ dAtA[i] = 0x40
+ }
+ {
+ size := m.Traits.Size()
+ i -= size
+ if _, err := m.Traits.MarshalTo(dAtA[i:]); err != nil {
+ return 0, err
+ }
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x3a
+ if len(m.Roles) > 0 {
+ for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Roles[iNdEx])
+ copy(dAtA[i:], m.Roles[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Roles[iNdEx])))
+ i--
+ dAtA[i] = 0x32
+ }
+ }
+ if len(m.KubeUsers) > 0 {
+ for iNdEx := len(m.KubeUsers) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.KubeUsers[iNdEx])
+ copy(dAtA[i:], m.KubeUsers[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeUsers[iNdEx])))
+ i--
+ dAtA[i] = 0x2a
+ }
+ }
+ if len(m.KubeGroups) > 0 {
+ for iNdEx := len(m.KubeGroups) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.KubeGroups[iNdEx])
+ copy(dAtA[i:], m.KubeGroups[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.KubeGroups[iNdEx])))
+ i--
+ dAtA[i] = 0x22
+ }
+ }
+ if len(m.Logins) > 0 {
+ for iNdEx := len(m.Logins) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Logins[iNdEx])
+ copy(dAtA[i:], m.Logins[iNdEx])
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Logins[iNdEx])))
+ i--
+ dAtA[i] = 0x1a
+ }
+ }
+ if len(m.Username) > 0 {
+ i -= len(m.Username)
+ copy(dAtA[i:], m.Username)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Username)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.ConnectorName) > 0 {
+ i -= len(m.ConnectorName)
+ copy(dAtA[i:], m.ConnectorName)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.ConnectorName)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *SSODiagnosticInfo) 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 *SSODiagnosticInfo) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *SSODiagnosticInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.XXX_unrecognized != nil {
+ i -= len(m.XXX_unrecognized)
+ copy(dAtA[i:], m.XXX_unrecognized)
+ }
+ if len(m.SAMLConnectorTraitMapping) > 0 {
+ for iNdEx := len(m.SAMLConnectorTraitMapping) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.SAMLConnectorTraitMapping[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x52
+ }
+ }
+ {
+ size := m.SAMLTraitsFromAssertions.Size()
+ i -= size
+ if _, err := m.SAMLTraitsFromAssertions.MarshalTo(dAtA[i:]); err != nil {
+ return 0, err
+ }
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x4a
+ if m.SAMLAssertionInfo != nil {
+ {
+ size := m.SAMLAssertionInfo.Size()
+ i -= size
+ if _, err := m.SAMLAssertionInfo.MarshalTo(dAtA[i:]); err != nil {
+ return 0, err
+ }
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x42
+ }
+ {
+ size := m.SAMLAttributeStatements.Size()
+ i -= size
+ if _, err := m.SAMLAttributeStatements.MarshalTo(dAtA[i:]); err != nil {
+ return 0, err
+ }
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x3a
+ if m.SAMLAttributesToRolesWarnings != nil {
+ {
+ size, err := m.SAMLAttributesToRolesWarnings.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x32
+ }
+ if len(m.SAMLAttributesToRoles) > 0 {
+ for iNdEx := len(m.SAMLAttributesToRoles) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.SAMLAttributesToRoles[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x2a
+ }
+ }
+ if m.CreateUserParams != nil {
+ {
+ size, err := m.CreateUserParams.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x22
+ }
+ if m.Success {
+ i--
+ if m.Success {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x18
+ }
+ if len(m.Error) > 0 {
+ i -= len(m.Error)
+ copy(dAtA[i:], m.Error)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Error)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.TestFlow {
+ i--
+ if m.TestFlow {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x8
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *TeamMapping) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -19454,12 +20018,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) {
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.Expires != nil {
- n172, err172 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):])
- if err172 != nil {
- return 0, err172
+ n177, err177 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):])
+ if err177 != nil {
+ return 0, err177
}
- i -= n172
- i = encodeVarintTypes(dAtA, i, uint64(n172))
+ i -= n177
+ i = encodeVarintTypes(dAtA, i, uint64(n177))
i--
dAtA[i] = 0x1a
}
@@ -20140,12 +20704,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
- n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):])
- if err182 != nil {
- return 0, err182
+ n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):])
+ if err187 != nil {
+ return 0, err187
}
- i -= n182
- i = encodeVarintTypes(dAtA, i, uint64(n182))
+ i -= n187
+ i = encodeVarintTypes(dAtA, i, uint64(n187))
i--
dAtA[i] = 0x12
if len(m.Codes) > 0 {
@@ -20375,20 +20939,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x32
}
- n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):])
- if err185 != nil {
- return 0, err185
+ n190, err190 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):])
+ if err190 != nil {
+ return 0, err190
}
- i -= n185
- i = encodeVarintTypes(dAtA, i, uint64(n185))
+ i -= n190
+ i = encodeVarintTypes(dAtA, i, uint64(n190))
i--
dAtA[i] = 0x2a
- n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):])
- if err186 != nil {
- return 0, err186
+ n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):])
+ if err191 != nil {
+ return 0, err191
}
- i -= n186
- i = encodeVarintTypes(dAtA, i, uint64(n186))
+ i -= n191
+ i = encodeVarintTypes(dAtA, i, uint64(n191))
i--
dAtA[i] = 0x22
if m.State != 0 {
@@ -20492,12 +21056,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
- n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):])
- if err187 != nil {
- return 0, err187
+ n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):])
+ if err192 != nil {
+ return 0, err192
}
- i -= n187
- i = encodeVarintTypes(dAtA, i, uint64(n187))
+ i -= n192
+ i = encodeVarintTypes(dAtA, i, uint64(n192))
i--
dAtA[i] = 0x22
if len(m.Mode) > 0 {
@@ -23252,6 +23816,32 @@ func (m *ClaimMapping) Size() (n int) {
return n
}
+func (m *TraitMapping) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Trait)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ l = len(m.Value)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if len(m.Roles) > 0 {
+ for _, s := range m.Roles {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if m.XXX_unrecognized != nil {
+ n += len(m.XXX_unrecognized)
+ }
+ return n
+}
+
func (m *Rule) Size() (n int) {
if m == nil {
return 0
@@ -24736,6 +25326,127 @@ func (m *GithubConnectorSpecV3) Size() (n int) {
return n
}
+func (m *SSOWarnings) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Message)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if len(m.Warnings) > 0 {
+ for _, s := range m.Warnings {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if m.XXX_unrecognized != nil {
+ n += len(m.XXX_unrecognized)
+ }
+ return n
+}
+
+func (m *CreateUserParams) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.ConnectorName)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ l = len(m.Username)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if len(m.Logins) > 0 {
+ for _, s := range m.Logins {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if len(m.KubeGroups) > 0 {
+ for _, s := range m.KubeGroups {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if len(m.KubeUsers) > 0 {
+ for _, s := range m.KubeUsers {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if len(m.Roles) > 0 {
+ for _, s := range m.Roles {
+ l = len(s)
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ l = m.Traits.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ if m.SessionTTL != 0 {
+ n += 1 + sovTypes(uint64(m.SessionTTL))
+ }
+ if m.XXX_unrecognized != nil {
+ n += len(m.XXX_unrecognized)
+ }
+ return n
+}
+
+func (m *SSODiagnosticInfo) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.TestFlow {
+ n += 2
+ }
+ l = len(m.Error)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.Success {
+ n += 2
+ }
+ if m.CreateUserParams != nil {
+ l = m.CreateUserParams.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if len(m.SAMLAttributesToRoles) > 0 {
+ for _, e := range m.SAMLAttributesToRoles {
+ l = e.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if m.SAMLAttributesToRolesWarnings != nil {
+ l = m.SAMLAttributesToRolesWarnings.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ l = m.SAMLAttributeStatements.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ if m.SAMLAssertionInfo != nil {
+ l = m.SAMLAssertionInfo.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ l = m.SAMLTraitsFromAssertions.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ if len(m.SAMLConnectorTraitMapping) > 0 {
+ for _, e := range m.SAMLConnectorTraitMapping {
+ l = e.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
+ if m.XXX_unrecognized != nil {
+ n += len(m.XXX_unrecognized)
+ }
+ return n
+}
+
func (m *TeamMapping) Size() (n int) {
if m == nil {
return 0
@@ -43825,7 +44536,7 @@ func (m *ClaimMapping) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *Rule) Unmarshal(dAtA []byte) error {
+func (m *TraitMapping) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -43848,15 +44559,15 @@ func (m *Rule) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: Rule: wiretype end group for non-group")
+ return fmt.Errorf("proto: TraitMapping: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: TraitMapping: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Trait", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -43884,11 +44595,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex]))
+ m.Trait = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -43916,43 +44627,11 @@ func (m *Rule) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex]))
+ m.Value = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 3:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType)
- }
- var stringLen uint64
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowTypes
- }
- 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 ErrInvalidLengthTypes
- }
- postIndex := iNdEx + intStringLen
- if postIndex < 0 {
- return ErrInvalidLengthTypes
- }
- if postIndex > l {
- return io.ErrUnexpectedEOF
- }
- m.Where = string(dAtA[iNdEx:postIndex])
- iNdEx = postIndex
- case 4:
- if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -43980,7 +44659,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex]))
+ m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -44004,7 +44683,7 @@ func (m *Rule) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
+func (m *Rule) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -44027,15 +44706,15 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group")
+ return fmt.Errorf("proto: Rule: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: Rule: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -44063,11 +44742,11 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Users = append(m.Users, string(dAtA[iNdEx:postIndex]))
+ m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -44095,7 +44774,7 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
+ m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 3:
if wireType != 2 {
@@ -44129,6 +44808,38 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
}
m.Where = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Actions = append(m.Actions, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -44151,7 +44862,7 @@ func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *BoolValue) Unmarshal(dAtA []byte) error {
+func (m *ImpersonateConditions) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -44174,17 +44885,17 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: BoolValue: wiretype end group for non-group")
+ return fmt.Errorf("proto: ImpersonateConditions: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: ImpersonateConditions: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
- if wireType != 0 {
- return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType)
}
- var v int
+ var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -44194,66 +44905,213 @@ func (m *BoolValue) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- v |= int(b&0x7F) << shift
+ stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
- m.Value = bool(v != 0)
- default:
- iNdEx = preIndex
- skippy, err := skipTypes(dAtA[iNdEx:])
- if err != nil {
- return err
- }
- if (skippy < 0) || (iNdEx+skippy) < 0 {
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
return ErrInvalidLengthTypes
}
- if (iNdEx + skippy) > l {
- return io.ErrUnexpectedEOF
- }
- m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
- iNdEx += skippy
- }
- }
-
- if iNdEx > l {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
-func (m *UserV2) 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 ErrIntOverflowTypes
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
}
- if iNdEx >= l {
+ if postIndex > 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: UserV2: wiretype end group for non-group")
- }
- if fieldNum <= 0 {
- return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire)
- }
- switch fieldNum {
- case 1:
+ m.Users = append(m.Users, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Where", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Where = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *BoolValue) 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 ErrIntOverflowTypes
+ }
+ 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: BoolValue: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Value = bool(v != 0)
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *UserV2) 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 ErrIntOverflowTypes
+ }
+ 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: UserV2: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: UserV2: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -52883,11 +53741,752 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Value = string(dAtA[iNdEx:postIndex])
+ m.Value = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *AsymmetricKeyPair) 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 ErrIntOverflowTypes
+ }
+ 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: AsymmetricKeyPair: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.PrivateKey = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Cert = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *GithubConnectorV3) 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 ErrIntOverflowTypes
+ }
+ 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: GithubConnectorV3: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Kind = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.SubKind = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Version = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *GithubConnectorV3List) 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 ErrIntOverflowTypes
+ }
+ 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: GithubConnectorV3List: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{})
+ if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *GithubConnectorSpecV3) 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 ErrIntOverflowTypes
+ }
+ 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: GithubConnectorSpecV3: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.ClientID = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.ClientSecret = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.RedirectURL = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{})
+ if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Display = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *SSOWarnings) 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 ErrIntOverflowTypes
+ }
+ 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: SSOWarnings: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: SSOWarnings: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Message = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
- case 3:
+ case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -52915,7 +54514,7 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
+ m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -52939,7 +54538,7 @@ func (m *AttributeMapping) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error {
+func (m *CreateUserParams) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -52962,15 +54561,15 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: AsymmetricKeyPair: wiretype end group for non-group")
+ return fmt.Errorf("proto: CreateUserParams: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: AsymmetricKeyPair: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: CreateUserParams: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field ConnectorName", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -52998,11 +54597,11 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.PrivateKey = string(dAtA[iNdEx:postIndex])
+ m.ConnectorName = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Cert", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -53030,62 +54629,11 @@ func (m *AsymmetricKeyPair) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Cert = string(dAtA[iNdEx:postIndex])
+ m.Username = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
- default:
- iNdEx = preIndex
- skippy, err := skipTypes(dAtA[iNdEx:])
- if err != nil {
- return err
- }
- if (skippy < 0) || (iNdEx+skippy) < 0 {
- return ErrInvalidLengthTypes
- }
- if (iNdEx + skippy) > l {
- return io.ErrUnexpectedEOF
- }
- m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
- iNdEx += skippy
- }
- }
-
- if iNdEx > l {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
-func (m *GithubConnectorV3) 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 ErrIntOverflowTypes
- }
- 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: GithubConnectorV3: wiretype end group for non-group")
- }
- if fieldNum <= 0 {
- return fmt.Errorf("proto: GithubConnectorV3: illegal tag %d (wire type %d)", fieldNum, wire)
- }
- switch fieldNum {
- case 1:
+ case 3:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -53113,11 +54661,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Kind = string(dAtA[iNdEx:postIndex])
+ m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
- case 2:
+ case 4:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field KubeGroups", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -53145,11 +54693,11 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.SubKind = string(dAtA[iNdEx:postIndex])
+ m.KubeGroups = append(m.KubeGroups, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
- case 3:
+ case 5:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field KubeUsers", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
@@ -53177,13 +54725,13 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Version = string(dAtA[iNdEx:postIndex])
+ m.KubeUsers = append(m.KubeUsers, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
- case 4:
+ case 6:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType)
}
- var msglen int
+ var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -53193,28 +54741,27 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- msglen |= int(b&0x7F) << shift
+ stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
- if msglen < 0 {
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
return ErrInvalidLengthTypes
}
- postIndex := iNdEx + msglen
+ postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
- return err
- }
+ m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
- case 5:
+ case 7:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -53241,10 +54788,29 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
+ case 8:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SessionTTL", wireType)
+ }
+ m.SessionTTL = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.SessionTTL |= Duration(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -53267,7 +54833,7 @@ func (m *GithubConnectorV3) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error {
+func (m *SSODiagnosticInfo) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -53290,15 +54856,87 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: GithubConnectorV3List: wiretype end group for non-group")
+ return fmt.Errorf("proto: SSODiagnosticInfo: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: GithubConnectorV3List: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: SSODiagnosticInfo: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field TestFlow", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.TestFlow = bool(v != 0)
+ case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field GithubConnectors", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ 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 ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Error = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Success = bool(v != 0)
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CreateUserParams", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -53325,67 +54963,52 @@ func (m *GithubConnectorV3List) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.GithubConnectors = append(m.GithubConnectors, &GithubConnectorV3{})
- if err := m.GithubConnectors[len(m.GithubConnectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ if m.CreateUserParams == nil {
+ m.CreateUserParams = &CreateUserParams{}
+ }
+ if err := m.CreateUserParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
- default:
- iNdEx = preIndex
- skippy, err := skipTypes(dAtA[iNdEx:])
- if err != nil {
- return err
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRoles", wireType)
}
- if (skippy < 0) || (iNdEx+skippy) < 0 {
- return ErrInvalidLengthTypes
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
}
- if (iNdEx + skippy) > l {
- return io.ErrUnexpectedEOF
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
}
- m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
- iNdEx += skippy
- }
- }
-
- if iNdEx > l {
- return io.ErrUnexpectedEOF
- }
- return nil
-}
-func (m *GithubConnectorSpecV3) 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 ErrIntOverflowTypes
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
}
- if iNdEx >= l {
+ if postIndex > l {
return io.ErrUnexpectedEOF
}
- b := dAtA[iNdEx]
- iNdEx++
- wire |= uint64(b&0x7F) << shift
- if b < 0x80 {
- break
+ m.SAMLAttributesToRoles = append(m.SAMLAttributesToRoles, AttributeMapping{})
+ if err := m.SAMLAttributesToRoles[len(m.SAMLAttributesToRoles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
}
- }
- fieldNum := int32(wire >> 3)
- wireType := int(wire & 0x7)
- if wireType == 4 {
- return fmt.Errorf("proto: GithubConnectorSpecV3: wiretype end group for non-group")
- }
- if fieldNum <= 0 {
- return fmt.Errorf("proto: GithubConnectorSpecV3: illegal tag %d (wire type %d)", fieldNum, wire)
- }
- switch fieldNum {
- case 1:
+ iNdEx = postIndex
+ case 6:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributesToRolesWarnings", wireType)
}
- var stringLen uint64
+ var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -53395,29 +55018,33 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- stringLen |= uint64(b&0x7F) << shift
+ msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
- intStringLen := int(stringLen)
- if intStringLen < 0 {
+ if msglen < 0 {
return ErrInvalidLengthTypes
}
- postIndex := iNdEx + intStringLen
+ postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.ClientID = string(dAtA[iNdEx:postIndex])
+ if m.SAMLAttributesToRolesWarnings == nil {
+ m.SAMLAttributesToRolesWarnings = &SSOWarnings{}
+ }
+ if err := m.SAMLAttributesToRolesWarnings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
iNdEx = postIndex
- case 2:
+ case 7:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLAttributeStatements", wireType)
}
- var stringLen uint64
+ var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -53427,29 +55054,30 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- stringLen |= uint64(b&0x7F) << shift
+ msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
- intStringLen := int(stringLen)
- if intStringLen < 0 {
+ if msglen < 0 {
return ErrInvalidLengthTypes
}
- postIndex := iNdEx + intStringLen
+ postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.ClientSecret = string(dAtA[iNdEx:postIndex])
+ if err := m.SAMLAttributeStatements.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
iNdEx = postIndex
- case 3:
+ case 8:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field RedirectURL", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLAssertionInfo", wireType)
}
- var stringLen uint64
+ var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -53459,27 +55087,30 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- stringLen |= uint64(b&0x7F) << shift
+ byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
- intStringLen := int(stringLen)
- if intStringLen < 0 {
+ if byteLen < 0 {
return ErrInvalidLengthTypes
}
- postIndex := iNdEx + intStringLen
+ postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.RedirectURL = string(dAtA[iNdEx:postIndex])
+ var v AssertionInfo
+ m.SAMLAssertionInfo = &v
+ if err := m.SAMLAssertionInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
iNdEx = postIndex
- case 4:
+ case 9:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field TeamsToLogins", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLTraitsFromAssertions", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -53506,16 +55137,15 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.TeamsToLogins = append(m.TeamsToLogins, TeamMapping{})
- if err := m.TeamsToLogins[len(m.TeamsToLogins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ if err := m.SAMLTraitsFromAssertions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
- case 5:
+ case 10:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Display", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SAMLConnectorTraitMapping", wireType)
}
- var stringLen uint64
+ var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -53525,23 +55155,25 @@ func (m *GithubConnectorSpecV3) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- stringLen |= uint64(b&0x7F) << shift
+ msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
- intStringLen := int(stringLen)
- if intStringLen < 0 {
+ if msglen < 0 {
return ErrInvalidLengthTypes
}
- postIndex := iNdEx + intStringLen
+ postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Display = string(dAtA[iNdEx:postIndex])
+ m.SAMLConnectorTraitMapping = append(m.SAMLConnectorTraitMapping, TraitMapping{})
+ if err := m.SAMLConnectorTraitMapping[len(m.SAMLConnectorTraitMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
iNdEx = postIndex
default:
iNdEx = preIndex
diff --git a/api/types/types.proto b/api/types/types.proto
index 23ee8cdba26ec..397f979844e28 100644
--- a/api/types/types.proto
+++ b/api/types/types.proto
@@ -1846,6 +1846,16 @@ message ClaimMapping {
repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ];
}
+// TraitMapping maps a trait to teleport roles.
+message TraitMapping {
+ // Trait is a trait name.
+ string Trait = 1 [ (gogoproto.jsontag) = "trait" ];
+ // Value is a trait value to match.
+ string Value = 2 [ (gogoproto.jsontag) = "value" ];
+ // Roles is a list of static teleport roles to match.
+ repeated string Roles = 3 [ (gogoproto.jsontag) = "roles,omitempty" ];
+}
+
// Rule represents allow or deny rule that is executed to check
// if user or service have access to resource
message Rule {
@@ -2645,6 +2655,92 @@ message GithubConnectorSpecV3 {
string Display = 5 [ (gogoproto.jsontag) = "display" ];
}
+// SSOWarnings conveys a user-facing main message along with auxiliary warnings.
+message SSOWarnings {
+ // Message is main user-facing message to be shown.
+ string Message = 1 [ (gogoproto.jsontag) = "message,omitempty" ];
+ // Warnings is a set of distinct warnings to be reported.
+ repeated string Warnings = 2 [ (gogoproto.jsontag) = "warnings,omitempty" ];
+}
+
+// CreateUserParams represents the user creation parameters as called during SSO login flow.
+message CreateUserParams {
+ // ConnectorName is the name of the connector used for SSO login flow.
+ string ConnectorName = 1 [ (gogoproto.jsontag) = "connector_name,omitempty" ];
+ // Username is the name of the user to be created.
+ string Username = 2 [ (gogoproto.jsontag) = "username,omitempty" ];
+ // Logins is a list of available unix logins.
+ repeated string Logins = 3 [ (gogoproto.jsontag) = "logins,omitempty" ];
+ // KubeGroups is a list of assigned kube groups.
+ repeated string KubeGroups = 4 [ (gogoproto.jsontag) = "kube_groups,omitempty" ];
+ // KubeUsers is a list of available kube users.
+ repeated string KubeUsers = 5 [ (gogoproto.jsontag) = "kube_users,omitempty" ];
+ // Roles is a list of assigned roles.
+ repeated string Roles = 6 [ (gogoproto.jsontag) = "roles,omitempty" ];
+
+ // Traits is the set of traits the user is assigned.
+ wrappers.LabelValues Traits = 7 [
+ (gogoproto.nullable) = false,
+ (gogoproto.jsontag) = "traits,omitempty",
+ (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits"
+ ];
+
+ // SessionTTL determines the TTL.
+ int64 SessionTTL = 8
+ [ (gogoproto.jsontag) = "session_ttl,omitempty", (gogoproto.casttype) = "Duration" ];
+}
+
+// SSODiagnosticInfo is a single SSO diagnostic info entry.
+message SSODiagnosticInfo {
+ // TestFlow indicates the SSO flow was a test one.
+ bool TestFlow = 1 [ (gogoproto.jsontag) = "test_flow" ];
+
+ // Error stores user-friendly error message.
+ string Error = 2 [ (gogoproto.jsontag) = "error" ];
+
+ // Success if present, marks the flow as finished with success.
+ bool Success = 3 [ (gogoproto.jsontag) = "success" ];
+
+ // CreateUserParams represents the user creation parameters as called during SSO login flow.
+ CreateUserParams CreateUserParams = 4 [ (gogoproto.jsontag) = "create_user_params,omitempty" ];
+
+ // SAMLAttributesToRoles represents mapping from attributes to roles, as used during SAML login
+ // flow.
+ repeated AttributeMapping SAMLAttributesToRoles = 5
+ [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes_to_roles,omitempty" ];
+
+ // SAMLAttributesToRolesWarnings contains warnings produced during the process of mapping the
+ // SAML attributes to roles.
+ SSOWarnings SAMLAttributesToRolesWarnings = 6
+ [ (gogoproto.jsontag) = "saml_attributes_to_roles_warnings,omitempty" ];
+
+ // SAMLAttributeStatements represents SAML attribute statements.
+ wrappers.LabelValues SAMLAttributeStatements = 7 [
+ (gogoproto.nullable) = false,
+ (gogoproto.jsontag) = "saml_attribute_statements,omitempty",
+ (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits"
+ ];
+
+ // SAMLAssertionInfo represents raw SAML assertion info as returned by IdP during SAML flow.
+ bytes SAMLAssertionInfo = 8 [
+ (gogoproto.jsontag) = "saml_assertion_info,omitempty",
+ (gogoproto.customtype) = "AssertionInfo"
+ ];
+
+ // SAMLTraitsFromAssertions represents traits translated from SAML assertions.
+ wrappers.LabelValues SAMLTraitsFromAssertions = 9 [
+ (gogoproto.nullable) = false,
+ (gogoproto.jsontag) = "saml_traits_from_assertions,omitempty",
+ (gogoproto.customtype) = "github.com/gravitational/teleport/api/types/wrappers.Traits"
+ ];
+
+ // SAMLConnectorTraitMapping represents connector-specific trait mapping.
+ repeated TraitMapping SAMLConnectorTraitMapping = 10 [
+ (gogoproto.nullable) = false,
+ (gogoproto.jsontag) = "saml_connector_trait_mapping,omitempty"
+ ];
+}
+
// TeamMapping represents a single team membership mapping.
message TeamMapping {
// Organization is a Github organization a user belongs to.
diff --git a/go.mod b/go.mod
index 399b16af5501a..861028b82be46 100644
--- a/go.mod
+++ b/go.mod
@@ -23,7 +23,6 @@ require (
github.com/aws/aws-sdk-go-v2/service/ec2 v1.16.0
github.com/aws/aws-sdk-go-v2/service/sts v1.7.0
github.com/beevik/etree v1.1.0
- github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7
github.com/coreos/go-oidc v0.0.0
github.com/coreos/go-semver v0.3.0
github.com/denisenkom/go-mssqldb v0.11.0
@@ -147,6 +146,7 @@ require (
github.com/boombuler/barcode v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
+ github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
github.com/creack/pty v1.1.11 // indirect
diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go
index 63188c83fe88d..eee929c7320a9 100644
--- a/lib/auth/apiserver.go
+++ b/lib/auth/apiserver.go
@@ -204,6 +204,7 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) {
srv.DELETE("/:version/saml/connectors/:id", srv.withAuth(srv.deleteSAMLConnector))
srv.POST("/:version/saml/requests/create", srv.withAuth(srv.createSAMLAuthRequest))
srv.POST("/:version/saml/requests/validate", srv.withAuth(srv.validateSAMLResponse))
+ srv.GET("/:version/saml/requests/get/:id", srv.withAuth(srv.getSAMLAuthRequest))
// Github connector
srv.POST("/:version/github/connectors", srv.withAuth(srv.createGithubConnector))
@@ -214,6 +215,9 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) {
srv.POST("/:version/github/requests/create", srv.withAuth(srv.createGithubAuthRequest))
srv.POST("/:version/github/requests/validate", srv.withAuth(srv.validateGithubAuthCallback))
+ // SSO diag info
+ srv.GET("/:version/sso/diag/:auth/:id", srv.withAuth(srv.getSSODiagnosticInfo))
+
// Provisioning tokens- Moved to grpc
// DELETE IN 8.0
srv.GET("/:version/tokens", srv.withAuth(srv.getTokens))
@@ -1399,6 +1403,23 @@ func (s *APIServer) createSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r
return response, nil
}
+func (s *APIServer) getSAMLAuthRequest(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
+ request, err := auth.GetSAMLAuthRequest(r.Context(), p.ByName("id"))
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ return request, nil
+}
+
+func (s *APIServer) getSSODiagnosticInfo(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) {
+ info, err := auth.GetSSODiagnosticInfo(r.Context(), p.ByName("auth"), p.ByName("id"))
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return info, nil
+}
+
type validateSAMLResponseReq struct {
Response string `json:"response"`
}
@@ -1428,7 +1449,7 @@ func (s *APIServer) validateSAMLResponse(auth ClientI, w http.ResponseWriter, r
if err := httplib.ReadJSON(r, &req); err != nil {
return nil, trace.Wrap(err)
}
- response, err := auth.ValidateSAMLResponse(req.Response)
+ response, err := auth.ValidateSAMLResponse(r.Context(), req.Response)
if err != nil {
return nil, trace.Wrap(err)
}
diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go
index 1d355b7e99b81..81bc0a389e0ed 100644
--- a/lib/auth/auth_test.go
+++ b/lib/auth/auth_test.go
@@ -990,7 +990,14 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) {
AssertionConsumerService: "a",
Issuer: "b",
SSO: "c",
- Cert: string(certBytes),
+ AttributesToRoles: []types.AttributeMapping{
+ {
+ Name: "dummy",
+ Value: "dummy",
+ Roles: []string{"dummy"},
+ },
+ },
+ Cert: string(certBytes),
})
require.NoError(t, err)
@@ -1014,7 +1021,7 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) {
func TestEmitSSOLoginFailureEvent(t *testing.T) {
mockE := &eventstest.MockEmitter{}
- emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"))
+ emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), false)
require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{
Metadata: apievents.Metadata{
@@ -1028,6 +1035,21 @@ func TestEmitSSOLoginFailureEvent(t *testing.T) {
UserMessage: "some error",
},
})
+
+ emitSSOLoginFailureEvent(context.Background(), mockE, "test", trace.BadParameter("some error"), true)
+
+ require.Equal(t, mockE.LastEvent(), &apievents.UserLogin{
+ Metadata: apievents.Metadata{
+ Type: events.UserLoginEvent,
+ Code: events.UserSSOTestFlowLoginFailureCode,
+ },
+ Method: "test",
+ Status: apievents.Status{
+ Success: false,
+ Error: "some error",
+ UserMessage: "some error",
+ },
+ })
}
func TestGenerateUserCertWithCertExtension(t *testing.T) {
diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go
index 2fcad7380338e..fe53cb3e3d17b 100644
--- a/lib/auth/auth_with_roles.go
+++ b/lib/auth/auth_with_roles.go
@@ -2248,7 +2248,8 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(req services.OIDCAuthRequest) (*
oidcReq, err := a.authServer.CreateOIDCAuthRequest(req)
if err != nil {
- emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err)
+ // TODO(Tener): Update `testFlow` flag once OIDC SSO starts supporting test flows.
+ emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodOIDC, err, false)
return nil, trace.Wrap(err)
}
@@ -2323,18 +2324,57 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*
return nil, trace.Wrap(err)
}
+ // require additional permissions for executing SSO test flow.
+ if req.SSOTestFlow {
+ if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil {
+ return nil, trace.Wrap(err)
+ }
+ }
+
samlReq, err := a.authServer.CreateSAMLAuthRequest(req)
if err != nil {
- emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err)
+ emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodSAML, err, req.SSOTestFlow)
return nil, trace.Wrap(err)
}
return samlReq, nil
}
-func (a *ServerWithRoles) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) {
+// ValidateSAMLResponse validates SAML auth response.
+func (a *ServerWithRoles) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) {
// auth callback is it's own authz, no need to check extra permissions
- return a.authServer.ValidateSAMLResponse(re)
+ return a.authServer.ValidateSAMLResponse(ctx, re)
+}
+
+// GetSAMLAuthRequest returns SAML auth request if found.
+func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) {
+ if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return a.authServer.GetSAMLAuthRequest(ctx, id)
+}
+
+// GetSSODiagnosticInfo returns SSO diagnostic info records.
+func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) {
+ var resource string
+
+ switch authKind {
+ case types.KindSAML:
+ resource = types.KindSAMLRequest
+ case types.KindGithub:
+ resource = types.KindGithubRequest
+ case types.KindOIDC:
+ resource = types.KindOIDCRequest
+ default:
+ return nil, trace.BadParameter("unsupported authKind %q", authKind)
+ }
+
+ if err := a.action(apidefaults.Namespace, resource, types.VerbRead); err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return a.authServer.GetSSODiagnosticInfo(ctx, authKind, authRequestID)
}
// DeleteSAMLConnector deletes a SAML connector by name.
@@ -2430,7 +2470,8 @@ func (a *ServerWithRoles) CreateGithubAuthRequest(req services.GithubAuthRequest
githubReq, err := a.authServer.CreateGithubAuthRequest(req)
if err != nil {
- emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err)
+ // TODO(Tener): Update `testFlow` flag once GitHub SSO starts supporting test flows.
+ emitSSOLoginFailureEvent(a.authServer.closeCtx, a.authServer.emitter, events.LoginMethodGithub, err, false)
return nil, trace.Wrap(err)
}
@@ -4314,11 +4355,16 @@ func NewAdminAuthServer(authServer *Server, sessions session.Service, alog event
}, nil
}
-func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error) {
+func emitSSOLoginFailureEvent(ctx context.Context, emitter apievents.Emitter, method string, err error, testFlow bool) {
+ code := events.UserSSOLoginFailureCode
+ if testFlow {
+ code = events.UserSSOTestFlowLoginFailureCode
+ }
+
emitErr := emitter.EmitAuditEvent(ctx, &apievents.UserLogin{
Metadata: apievents.Metadata{
Type: events.UserLoginEvent,
- Code: events.UserSSOLoginFailureCode,
+ Code: code,
},
Method: method,
Status: apievents.Status{
diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go
index 0c341575908d7..c4d4a1da01460 100644
--- a/lib/auth/auth_with_roles_test.go
+++ b/lib/auth/auth_with_roles_test.go
@@ -33,6 +33,7 @@ import (
"github.com/gravitational/teleport/api/utils/sshutils"
"github.com/gravitational/teleport/lib/auth/native"
libdefaults "github.com/gravitational/teleport/lib/defaults"
+ "github.com/gravitational/teleport/lib/fixtures"
"github.com/gravitational/teleport/lib/services"
"github.com/gravitational/teleport/lib/tlsca"
"github.com/gravitational/teleport/lib/utils"
@@ -285,6 +286,247 @@ func TestSSOUserCanReissueCert(t *testing.T) {
require.NoError(t, err)
}
+func TestSAMLAuthRequest(t *testing.T) {
+ ctx := context.Background()
+ srv := newTestTLSServer(t)
+
+ emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{})
+ require.NoError(t, err)
+
+ access1Role, err := CreateRole(ctx, srv.Auth(), "test-access-1", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Rules: []types.Rule{
+ {
+ Resources: []string{types.KindSAMLRequest},
+ Verbs: []string{types.VerbCreate},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ access2Role, err := CreateRole(ctx, srv.Auth(), "test-access-2", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Rules: []types.Rule{
+ {
+ Resources: []string{types.KindSAML},
+ Verbs: []string{types.VerbCreate},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ access3Role, err := CreateRole(ctx, srv.Auth(), "test-access-3", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Rules: []types.Rule{
+ {
+ Resources: []string{types.KindSAML, types.KindSAMLRequest},
+ Verbs: []string{types.VerbCreate},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ readerRole, err := CreateRole(ctx, srv.Auth(), "test-access-4", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Rules: []types.Rule{
+ {
+ Resources: []string{types.KindSAMLRequest},
+ Verbs: []string{types.VerbRead},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{
+ Issuer: "test",
+ SSO: "test",
+ Cert: fixtures.TLSCACertPEM,
+ AssertionConsumerService: "test",
+ AttributesToRoles: []types.AttributeMapping{{
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ }},
+ })
+ require.NoError(t, err)
+
+ err = srv.Auth().CreateSAMLConnector(conn)
+ require.NoError(t, err)
+
+ reqNormal := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML}
+ reqTest := services.SAMLAuthRequest{ConnectorID: conn.GetName(), Type: constants.SAML, SSOTestFlow: true, ConnectorSpec: &types.SAMLConnectorSpecV2{
+ Issuer: "test",
+ Audience: "test",
+ ServiceProviderIssuer: "test",
+ SSO: "test",
+ Cert: fixtures.TLSCACertPEM,
+ AssertionConsumerService: "test",
+ AttributesToRoles: []types.AttributeMapping{{
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ }},
+ }}
+
+ tests := []struct {
+ desc string
+ roles []string
+ request services.SAMLAuthRequest
+ expectAccessDenied bool
+ }{
+ {
+ desc: "empty role - no access",
+ roles: []string{emptyRole.GetName()},
+ request: reqNormal,
+ expectAccessDenied: true,
+ },
+ {
+ desc: "can create regular request with normal access",
+ roles: []string{access1Role.GetName()},
+ request: reqNormal,
+ expectAccessDenied: false,
+ },
+ {
+ desc: "cannot create sso test request with normal access",
+ roles: []string{access1Role.GetName()},
+ request: reqTest,
+ expectAccessDenied: true,
+ },
+ {
+ desc: "cannot create normal request with connector access",
+ roles: []string{access2Role.GetName()},
+ request: reqNormal,
+ expectAccessDenied: true,
+ },
+ {
+ desc: "cannot create sso test request with connector access",
+ roles: []string{access2Role.GetName()},
+ request: reqTest,
+ expectAccessDenied: true,
+ },
+ {
+ desc: "can create regular request with combined access",
+ roles: []string{access3Role.GetName()},
+ request: reqNormal,
+ expectAccessDenied: false,
+ },
+ {
+ desc: "can create sso test request with combined access",
+ roles: []string{access3Role.GetName()},
+ request: reqTest,
+ expectAccessDenied: false,
+ },
+ }
+
+ user, err := CreateUser(srv.Auth(), "dummy")
+ require.NoError(t, err)
+
+ userReader, err := CreateUser(srv.Auth(), "dummy-reader", readerRole)
+ require.NoError(t, err)
+
+ clientReader, err := srv.NewClient(TestUser(userReader.GetName()))
+ require.NoError(t, err)
+
+ for _, tt := range tests {
+ t.Run(tt.desc, func(t *testing.T) {
+ user.SetRoles(tt.roles)
+ err = srv.Auth().UpsertUser(user)
+ require.NoError(t, err)
+
+ client, err := srv.NewClient(TestUser(user.GetName()))
+ require.NoError(t, err)
+
+ request, err := client.CreateSAMLAuthRequest(tt.request)
+ if tt.expectAccessDenied {
+ require.Error(t, err)
+ require.True(t, trace.IsAccessDenied(err), "expected access denied, got: %v", err)
+ } else {
+ if err != nil {
+ if reporter, ok := err.(trace.DebugReporter); ok {
+ fmt.Println(reporter.DebugReport())
+ }
+ }
+ require.NoError(t, err)
+ require.NotEmpty(t, request.ID)
+ require.Equal(t, tt.request.ConnectorID, request.ConnectorID)
+
+ requestCopy, err := clientReader.GetSAMLAuthRequest(ctx, request.ID)
+ require.NoError(t, err)
+ require.Equal(t, request, requestCopy)
+ }
+ })
+ }
+}
+
+func TestSSODiagnosticInfo(t *testing.T) {
+ ctx := context.Background()
+ srv := newTestTLSServer(t)
+
+ // empty role
+ emptyRole, err := CreateRole(ctx, srv.Auth(), "test-empty", types.RoleSpecV5{})
+ require.NoError(t, err)
+
+ // privileged role
+ privRole, err := CreateRole(ctx, srv.Auth(), "priv-access", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Rules: []types.Rule{
+ {
+ Resources: []string{types.KindSAMLRequest},
+ Verbs: []string{types.VerbRead},
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ user, err := CreateUser(srv.Auth(), "dummy", emptyRole)
+ require.NoError(t, err)
+
+ userPriv, err := CreateUser(srv.Auth(), "superDummy", privRole)
+ require.NoError(t, err)
+
+ client, err := srv.NewClient(TestUser(user.GetName()))
+ require.NoError(t, err)
+
+ clientPriv, err := srv.NewClient(TestUser(userPriv.GetName()))
+ require.NoError(t, err)
+
+ // fresh server, no SSO diag info, request fails
+ info, err := client.GetSSODiagnosticInfo(ctx, types.KindSAML, "XXX-INVALID-ID")
+ require.Error(t, err)
+ require.Nil(t, info)
+
+ infoCreate := types.SSODiagnosticInfo{
+ TestFlow: true,
+ Error: "aaa bbb ccc",
+ }
+
+ // invalid auth kind returns error, no information stored.
+ err = srv.Auth().CreateSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "ABC123", infoCreate)
+ require.Error(t, err)
+ info, err = client.GetSSODiagnosticInfo(ctx, "XXX-BAD-KIND", "XXX-INVALID-ID")
+ require.Error(t, err)
+ require.Nil(t, info)
+
+ // proper record can be stored, retrieved, if user has access.
+ err = srv.Auth().CreateSSODiagnosticInfo(ctx, types.KindSAML, "ABC123", infoCreate)
+ require.NoError(t, err)
+
+ info, err = client.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123")
+ require.Error(t, err)
+ require.True(t, trace.IsAccessDenied(err))
+ require.Nil(t, info)
+
+ info, err = clientPriv.GetSSODiagnosticInfo(ctx, types.KindSAML, "ABC123")
+ require.NoError(t, err)
+ require.Equal(t, &infoCreate, info)
+
+}
+
func TestGenerateUserCertsWithRoleRequest(t *testing.T) {
ctx := context.Background()
srv := newTestTLSServer(t)
diff --git a/lib/auth/clt.go b/lib/auth/clt.go
index 128616512f614..f5cbf595721a7 100644
--- a/lib/auth/clt.go
+++ b/lib/auth/clt.go
@@ -1144,9 +1144,35 @@ func (c *Client) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.
return response, nil
}
+// GetSAMLAuthRequest gets SAML AuthnRequest
+func (c *Client) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) {
+ out, err := c.Get(ctx, c.Endpoint("saml", "requests", "get", id), url.Values{})
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ var response *services.SAMLAuthRequest
+ if err := json.Unmarshal(out.Bytes(), &response); err != nil {
+ return nil, trace.Wrap(err)
+ }
+ return response, nil
+}
+
+// GetSSODiagnosticInfo returns SSO diagnostic info records.
+func (c *Client) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) {
+ out, err := c.Get(ctx, c.Endpoint("sso", "diag", authKind, authRequestID), url.Values{})
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ var response types.SSODiagnosticInfo
+ if err := json.Unmarshal(out.Bytes(), &response); err != nil {
+ return nil, trace.Wrap(err)
+ }
+ return &response, nil
+}
+
// ValidateSAMLResponse validates response returned by SAML identity provider
-func (c *Client) ValidateSAMLResponse(re string) (*SAMLAuthResponse, error) {
- out, err := c.PostJSON(context.TODO(), c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{
+func (c *Client) ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error) {
+ out, err := c.PostJSON(ctx, c.Endpoint("saml", "requests", "validate"), validateSAMLResponseReq{
Response: re,
})
if err != nil {
@@ -1664,7 +1690,7 @@ type IdentityService interface {
// GetSAMLConnector returns SAML connector information by id
GetSAMLConnector(ctx context.Context, id string, withSecrets bool) (types.SAMLConnector, error)
- // GetSAMLConnector gets SAML connectors list
+ // GetSAMLConnectors gets SAML connectors list
GetSAMLConnectors(ctx context.Context, withSecrets bool) ([]types.SAMLConnector, error)
// DeleteSAMLConnector deletes SAML connector by ID
@@ -1674,7 +1700,13 @@ type IdentityService interface {
CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error)
// ValidateSAMLResponse validates SAML auth response
- ValidateSAMLResponse(re string) (*SAMLAuthResponse, error)
+ ValidateSAMLResponse(ctx context.Context, re string) (*SAMLAuthResponse, error)
+
+ // GetSAMLAuthRequest returns SAML auth request if found
+ GetSAMLAuthRequest(ctx context.Context, authRequestID string) (*services.SAMLAuthRequest, error)
+
+ // GetSSODiagnosticInfo returns SSO diagnostic info records.
+ GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error)
// CreateGithubConnector creates a new Github connector
CreateGithubConnector(connector types.GithubConnector) error
diff --git a/lib/auth/saml.go b/lib/auth/saml.go
index 8a97bee746508..aa0f13153deaf 100644
--- a/lib/auth/saml.go
+++ b/lib/auth/saml.go
@@ -24,8 +24,6 @@ import (
"fmt"
"io"
- "github.com/google/go-cmp/cmp"
-
"github.com/gravitational/teleport"
"github.com/gravitational/teleport/api/constants"
apidefaults "github.com/gravitational/teleport/api/defaults"
@@ -37,6 +35,7 @@ import (
"github.com/gravitational/teleport/lib/utils"
"github.com/beevik/etree"
+ "github.com/google/go-cmp/cmp"
"github.com/gravitational/trace"
saml2 "github.com/russellhaering/gosaml2"
)
@@ -85,11 +84,7 @@ func (a *Server) DeleteSAMLConnector(ctx context.Context, connectorName string)
func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.SAMLAuthRequest, error) {
ctx := context.TODO()
- connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true)
- if err != nil {
- return nil, trace.Wrap(err)
- }
- provider, err := a.getSAMLProvider(connector)
+ connector, provider, err := a.getConnectorAndProvider(ctx, req)
if err != nil {
return nil, trace.Wrap(err)
}
@@ -128,6 +123,50 @@ func (a *Server) CreateSAMLAuthRequest(req services.SAMLAuthRequest) (*services.
return &req, nil
}
+func (a *Server) getConnectorAndProvider(ctx context.Context, req services.SAMLAuthRequest) (types.SAMLConnector, *saml2.SAMLServiceProvider, error) {
+ if req.SSOTestFlow {
+ if req.ConnectorSpec == nil {
+ return nil, nil, trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true")
+ }
+
+ if req.ConnectorID == "" {
+ return nil, nil, trace.BadParameter("ConnectorID cannot be empty")
+ }
+
+ // stateless test flow
+ connector, err := types.NewSAMLConnector(req.ConnectorID, *req.ConnectorSpec)
+ if err != nil {
+ return nil, nil, trace.Wrap(err)
+ }
+
+ // validate, set defaults for connector
+ err = services.ValidateSAMLConnector(connector)
+ if err != nil {
+ return nil, nil, trace.Wrap(err)
+ }
+
+ // we don't want to cache the provider. construct it directly instead of using a.getSAMLProvider()
+ provider, err := services.GetSAMLServiceProvider(connector, a.clock)
+ if err != nil {
+ return nil, nil, trace.Wrap(err)
+ }
+
+ return connector, provider, nil
+ }
+
+ // regular execution flow
+ connector, err := a.Identity.GetSAMLConnector(ctx, req.ConnectorID, true)
+ if err != nil {
+ return nil, nil, trace.Wrap(err)
+ }
+ provider, err := a.getSAMLProvider(connector)
+ if err != nil {
+ return nil, nil, trace.Wrap(err)
+ }
+
+ return connector, provider, nil
+}
+
func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServiceProvider, error) {
a.lock.Lock()
defer a.lock.Unlock()
@@ -148,9 +187,7 @@ func (a *Server) getSAMLProvider(conn types.SAMLConnector) (*saml2.SAMLServicePr
return serviceProvider, nil
}
-func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) {
- var err error
-
+func (a *Server) calculateSAMLUser(diagCtx *ssoDiagContext, connector types.SAMLConnector, assertionInfo saml2.AssertionInfo, request *services.SAMLAuthRequest) (*createUserParams, error) {
p := createUserParams{
connectorName: connector.GetName(),
username: assertionInfo.NameID,
@@ -158,11 +195,22 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo
p.traits = services.SAMLAssertionsToTraits(assertionInfo)
+ diagCtx.info.SAMLTraitsFromAssertions = p.traits
+ diagCtx.info.SAMLConnectorTraitMapping = connector.GetTraitMappings()
+
var warnings []string
warnings, p.roles = services.TraitsToRoles(connector.GetTraitMappings(), p.traits)
if len(p.roles) == 0 {
if len(warnings) != 0 {
log.WithField("connector", connector).Warnf("Unable to map attibutes to roles: %q", warnings)
+ diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{
+ Message: "No roles mapped for the user",
+ Warnings: warnings,
+ }
+ } else {
+ diagCtx.info.SAMLAttributesToRolesWarnings = &types.SSOWarnings{
+ Message: "No roles mapped for the user. The mappings may contain typos.",
+ }
}
return nil, trace.AccessDenied("unable to map attributes to role for connector: %v", connector.GetName())
}
@@ -178,7 +226,7 @@ func (a *Server) calculateSAMLUser(connector types.SAMLConnector, assertionInfo
return &p, nil
}
-func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) {
+func (a *Server) createSAMLUser(p *createUserParams, dryRun bool) (types.User, error) {
expires := a.GetClock().Now().UTC().Add(p.sessionTTL)
log.Debugf("Generating dynamic SAML identity %v/%v with roles: %v.", p.connectorName, p.username, p.roles)
@@ -214,6 +262,10 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) {
},
}
+ if dryRun {
+ return user, nil
+ }
+
// Get the user to check if it already exists or not.
existingUser, err := a.Identity.GetUser(p.username, false)
if err != nil && !trace.IsNotFound(err) {
@@ -247,7 +299,7 @@ func (a *Server) createSAMLUser(p *createUserParams) (types.User, error) {
return user, nil
}
-func parseSAMLInResponseTo(response string) (string, error) {
+func ParseSAMLInResponseTo(response string) (string, error) {
raw, _ := base64.StdEncoding.DecodeString(response)
doc := etree.NewDocument()
@@ -308,16 +360,26 @@ type SAMLAuthResponse struct {
}
// ValidateSAMLResponse consumes attribute statements from SAML identity provider
-func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, error) {
+func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse string) (*SAMLAuthResponse, error) {
event := &apievents.UserLogin{
Metadata: apievents.Metadata{
Type: events.UserLoginEvent,
},
Method: events.LoginMethodSAML,
}
- re, err := a.validateSAMLResponse(samlResponse)
- if re != nil && re.attributeStatements != nil {
- attributes, err := apievents.EncodeMapStrings(re.attributeStatements)
+
+ diagCtx := a.newSSODiagContext(types.KindSAML)
+
+ auth, err := a.validateSAMLResponse(ctx, diagCtx, samlResponse)
+ if err != nil {
+ diagCtx.info.Error = trace.UserMessage(err)
+ }
+
+ diagCtx.writeToBackend(ctx)
+
+ attributeStatements := diagCtx.info.SAMLAttributeStatements
+ if attributeStatements != nil {
+ attributes, err := apievents.EncodeMapStrings(attributeStatements)
if err != nil {
event.Status.UserMessage = fmt.Sprintf("Failed to encode identity attributes: %v", err.Error())
log.WithError(err).Debug("Failed to encode identity attributes.")
@@ -328,6 +390,9 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e
if err != nil {
event.Code = events.UserSSOLoginFailureCode
+ if diagCtx.info.TestFlow {
+ event.Code = events.UserSSOTestFlowLoginFailureCode
+ }
event.Status.Success = false
event.Status.Error = trace.Unwrap(err).Error()
event.Status.UserMessage = err.Error()
@@ -336,87 +401,107 @@ func (a *Server) ValidateSAMLResponse(samlResponse string) (*SAMLAuthResponse, e
}
return nil, trace.Wrap(err)
}
+
event.Status.Success = true
- event.User = re.auth.Username
+ event.User = auth.Username
event.Code = events.UserSSOLoginCode
+ if diagCtx.info.TestFlow {
+ event.Code = events.UserSSOTestFlowLoginCode
+ }
if err := a.emitter.EmitAuditEvent(a.closeCtx, event); err != nil {
log.WithError(err).Warn("Failed to emit SAML login event.")
}
- return &re.auth, nil
-}
-
-type samlAuthResponse struct {
- auth SAMLAuthResponse
- attributeStatements map[string][]string
-}
-
-func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, error) {
- ctx := context.TODO()
- requestID, err := parseSAMLInResponseTo(samlResponse)
if err != nil {
return nil, trace.Wrap(err)
}
- request, err := a.Identity.GetSAMLAuthRequest(requestID)
+ return auth, nil
+}
+
+func (a *Server) validateSAMLResponse(ctx context.Context, diagCtx *ssoDiagContext, samlResponse string) (*SAMLAuthResponse, error) {
+ requestID, err := ParseSAMLInResponseTo(samlResponse)
if err != nil {
return nil, trace.Wrap(err)
}
- connector, err := a.Identity.GetSAMLConnector(ctx, request.ConnectorID, true)
+ diagCtx.requestID = requestID
+
+ request, err := a.Identity.GetSAMLAuthRequest(ctx, requestID)
if err != nil {
- return nil, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to get SAML Auth Request")
}
- provider, err := a.getSAMLProvider(connector)
+ diagCtx.info.TestFlow = request.SSOTestFlow
+
+ connector, provider, err := a.getConnectorAndProvider(ctx, *request)
if err != nil {
- return nil, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to get SAML connector and provider")
}
+
assertionInfo, err := provider.RetrieveAssertionInfo(samlResponse)
if err != nil {
- return nil, trace.AccessDenied(
- "received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err)
+ return nil, trace.AccessDenied("received response with incorrect or missing attribute statements, please check the identity provider configuration to make sure that mappings for claims/attribute statements are set up correctly. , failed to retrieve SAML assertion info from response: %v.", err).AddUserMessage("Failed to retrieve assertion info. This may indicate IdP configuration error.")
+ }
+
+ if assertionInfo != nil {
+ diagCtx.info.SAMLAssertionInfo = (*types.AssertionInfo)(assertionInfo)
}
if assertionInfo.WarningInfo.InvalidTime {
- return nil, trace.AccessDenied("invalid time in SAML assertion info")
+ return nil, trace.AccessDenied("invalid time in SAML assertion info").AddUserMessage("SAML assertion info contained warning: invalid time.")
}
if assertionInfo.WarningInfo.NotInAudience {
- return nil, trace.AccessDenied("no audience in SAML assertion info")
+ return nil, trace.AccessDenied("no audience in SAML assertion info").AddUserMessage("SAML: not in expected audience. Check auth connector audience field and IdP configuration for typos and other errors.")
}
log.Debugf("Obtained SAML assertions for %q.", assertionInfo.NameID)
- re := &samlAuthResponse{
- attributeStatements: make(map[string][]string),
- }
+ log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo)
+
+ attributeStatements := map[string][]string{}
+
for key, val := range assertionInfo.Values {
var vals []string
for _, vv := range val.Values {
vals = append(vals, vv.Value)
}
log.Debugf("SAML assertion: %q: %q.", key, vals)
- re.attributeStatements[key] = vals
+ attributeStatements[key] = vals
}
- log.Debugf("SAML assertion warnings: %+v.", assertionInfo.WarningInfo)
+ diagCtx.info.SAMLAttributeStatements = attributeStatements
+ diagCtx.info.SAMLAttributesToRoles = connector.GetAttributesToRoles()
if len(connector.GetAttributesToRoles()) == 0 {
- return re, trace.BadParameter("no attributes to roles mapping, check connector documentation")
+ return nil, trace.BadParameter("no attributes to roles mapping, check connector documentation").AddUserMessage("Attributes-to-roles mapping is empty, SSO user will never have any roles.")
}
+
log.Debugf("Applying %v SAML attribute to roles mappings.", len(connector.GetAttributesToRoles()))
// Calculate (figure out name, roles, traits, session TTL) of user and
// create the user in the backend.
- params, err := a.calculateSAMLUser(connector, *assertionInfo, request)
+ params, err := a.calculateSAMLUser(diagCtx, connector, *assertionInfo, request)
if err != nil {
- return re, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to calculate user attributes.")
}
- user, err := a.createSAMLUser(params)
+
+ diagCtx.info.CreateUserParams = &types.CreateUserParams{
+ ConnectorName: params.connectorName,
+ Username: params.username,
+ Logins: params.logins,
+ KubeGroups: params.kubeGroups,
+ KubeUsers: params.kubeUsers,
+ Roles: params.roles,
+ Traits: params.traits,
+ SessionTTL: types.Duration(params.sessionTTL),
+ }
+
+ user, err := a.createSAMLUser(params, request.SSOTestFlow)
if err != nil {
- return re, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to create user from provided parameters.")
}
// Auth was successful, return session, certificate, etc. to caller.
- re.auth = SAMLAuthResponse{
+ auth := &SAMLAuthResponse{
Req: *request,
Identity: types.ExternalIdentity{
ConnectorID: params.connectorName,
@@ -425,6 +510,12 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e
Username: user.GetName(),
}
+ // In test flow skip signing and creating web sessions.
+ if request.SSOTestFlow {
+ diagCtx.info.Success = true
+ return auth, nil
+ }
+
// If the request is coming from a browser, create a web session.
if request.CreateWebSession {
session, err := a.createWebSession(ctx, types.NewWebSessionRequest{
@@ -434,25 +525,26 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e
SessionTTL: params.sessionTTL,
LoginTime: a.clock.Now().UTC(),
})
+
if err != nil {
- return re, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to create web session.")
}
- re.auth.Session = session
+ auth.Session = session
}
// If a public key was provided, sign it and return a certificate.
if len(request.PublicKey) != 0 {
sshCert, tlsCert, err := a.createSessionCert(user, params.sessionTTL, request.PublicKey, request.Compatibility, request.RouteToCluster, request.KubernetesCluster)
if err != nil {
- return nil, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to create session certificate.")
}
clusterName, err := a.GetClusterName()
if err != nil {
- return nil, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to obtain cluster name.")
}
- re.auth.Cert = sshCert
- re.auth.TLSCert = tlsCert
+ auth.Cert = sshCert
+ auth.TLSCert = tlsCert
// Return the host CA for this cluster only.
authority, err := a.GetCertAuthority(ctx, types.CertAuthID{
@@ -460,10 +552,11 @@ func (a *Server) validateSAMLResponse(samlResponse string) (*samlAuthResponse, e
DomainName: clusterName.GetClusterName(),
}, false)
if err != nil {
- return nil, trace.Wrap(err)
+ return nil, trace.Wrap(err, "Failed to obtain cluster's host CA.")
}
- re.auth.HostSigners = append(re.auth.HostSigners, authority)
+ auth.HostSigners = append(auth.HostSigners, authority)
}
- return re, nil
+ diagCtx.info.Success = true
+ return auth, nil
}
diff --git a/lib/auth/saml_test.go b/lib/auth/saml_test.go
index 0700b6b3bb63f..60bd679e958ce 100644
--- a/lib/auth/saml_test.go
+++ b/lib/auth/saml_test.go
@@ -18,17 +18,28 @@ package auth
import (
"context"
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/x509/pkix"
+ "encoding/base64"
+ "encoding/xml"
"net/url"
"testing"
"time"
+ apidefaults "github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/api/types"
authority "github.com/gravitational/teleport/lib/auth/testauthority"
"github.com/gravitational/teleport/lib/backend/lite"
+ "github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/fixtures"
"github.com/gravitational/teleport/lib/services"
+ "github.com/gravitational/teleport/lib/tlsca"
+ "github.com/gravitational/teleport/lib/utils"
"github.com/jonboulle/clockwork"
+ saml2 "github.com/russellhaering/gosaml2"
+ samltypes "github.com/russellhaering/gosaml2/types"
"github.com/stretchr/testify/require"
)
@@ -56,6 +67,21 @@ func TestCreateSAMLUser(t *testing.T) {
a, err := NewServer(authConfig)
require.NoError(t, err)
+ // Dry-run creation of SAML user.
+ user, err := a.createSAMLUser(&createUserParams{
+ connectorName: "samlService",
+ username: "foo@example.com",
+ logins: []string{"foo"},
+ roles: []string{"admin"},
+ sessionTTL: 1 * time.Minute,
+ }, true)
+ require.NoError(t, err)
+ require.Equal(t, "foo@example.com", user.GetName())
+
+ // Dry-run must not create a user.
+ _, err = a.GetUser("foo@example.com", false)
+ require.Error(t, err)
+
// Create SAML user with 1 minute expiry.
_, err = a.createSAMLUser(&createUserParams{
connectorName: "samlService",
@@ -63,7 +89,7 @@ func TestCreateSAMLUser(t *testing.T) {
logins: []string{"foo"},
roles: []string{"admin"},
sessionTTL: 1 * time.Minute,
- })
+ }, false)
require.NoError(t, err)
// Within that 1 minute period the user should still exist.
@@ -221,3 +247,377 @@ func TestPingSAMLWorkaround(t *testing.T) {
require.NotEmpty(t, parsed.Query().Get("SigAlg"), "SigAlg is required for provider: ping")
require.NotEmpty(t, parsed.Query().Get("Signature"), "Signature is required for provider: ping")
}
+
+func TestServer_getConnectorAndProvider(t *testing.T) {
+ // Create a Server instance for testing.
+ c := clockwork.NewFakeClockAt(time.Now())
+ b, err := lite.NewWithConfig(context.Background(), lite.Config{
+ Path: t.TempDir(),
+ PollStreamPeriod: 200 * time.Millisecond,
+ Clock: c,
+ })
+ require.NoError(t, err)
+
+ clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{
+ ClusterName: "me.localhost",
+ })
+ require.NoError(t, err)
+
+ authConfig := &InitConfig{
+ ClusterName: clusterName,
+ Backend: b,
+ Authority: authority.New(),
+ SkipPeriodicOperations: true,
+ }
+
+ a, err := NewServer(authConfig)
+ require.NoError(t, err)
+
+ caKey, err := rsa.GenerateKey(rand.Reader, 2048)
+ require.NoError(t, err)
+
+ tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner(
+ caKey,
+ pkix.Name{
+ CommonName: "server1",
+ Organization: []string{"server1"},
+ }, nil, defaults.CATTL)
+ require.NoError(t, err)
+ require.NotNil(t, tlsCert)
+
+ keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{
+ Organization: []string{"Teleport OSS"},
+ CommonName: "teleport.localhost.localdomain",
+ }, nil, 10*365*24*time.Hour)
+ require.NoError(t, err)
+
+ request := services.SAMLAuthRequest{
+ ID: "ABC",
+ ConnectorID: "zzz",
+ CheckUser: false,
+ PublicKey: nil,
+ CertTTL: 0,
+ CreateWebSession: false,
+ SSOTestFlow: true,
+ ConnectorSpec: &types.SAMLConnectorSpecV2{
+ Issuer: "test",
+ Audience: "test",
+ ServiceProviderIssuer: "test",
+ SSO: "test",
+ Cert: string(tlsCert),
+ AssertionConsumerService: "test",
+ AttributesToRoles: []types.AttributeMapping{{
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ }},
+ SigningKeyPair: &types.AsymmetricKeyPair{
+ PrivateKey: string(keyPEM),
+ Cert: string(certPEM),
+ },
+ },
+ }
+
+ connector, provider, err := a.getConnectorAndProvider(context.Background(), request)
+ require.NoError(t, err)
+ require.NotNil(t, connector)
+ require.NotNil(t, provider)
+
+ expectedConnector := &types.SAMLConnectorV2{Kind: "saml", Version: "v2", Metadata: types.Metadata{Name: "zzz", Namespace: apidefaults.Namespace}, Spec: *request.ConnectorSpec}
+ require.Equal(t, expectedConnector, connector)
+
+ require.Equal(t, "test", provider.IdentityProviderSSOURL)
+ require.Equal(t, "test", provider.IdentityProviderIssuer)
+ require.Equal(t, "test", provider.AssertionConsumerServiceURL)
+ require.Equal(t, "test", provider.ServiceProviderIssuer)
+
+ conn, err := types.NewSAMLConnector("foo", types.SAMLConnectorSpecV2{
+ Issuer: "test",
+ SSO: "test",
+ Cert: string(tlsCert),
+ AssertionConsumerService: "test",
+ AttributesToRoles: []types.AttributeMapping{{
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ }},
+ })
+ require.NoError(t, err)
+
+ err = a.CreateSAMLConnector(conn)
+ require.NoError(t, err)
+
+ request2 := services.SAMLAuthRequest{
+ ID: "ABC",
+ ConnectorID: "foo",
+ SSOTestFlow: false,
+ }
+
+ connector, provider, err = a.getConnectorAndProvider(context.Background(), request2)
+ require.NoError(t, err)
+ require.NotNil(t, connector)
+ require.NotNil(t, provider)
+
+}
+
+func TestServer_ValidateSAMLResponse(t *testing.T) {
+ // Create a Server instance for testing.
+ c := clockwork.NewFakeClockAt(time.Date(2022, 04, 25, 9, 0, 0, 0, time.UTC))
+ b, err := lite.NewWithConfig(context.Background(), lite.Config{
+ Path: t.TempDir(),
+ PollStreamPeriod: 200 * time.Millisecond,
+ Clock: c,
+ })
+ require.NoError(t, err)
+
+ clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{
+ ClusterName: "me.localhost",
+ })
+ require.NoError(t, err)
+
+ authConfig := &InitConfig{
+ ClusterName: clusterName,
+ Backend: b,
+ Authority: authority.New(),
+ SkipPeriodicOperations: true,
+ }
+
+ a, err := NewServer(authConfig)
+ require.NoError(t, err)
+
+ a.SetClock(c)
+
+ // empty response gives error.
+ response, err := a.ValidateSAMLResponse(context.Background(), "")
+ require.Nil(t, response)
+ require.Error(t, err)
+
+ // create role referenced in request.
+ role, err := types.NewRole("access", types.RoleSpecV5{
+ Allow: types.RoleConditions{
+ Logins: []string{"dummy"},
+ },
+ })
+ require.NoError(t, err)
+ err = a.CreateRole(role)
+ require.NoError(t, err)
+
+ // real response from Okta
+ respOkta := `http://www.okta.com/exk14fxcpjuKMcor30h8uBRfvYvl5C/LPCh36uAmRLHW76+aDP3ngChtIwP3/Fc=M1VfkOOBH6r7niHhfGvf4OJ1HH5QJl83aD/b+mTDUUnXzHXgXlkb0BGQkSFn6ixojwCoXchpxCNzVLPN/tvfyY1dxP4MO8b+/07bGuVD2yTNlhN43/FFcDpmZ1ZDW8w2nPF1E5gy1lR8Wx2NgT3kQ2Ui1vRNX/KeX/P9NnABj4AjcshyHK2e49WLM/D4U84XOl7ODtzS7PTvtB0SGIwRE25G//8AsAv81eBfHL54Nz1HAqinMhxQtz32ZDXpKaAV6GypyBTvk6vo7Pkk4OiL6G9VIGC8Bd/gnavsc+Ickfuo7KTq8NDKTLB5WG34XKJqq6dGopSMrxr67oYjCEDZfw==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG
+A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
+MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW
+DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE
+BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV
+BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ
+KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq
+2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ
+EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP
+Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ
+T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL
+f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE
+RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU
+RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC
+XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL
+V115UGOwvjOOxmOFbYBn865SHgMndFtrhttp://www.okta.com/exk14fxcpjuKMcor30h8XwJSotSzU2qLdzu/WDk8dpQ/Cy1Id88932S/95+N+Ds=qyIvGi1+w93AdGUj0+T5RYAq+CAjLSScMTMc7dLTEze6qr3mP51W/bCoZz8E47lpsbLeh0EiATa6h2Uaj6/34rILfCt3aQRNjNicu0gBKhePyNraapdnoyeqJEV8UrAOOKFiH30e5AvQ1nRZqfgY7KMt6cZH5/eXjUS63lPJJn4yr9vLw9loCdHCoHlaseh2IHi7CickyyxSMTX+Y58zpBy2g/KwN3K4oZM4a10ZYWkZpzkZJXDRSUkEc/wTTO7IPPY7Zv7R7UC+zjf5Px1sYeKTkkIxlZViZmtqjYuhibnTmhroJx7wX/LtOPxCkwLHlQRDACBNbP/UtrudU1ZMxA==MIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG
+A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
+MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW
+DWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE
+BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV
+BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ
+KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+xQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq
+2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ
+EBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP
+Lp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ
+T8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL
+f3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE
+RcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU
+RAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC
+XXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL
+V115UGOwvjOOxmOFbYBn865SHgMndFtrops@gravitational.iohttps://boson.tener.io:3080/v1/webapi/saml/acsurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransportops@gravitational.ioEveryoneokta-adminokta-dev`
+
+ caKey, err := rsa.GenerateKey(rand.Reader, 2048)
+ require.NoError(t, err)
+
+ tlsCert, err := tlsca.GenerateSelfSignedCAWithSigner(
+ caKey,
+ pkix.Name{
+ CommonName: "server1",
+ Organization: []string{"server1"},
+ }, nil, defaults.CATTL)
+ require.NoError(t, err)
+ require.NotNil(t, tlsCert)
+
+ keyPEM, certPEM, err := utils.GenerateSelfSignedSigningCert(pkix.Name{
+ Organization: []string{"Teleport OSS"},
+ CommonName: "teleport.localhost.localdomain",
+ }, nil, 10*365*24*time.Hour)
+ require.NoError(t, err)
+
+ conn, err := types.NewSAMLConnector("saml-test-conn", types.SAMLConnectorSpecV2{
+ Issuer: "test",
+ SSO: "test",
+ Cert: string(tlsCert),
+ AssertionConsumerService: "test",
+ AttributesToRoles: []types.AttributeMapping{{
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ }},
+ SigningKeyPair: &types.AsymmetricKeyPair{
+ PrivateKey: string(keyPEM),
+ Cert: string(certPEM),
+ },
+ })
+ require.NoError(t, err)
+
+ err = a.CreateSAMLConnector(conn)
+ require.NoError(t, err)
+
+ err = a.Identity.CreateSAMLAuthRequest(services.SAMLAuthRequest{
+ ID: "_4f256462-6c2d-466d-afc0-6ee36602b6f2",
+ ConnectorID: "saml-test-conn",
+ SSOTestFlow: true,
+ RedirectURL: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml?SAMLRequest=lFZZk6JKE%2F0rHc6jYbOIiMbtiSgWEREEQVBfbrAUUMiiFFLgr%2F9i7Jm%2BPXf75j5mUifz5MmMJH%2FDQVlcl%2BDeZtUe3u4Qty99WVR4%2BfzwNro31bIOMMLLKighXrbR0gHGdsm%2B0strU7d1VBejT5B%2FRwQYw6ZFdTV60eS30e9cws54jmcnfMTGE47n40mQRPSEh3DK8zQb8gk7evFgg1FdvY3YV3r0Yn3PKqIqRlX67wnD90d4uXZda2LtHHf0An6QkOoK30vYOLDpUAQP%2B%2B3bKGvbK15SVFjjunptYQWbV1Qvp7RAUx1DERgGV0R9q5QKIjx60TC%2BQ63CbVC1byOWZtkJzU3YmUsLy9lsyQjn0YsMcYuqoH3W8CNBDLuJwEynM%2B61vrTBtYEdguQ1qksquF4%2Fff790jwG%2FGjrBOM6ht3vDAX7C8MlfXTN77oR1c2UzgQK4%2FrJa%2FT12dTlk1nz9b8V9Bv1GftbjJcOSqugvTfwe5Nj%2FF7DkqIIIa9k%2Blo3KcXSNE3RC6ovixij9MvoAwtjrUrqpykFVV2hKCjQ4ymGAdusjl9AkdYNarPyHwLzFMN%2BCzyJGK5imBH1M69fjMJQNPeD3qSsG%2FilwcEEZwE747%2BH3MMENrCK4Mthr72NvvzaeD6hbhNUOKmbEv9s%2Fl9aP6kGqw4W9RXGE%2Fyjuu%2FUfj3g36hF%2FZWgjFKI2%2F8oHayiLz8J9h7FC4o7%2FGogv2z54Iyj8bXj7FAoDc5Dwf3O0atwvsq3Ju%2FKBm0Bcnh7MvoMfjo%2B5H83%2FzQ8H%2F1%2BR2wJqAs5PUmLBA%2B5pPtrwRn4rhbER6QzrNHr9h1nztqm1S0kJT1Oo0NfxHRdnvx%2B27Lurbdl8FgdEZvM3FBqnV1DeHisSX7ezTHT24DMvdJBpb%2FlrVj0UmQk%2BVHhB1MyU65CSl2t1cHyBANokpgwPbrm86ne%2BBssK0UEVoAqlKFREkvel%2BWM7Qkv7MVOsUg0X%2FM3Yc1x2prVjXw4CUVxccn6UO53BsObdG4MpcBNGcYaWyp9NBQXcRTKtqSdVpyo7zM7PA6OQ53nJ0%2BMTGtqHpFmVLfxdnaKUpMa32Wt2N%2Bsy0NYr8aC7gxb5KPAnR%2Flta%2B0VaWa8I5XdyHSZ3XZiMM4Ho9tKaHA29uH9J%2B0%2Fia%2FDoePVhxn9EIO2uDDkL7t0wRFQQu%2FGpom6w9JAtkuBUQTQartwVbT871EMqWEfmR2ZGASUToQ2T5t9PqsZV1kAlvZijYgtqx4hmiogDkoUmYYnurh81HsospOXcZ0DSciG%2Fske7YtK%2F2MPvt9EamLIZZmOGTNLFSzLpra91Bd5Ce%2Fv4QskwU%2BR9ZZZBq5RkxZYww5ZYyHwvnffI%2Bnb%2Fjw5SIw9geikGcOXSH94Y8conVgjH7zAIWYmp4IDHdd7YtQ9Ug43dDbsu9O7AoH6uLxB599F%2Fqra5hLEnC0P9csijaQ01SxgCxJwK6lNFVEYAZRd7v7M%2BFkb1nIzriDojbZoOe3vb2z8xUppklq%2BWaQ9tNq84j53vOPQqEG7KbjFFo93MIT2GoBVXgNOCVuy9oqdDirWoiHq6pTV9NKdySK52MZjvO5hjMLye6miZrHoqR7nN96vqwyTKsb%2FZTz7W63urT12CWsdlmV05vNRw6rcpcdjw26i3w%2FgNhShGyfn%2BVNfM%2Bgf7xk1IWiu16cx7QVxoXZFJej1yyctR%2FHM51Hjqe4xgy4sraoSXSSbuJj8O%2F0GMw4xO38u5s6F3Z6m7GPqddGEb3SRKII6%2FMBGHGHUkd30Km51Xi%2FSFhm3%2FN%2BRBToqKs5ZeJzCQKj7u1wk%2FYL9mblYsBeBAkQBYDASA2RI3J6kr09bQF7TYnAlkEKgQHIt7mLFaKIFLElA4C%2Fm1H52SP56MXrtT1di%2FxxbqOHV9mUlKYPZacgQ2KkAveXIzxXIrPm3etKKRd5787nrSeqIt0vYjAopNyRE0iT8WrmbrSCL2%2FJoIVHfXxc9bcgquX1tWmt9lbe1ky7Z2l1EVlC2SdhOQ5v3LzZ%2BSbTpqDUir4P9vyZVV2Ffehk1g15fMYOiqX%2BEixOsS%2BAVImuldfCW583mHN2UYjijYbHC7PqW3DdWIa%2B2l3CS5dv%2BtkCXxIJm1VzEeSpBJGM3Dm1NuStwUXCVHFVmpMo52E6nVpcE54uXS2%2FDI8hBnqnIR2hBWZLRkfuDqu6d5GVZmyFRl1zA3%2Fci3Tr1WUs2f1DOm9lzCPSIVU9wGZOtPcF9Oel8uF8XzvU54X008L6%2Bv2gNYMSarJVFygaXkBR1ERqYNDCt1Hb3OHoZVU3ZdD%2B8%2B3IvDJPD4onyfPp8l7hK4xQgmD8%2FKf%2B9XD%2B%2Br8AAAD%2F%2Fw%3D%3D",
+ ClientRedirectURL: "http://127.0.0.1:57293/callback?secret_key=70e98f8871530e66e6a136ae71fe002454dc1c76d754f090f895508a2226c36b",
+ ConnectorSpec: &types.SAMLConnectorSpecV2{
+ Issuer: "http://www.okta.com/exk14fxcpjuKMcor30h8",
+ SSO: "https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml",
+ Cert: "",
+ Display: "Okta",
+ AssertionConsumerService: "https://boson.tener.io:3080/v1/webapi/saml/acs",
+ Audience: "https://boson.tener.io:3080/v1/webapi/saml/acs",
+ ServiceProviderIssuer: "https://boson.tener.io:3080/v1/webapi/saml/acs",
+ EntityDescriptor: "\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\u003cmd:EntityDescriptor entityID=\"http://www.okta.com/exk14fxcpjuKMcor30h8\" xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\"\u003e\u003cmd:IDPSSODescriptor WantAuthnRequestsSigned=\"false\" protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol\"\u003e\u003cmd:KeyDescriptor use=\"signing\"\u003e\u003cds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\u003e\u003cds:X509Data\u003e\u003cds:X509Certificate\u003eMIIDpDCCAoygAwIBAgIGAX4zyofpMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG\nA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU\nMBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi04MTMzNTQxHDAaBgkqhkiG9w0BCQEW\nDWluZm9Ab2t0YS5jb20wHhcNMjIwMTA3MDkwNTU4WhcNMzIwMTA3MDkwNjU4WjCBkjELMAkGA1UE\nBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV\nBAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtODEzMzU0MRwwGgYJ\nKoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nxQz+tLD5cNlOBfdohHvqNWIfC13OCSnUAe20qA0K8y+jtZrpwjtjjLX8iRuCx8dYc/nd6zYOhhSq\n2sLmrRa09wUXXTgnLGcj50gePTaroYLyF4FNgQWLvPHJk0FGcx6JvD6L+V5RzYwH87Fhg8niP4LZ\nEBw3iZnsIJN9KOuLuQeXTW0PIlMFzpCwT9aUCHCoLepe5Ou8oi8XcOCmsOESHPchV2RC/xQDIqRP\nLp1Sf7NNJ6mTmP2gOoLwsz95beOLrEI+PI/GgZBqM3OutWA0L9mAbJK9T5dPAvhnwCV+SK2HvicJ\nT8c6uJxuKmoWv1t3SyaN0cIbmw6vj9CIf4DTwQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWGgLL\nf3tgUZRGjmR5iiKeOeaEWG/eaF1nfenVfSaWT9ckimcXyLCY/P7CXEBiioVrxjky07iceJpi4rVE\nRcVZ8SGXCa0NroESmIFlIHez6vRTrqUsfDmidxsSCwY02eaBq+9gK5iXV5WeXMKbn0yeGwF+3PkU\nRAH1HuypwMH0FJRLIdW36pw7FCrGrXpk3UC6mEumXC9FptjSK1FlW+ZckgDprePOoUpypEygr2UC\nXXOsqT0dwBUUttdOQMZHqIiXS5VPJ8zhYPHBGYI8WGk5FWVuXIXhgRm7LN/EyXIvCOFmDH0tVnQL\nV115UGOwvjOOxmOFbYBn865SHgMndFtr\u003c/ds:X509Certificate\u003e\u003c/ds:X509Data\u003e\u003c/ds:KeyInfo\u003e\u003c/md:KeyDescriptor\u003e\u003cmd:NameIDFormat\u003eurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\u003c/md:NameIDFormat\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003cmd:SingleSignOnService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://dev-813354.oktapreview.com/app/dev-813354_krzysztofssodev_1/exk14fxcpjuKMcor30h8/sso/saml\"/\u003e\u003c/md:IDPSSODescriptor\u003e\u003c/md:EntityDescriptor\u003e",
+ EntityDescriptorURL: "",
+ AttributesToRoles: []types.AttributeMapping{
+ {
+ Name: "groups",
+ Value: "okta-admin",
+ Roles: []string{"access"},
+ },
+ },
+ SigningKeyPair: &types.AsymmetricKeyPair{
+ PrivateKey: "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1py+q5bnxhAvZ7bnhQQauHIqOpFA5CMXCXd+A9Y1qDHecnN3\nrFVZfyUZrYm/gTQZSptgAshr+VWsBh9O3ZAZ5Lg+f0FSkYr+k0+A7Bx3v4N76Psi\nyE+INMmtyvP2bTGyOrHqaeGzQYkpiPq044WS2j5PDYiQWbepDpxLYbiQ7qwzS9xZ\nZp6w8TyFGNkMl26F5ZeSH+T/S/EHt3Q9t2U2uWRdWv1IdZ13krqJJURMzkBMMj2j\nBxgKoHPJa7T4DniLg5a5OBKTbernbPdW1xzQUgHATwdlQAx2+KBIpKJiuqixH1/b\nVHHpZzAR5IYXv82xmYBoyjFBsmDH3ao+MFraTwIDAQABAoIBAQCEXZbINEHtiiwC\n1u/Cvb5RRrC/ALm6O95Ii3egnCzp+SAPDSKhmt6hKdvFifEgmmaC+oPkE4Ns/Ccm\ne4bj5q3hwLVjPYHUnJrZdq64cfJ1n338O3C/hTYoAL/9Li0uOfmIdBV1iqxJ3nRM\ntPx+W/MwQj/1w+XsP/e4ODPSKMjTOyZkLVhArLA2qBM3l1NBWQw4EV96m1Dvjq2o\nxFYhSODZOYDYXq82NZya3cBzj30kEB/6fNk6qPAsMa3Ck7F/9mx3MA2XM/S0aB/U\nq+5I1g+mTAMPKa2c2Tv2hwWuRU9ddKGiXuw/gHPoBwEU7AVNk+nNSVDhj5/pqcFB\nM/lPNg6xAoGBAPu/oICyXwlXYfsvkTx+HHpY7Imq8RtBUjVpD3z+LC6+QydlF2Z/\nNqLDxBPZAAdA7VGzw5QdNR8DKY9EgeRQAcci8FIqjueTPQDVKl9kwJzOxqg8DM8t\nR8YpIOtP22JvjHAkFafBq9cWYZNLQwVabIkCdc0jUruN53WKRkj+b0npAoGBANo8\nkX7ypsS+riLu6Ez89tXHV78CW8eMb/Wxsa2hgrzd7KmgjYdj2wlfRaEY6pSvBA1Y\nMvy/Emvm2KhwuGzWWPJvoaQq/Hr6Puns9DVP8U3TTJDC3R5dDZUQ0DiVUGyez9Qu\nXV5aNMnXFjGPdRQYjGM1zG6677dM0CVYu/6MVSd3AoGBAN5X3tALufgsHzOUTXfa\nAhjk1PS573yc8piNk8pXSnp2PCVdGY/DJ2QV9uV4sJe3dmLEnCYCrdoYFuqcHQSi\nzQ8uAobvY4uP9T75BhV+jMdxsO8BKmcInO2dgZ+SxjZoQucAV8f0O2saL0/CFw1x\nUY6oh5aIbheMOzMKzwzE+1GRAoGAYm5FFWPuUfjK49irj+XckulZKz6uFJ/D86YU\nxIJ/TB4wWwWeL/2a0mxVJGbvjuYtRrOMM7EeZup0t+w3UmePMLGmzzvQKstpyupj\n7xPCe16dPwGU59gCg0RVFeBKqOMsS8Apvp+jBZJsYSgaH1k/IJQoQ50u95a+nsmZ\n6SJ0WdsCgYBfTcIJ456LNPQ7sjDtcqIQcbBgXYIt/u4dIhz0zuLSfvTrXAtcy7nU\nEDU+N2Ay715GmS+/iwc592Itam93t3sl1ql/Y+SrrxGQ7zRd6MALKIxM0+4qptB5\nDFXT1B5qhKHdZFr71AIGPrUjfsRQV8tPKFjRkuQ0zqEPvi4g06RMRw==\n-----END RSA PRIVATE KEY-----\n",
+ Cert: "-----BEGIN CERTIFICATE-----\nMIIDKzCCAhOgAwIBAgIRALIKjRCwhEmeWcNvwy1fBCUwDQYJKoZIhvcNAQELBQAw\nQDEVMBMGA1UEChMMVGVsZXBvcnQgT1NTMScwJQYDVQQDEx50ZWxlcG9ydC5sb2Nh\nbGhvc3QubG9jYWxkb21haW4wHhcNMjIwNDI1MDg1MzE4WhcNMzIwNDIyMDg1MzE4\nWjBAMRUwEwYDVQQKEwxUZWxlcG9ydCBPU1MxJzAlBgNVBAMTHnRlbGVwb3J0Lmxv\nY2FsaG9zdC5sb2NhbGRvbWFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBANacvquW58YQL2e254UEGrhyKjqRQOQjFwl3fgPWNagx3nJzd6xVWX8lGa2J\nv4E0GUqbYALIa/lVrAYfTt2QGeS4Pn9BUpGK/pNPgOwcd7+De+j7IshPiDTJrcrz\n9m0xsjqx6mnhs0GJKYj6tOOFkto+Tw2IkFm3qQ6cS2G4kO6sM0vcWWaesPE8hRjZ\nDJduheWXkh/k/0vxB7d0PbdlNrlkXVr9SHWdd5K6iSVETM5ATDI9owcYCqBzyWu0\n+A54i4OWuTgSk23q52z3Vtcc0FIBwE8HZUAMdvigSKSiYrqosR9f21Rx6WcwEeSG\nF7/NsZmAaMoxQbJgx92qPjBa2k8CAwEAAaMgMB4wDgYDVR0PAQH/BAQDAgeAMAwG\nA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBADXVdHHQ3HB6X7QizVnQ/Cgg\nzEOEiMC1ClsxkXeZnB1H6TpFEm9jxT77tVBGB0x9dAyEwmOwYAgf+F5TJIl6mqfy\nIbXK+XFxqacoDHprtPtqmqH1tR20G9cP8mxfbm+bq47rOWN1tgAmIlxxaR6Z2GTE\n2zKw5vyjdZsSidCxka9YdW8AgEcpnVteqxjrs4SOcbidJIs+9NnxtApJPMKFOkbk\nvjJx59skfCsNnrk8D3CeiDiT7/HMDLM4c83ETG04C/SzNSvGlpf60mTIjkyzydAK\nvIiKii9s2m1KiTOsGKVkDEr+PbMoo4y6XRB0tVomdCQxzCZLDs6iwviGGUer7wI=\n-----END CERTIFICATE-----\n",
+ },
+ Provider: "",
+ EncryptionKeyPair: nil,
+ },
+ }, defaults.SAMLAuthRequestTTL)
+ require.NoError(t, err)
+
+ // check ValidateSAMLResponse
+ response, err = a.ValidateSAMLResponse(context.Background(), base64.StdEncoding.EncodeToString([]byte(respOkta)))
+ require.NoError(t, err)
+ require.NotNil(t, response)
+
+ // check internal method, validate diagnostic outputs.
+ diagCtx := a.newSSODiagContext(types.KindSAML)
+ auth, err := a.validateSAMLResponse(context.Background(), diagCtx, base64.StdEncoding.EncodeToString([]byte(respOkta)))
+ require.NoError(t, err)
+
+ // ensure diag info got stored and is identical.
+ infoFromBackend, err := a.GetSSODiagnosticInfo(context.Background(), types.KindSAML, auth.Req.ID)
+ require.NoError(t, err)
+ require.Equal(t, &diagCtx.info, infoFromBackend)
+
+ // verify values
+ require.Equal(t, "ops@gravitational.io", auth.Username)
+ require.Equal(t, "ops@gravitational.io", auth.Identity.Username)
+ require.Equal(t, "saml-test-conn", auth.Identity.ConnectorID)
+ require.Equal(t, "_4f256462-6c2d-466d-afc0-6ee36602b6f2", auth.Req.ID)
+ require.Equal(t, 0, len(auth.HostSigners))
+
+ authnInstant := time.Date(2022, 04, 25, 8, 3, 11, 779000000, time.UTC)
+
+ // ignore, this is boring and very complex.
+ require.NotNil(t, diagCtx.info.SAMLAssertionInfo.Assertions)
+ diagCtx.info.SAMLAssertionInfo.Assertions = nil
+
+ require.Equal(t, types.SSODiagnosticInfo{
+ TestFlow: true,
+ Error: "",
+ Success: true,
+ CreateUserParams: &types.CreateUserParams{
+ ConnectorName: "saml-test-conn",
+ Username: "ops@gravitational.io",
+ Roles: []string{"access"},
+ Traits: map[string][]string{
+ "groups": {"Everyone", "okta-admin", "okta-dev"},
+ "username": {"ops@gravitational.io"},
+ },
+ SessionTTL: 108000000000000,
+ },
+ SAMLAttributesToRoles: []types.AttributeMapping{
+ {
+ Name: "groups",
+ Value: "okta-admin",
+ Roles: []string{"access"},
+ },
+ },
+ SAMLAttributesToRolesWarnings: nil,
+ SAMLAttributeStatements: map[string][]string{
+ "groups": {"Everyone", "okta-admin", "okta-dev"},
+ "username": {"ops@gravitational.io"},
+ },
+ SAMLAssertionInfo: &types.AssertionInfo{
+ NameID: "ops@gravitational.io",
+ Values: map[string]samltypes.Attribute{
+ "groups": {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"},
+ Name: "groups",
+ NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified",
+ Values: []samltypes.AttributeValue{
+ {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"},
+ Value: "Everyone",
+ },
+ {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"},
+ Value: "okta-admin",
+ },
+ {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"},
+ Value: "okta-dev",
+ },
+ },
+ },
+ "username": {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "Attribute"},
+ Name: "username",
+ NameFormat: "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified",
+ Values: []samltypes.AttributeValue{
+ {
+ XMLName: xml.Name{Space: "urn:oasis:names:tc:SAML:2.0:assertion", Local: "AttributeValue"},
+ Value: "ops@gravitational.io",
+ },
+ },
+ },
+ },
+ WarningInfo: &saml2.WarningInfo{},
+ SessionIndex: "_4f256462-6c2d-466d-afc0-6ee36602b6f2",
+ AuthnInstant: &authnInstant,
+ SessionNotOnOrAfter: nil,
+ Assertions: nil,
+ ResponseSignatureValidated: true,
+ },
+ SAMLTraitsFromAssertions: map[string][]string{
+ "groups": {"Everyone", "okta-admin", "okta-dev"},
+ "username": {"ops@gravitational.io"},
+ },
+ SAMLConnectorTraitMapping: []types.TraitMapping{
+ {
+ Trait: "groups",
+ Value: "okta-admin",
+ Roles: []string{"access"},
+ },
+ },
+ }, diagCtx.info)
+
+ // make sure no users have been created.
+ users, err := a.GetUsers(false)
+ require.NoError(t, err)
+ require.Equal(t, 0, len(users))
+}
diff --git a/lib/auth/sso_diag_context.go b/lib/auth/sso_diag_context.go
new file mode 100644
index 0000000000000..415de9d0c3aff
--- /dev/null
+++ b/lib/auth/sso_diag_context.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2022 Gravitational, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package auth
+
+import (
+ "context"
+
+ "github.com/gravitational/teleport/api/types"
+)
+
+// ssoDiagContext is a helper type for accumulating the SSO diagnostic info prior to writing it to the backend.
+type ssoDiagContext struct {
+ // authKind is auth kind such as types.KindSAML
+ authKind string
+ // createSSODiagnosticInfo is a callback to create the types.SSODiagnosticInfo record in the backend.
+ createSSODiagnosticInfo func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error
+ // requestID is the ID of the auth request being processed.
+ requestID string
+ // info accumulates SSO diagnostic info
+ info types.SSODiagnosticInfo
+}
+
+// writeToBackend saves the accumulated SSO diagnostic information to the backend.
+func (c *ssoDiagContext) writeToBackend(ctx context.Context) {
+ if c.info.TestFlow {
+ err := c.createSSODiagnosticInfo(ctx, c.authKind, c.requestID, c.info)
+ if err != nil {
+ log.WithError(err).WithField("requestID", c.requestID).Warn("failed to write SSO diag info data")
+ }
+ }
+}
+
+// newSSODiagContext returns new ssoDiagContext referencing particular Server.
+// authKind must be one of supported auth kinds (e.g. types.KindSAML).
+func (a *Server) newSSODiagContext(authKind string) *ssoDiagContext {
+ return &ssoDiagContext{
+ authKind: authKind,
+ createSSODiagnosticInfo: a.Identity.CreateSSODiagnosticInfo,
+ }
+}
diff --git a/lib/auth/sso_diag_context_test.go b/lib/auth/sso_diag_context_test.go
new file mode 100644
index 0000000000000..ca9fc6a5d65ae
--- /dev/null
+++ b/lib/auth/sso_diag_context_test.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2022 Gravitational, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package auth
+
+import (
+ "context"
+ "testing"
+
+ "github.com/gravitational/teleport/api/types"
+ "github.com/stretchr/testify/require"
+)
+
+func Test_ssoDiagContext_writeToBackend(t *testing.T) {
+ diag := &ssoDiagContext{
+ authKind: types.KindSAML,
+ requestID: "123",
+ info: types.SSODiagnosticInfo{},
+ }
+
+ callCount := 0
+
+ diag.createSSODiagnosticInfo = func(ctx context.Context, authKind string, authRequestID string, info types.SSODiagnosticInfo) error {
+ callCount++
+ require.Truef(t, info.TestFlow, "createSSODiagnosticInfo must not be called if info.TestFlow is false.")
+ require.Equal(t, diag.authKind, authKind)
+ require.Equal(t, diag.requestID, authRequestID)
+ require.Equal(t, diag.info, info)
+ return nil
+ }
+
+ // with TestFlow: false, no call is made.
+ diag.info.TestFlow = false
+ diag.writeToBackend(context.Background())
+ require.Equal(t, 0, callCount)
+
+ // with TestFlow: true, a call is made.
+ diag.info.TestFlow = true
+ diag.writeToBackend(context.Background())
+ require.Equal(t, 1, callCount)
+}
diff --git a/lib/client/api.go b/lib/client/api.go
index 01be263a0db90..9f232eca2fbf4 100644
--- a/lib/client/api.go
+++ b/lib/client/api.go
@@ -2791,7 +2791,7 @@ func (tc *TeleportClient) ssoLogin(ctx context.Context, connectorID string, pub
Protocol: protocol,
BindAddr: tc.BindAddr,
Browser: tc.Browser,
- })
+ }, nil)
return response, trace.Wrap(err)
}
diff --git a/lib/client/redirect.go b/lib/client/redirect.go
index 78324c9f2c0cb..bb68150ac16ac 100644
--- a/lib/client/redirect.go
+++ b/lib/client/redirect.go
@@ -75,10 +75,18 @@ type Redirector struct {
context context.Context
// cancel broadcasts cancel
cancel context.CancelFunc
+ // RedirectorConfig allows customization of Redirector
+ RedirectorConfig
+}
+
+// RedirectorConfig allows customization of Redirector
+type RedirectorConfig struct {
+ // SSOLoginConsoleRequestFn allows customizing issuance of SSOLoginConsoleReq. Optional.
+ SSOLoginConsoleRequestFn func(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error)
}
// NewRedirector returns new local web server redirector
-func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error) {
+func NewRedirector(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*Redirector, error) {
clt, proxyURL, err := initClient(login.ProxyAddr, login.Insecure, login.Pool)
if err != nil {
return nil, trace.Wrap(err)
@@ -91,9 +99,9 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error)
return nil, trace.Wrap(err)
}
- context, cancel := context.WithCancel(ctx)
+ ctxCancel, cancel := context.WithCancel(ctx)
rd := &Redirector{
- context: context,
+ context: ctxCancel,
cancel: cancel,
proxyClient: clt,
proxyURL: proxyURL,
@@ -105,6 +113,14 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO) (*Redirector, error)
errorC: make(chan error, 1),
}
+ if config != nil {
+ rd.RedirectorConfig = *config
+ }
+
+ if rd.SSOLoginConsoleRequestFn == nil {
+ rd.SSOLoginConsoleRequestFn = rd.issueSSOLoginConsoleRequest
+ }
+
// callback is a callback URL communicated to the Teleport proxy,
// after SAML/OIDC login, the teleport will redirect user's browser
// to this laptop-local URL
@@ -145,7 +161,7 @@ func (rd *Redirector) Start() error {
query.Set("secret_key", rd.key.String())
u.RawQuery = query.Encode()
- out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), SSOLoginConsoleReq{
+ req := SSOLoginConsoleReq{
RedirectURL: u.String(),
PublicKey: rd.PubKey,
CertTTL: rd.TTL,
@@ -153,24 +169,37 @@ func (rd *Redirector) Start() error {
Compatibility: rd.Compatibility,
RouteToCluster: rd.RouteToCluster,
KubernetesCluster: rd.KubernetesCluster,
- })
- if err != nil {
- return trace.Wrap(err)
}
- var re *SSOLoginConsoleResponse
- err = json.Unmarshal(out.Bytes(), &re)
+ response, err := rd.SSOLoginConsoleRequestFn(req)
if err != nil {
return trace.Wrap(err)
}
+
// notice late binding of the redirect URL here, it is referenced
// in the callback handler, but is known only after the request
// is sent to the Teleport Proxy, that's why
// redirectURL is a SyncString
- rd.redirectURL.Set(re.RedirectURL)
+ rd.redirectURL.Set(response.RedirectURL)
return nil
}
+// issueSSOLoginConsoleRequest is default implementation, but may be overridden via RedirectorConfig.IssueSSOLoginConsoleRequest.
+func (rd *Redirector) issueSSOLoginConsoleRequest(req SSOLoginConsoleReq) (*SSOLoginConsoleResponse, error) {
+ out, err := rd.proxyClient.PostJSON(rd.context, rd.proxyClient.Endpoint("webapi", rd.Protocol, "login", "console"), req)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ var re *SSOLoginConsoleResponse
+ err = json.Unmarshal(out.Bytes(), &re)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return re, nil
+}
+
// Done is called when redirector is closed
// or parent context is closed
func (rd *Redirector) Done() <-chan struct{} {
@@ -202,6 +231,11 @@ func (rd *Redirector) callback(w http.ResponseWriter, r *http.Request) (*auth.SS
return nil, trace.NotFound("path not found")
}
+ if r.URL.Query().Has("err") {
+ err := r.URL.Query().Get("err")
+ return nil, trace.Errorf("identity provider callback failed with error: %v", err)
+ }
+
// Decrypt ciphertext to get login response.
plaintext, err := rd.key.Open([]byte(r.URL.Query().Get("response")))
if err != nil {
diff --git a/lib/client/weblogin.go b/lib/client/weblogin.go
index 0ac9963d97511..91fa16650982a 100644
--- a/lib/client/weblogin.go
+++ b/lib/client/weblogin.go
@@ -262,8 +262,8 @@ func initClient(proxyAddr string, insecure bool, pool *x509.CertPool) (*WebClien
}
// SSHAgentSSOLogin is used by tsh to fetch user credentials using OpenID Connect (OIDC) or SAML.
-func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO) (*auth.SSHLoginResponse, error) {
- rd, err := NewRedirector(ctx, login)
+func SSHAgentSSOLogin(ctx context.Context, login SSHLoginSSO, config *RedirectorConfig) (*auth.SSHLoginResponse, error) {
+ rd, err := NewRedirector(ctx, login, config)
if err != nil {
return nil, trace.Wrap(err)
}
diff --git a/lib/events/codes.go b/lib/events/codes.go
index bdc2814dcd25c..c36f3e1a56a2a 100644
--- a/lib/events/codes.go
+++ b/lib/events/codes.go
@@ -64,6 +64,10 @@ const (
// RecoveryCodeUseFailureCode is an event code for when a
// recovery code was not used successfully.
RecoveryCodeUseFailureCode = "T1009W"
+ // UserSSOTestFlowLoginCode is the successful SSO test flow user login event code.
+ UserSSOTestFlowLoginCode = "T1010I"
+ // UserSSOTestFlowLoginFailureCode is the unsuccessful SSO test flow user login event code.
+ UserSSOTestFlowLoginFailureCode = "T1011W"
// BillingCardCreateCode is an event code for when a user creates a new credit card.
BillingCardCreateCode = "TBL00I"
diff --git a/lib/services/identity.go b/lib/services/identity.go
index 8f2426fe4280d..29d1e096ad089 100644
--- a/lib/services/identity.go
+++ b/lib/services/identity.go
@@ -203,8 +203,14 @@ type Identity interface {
// CreateSAMLAuthRequest creates new auth request
CreateSAMLAuthRequest(req SAMLAuthRequest, ttl time.Duration) error
- // GetSAMLAuthRequest returns OSAML auth request if found
- GetSAMLAuthRequest(id string) (*SAMLAuthRequest, error)
+ // GetSAMLAuthRequest returns SAML auth request if found
+ GetSAMLAuthRequest(ctx context.Context, id string) (*SAMLAuthRequest, error)
+
+ // CreateSSODiagnosticInfo creates new SSO diagnostic info record.
+ CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error
+
+ // GetSSODiagnosticInfo returns SSO diagnostic info records.
+ GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error)
// CreateGithubConnector creates a new Github connector
CreateGithubConnector(connector types.GithubConnector) error
@@ -476,6 +482,12 @@ type SAMLAuthRequest struct {
// KubernetesCluster is the name of Kubernetes cluster to issue credentials for.
KubernetesCluster string `json:"kubernetes_cluster,omitempty"`
+
+ // SSOTestFlow indicates if the request is part of the test flow.
+ SSOTestFlow bool `json:"sso_test_flow"`
+
+ // ConnectorSpec is embedded connector spec for use in test flow.
+ ConnectorSpec *types.SAMLConnectorSpecV2 `json:"connector_spec,omitempty"`
}
// Check returns nil if all parameters are great, err otherwise
@@ -493,6 +505,15 @@ func (i *SAMLAuthRequest) Check() error {
}
}
+ // we could collapse these two checks into one, but the error message would become ambiguous.
+ if i.SSOTestFlow && i.ConnectorSpec == nil {
+ return trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true")
+ }
+
+ if !i.SSOTestFlow && i.ConnectorSpec != nil {
+ return trace.BadParameter("ConnectorSpec must be nil when SSOTestFlow is false")
+ }
+
return nil
}
diff --git a/lib/services/identity_test.go b/lib/services/identity_test.go
new file mode 100644
index 0000000000000..43b81ca52bfc6
--- /dev/null
+++ b/lib/services/identity_test.go
@@ -0,0 +1,115 @@
+/*
+Copyright 2022 Gravitational, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package services
+
+import (
+ "testing"
+ "time"
+
+ "github.com/gravitational/teleport/api/types"
+ "github.com/gravitational/trace"
+ "github.com/stretchr/testify/require"
+)
+
+func TestSAMLAuthRequest_Check(t *testing.T) {
+ const exampleSSHCert = `ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgb1srW/W3ZDjYAO45xLYAwzHBDLsJ4Ux6ICFIkTjb1LEAAAADAQABAAAAYQCkoR51poH0wE8w72cqSB8Sszx+vAhzcMdCO0wqHTj7UNENHWEXGrU0E0UQekD7U+yhkhtoyjbPOVIP7hNa6aRk/ezdh/iUnCIt4Jt1v3Z1h1P+hA4QuYFMHNB+rmjPwAcAAAAAAAAAAAAAAAEAAAAEdGVzdAAAAAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAAHcAAAAHc3NoLXJzYQAAAAMBAAEAAABhANFS2kaktpSGc+CcmEKPyw9mJC4nZKxHKTgLVZeaGbFZOvJTNzBspQHdy7Q1uKSfktxpgjZnksiu/tFF9ngyY2KFoc+U88ya95IZUycBGCUbBQ8+bhDtw/icdDGQD5WnUwAAAG8AAAAHc3NoLXJzYQAAAGC8Y9Z2LQKhIhxf52773XaWrXdxP0t3GBVo4A10vUWiYoAGepr6rQIoGGXFxT4B9Gp+nEBJjOwKDXPrAevow0T9ca8gZN+0ykbhSrXLE5Ao48rqr3zP4O1/9P7e6gp0gw8=`
+
+ tests := []struct {
+ name string
+ req SAMLAuthRequest
+ wantErr bool
+ }{
+ {
+ name: "normal request",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 60 * time.Minute,
+ },
+ wantErr: false,
+ },
+ {
+ name: "below min CertTTL",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 1 * time.Second,
+ },
+ wantErr: true,
+ },
+ {
+ name: "above max CertTTL",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 1000 * time.Hour,
+ },
+ wantErr: true,
+ },
+ {
+ name: "TTL ignored without cert",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ CertTTL: 60 * time.Minute,
+ },
+ wantErr: false,
+ },
+ {
+ name: "SSOTestFlow requires ConnectorSpec",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 60 * time.Minute,
+ SSOTestFlow: true,
+ },
+ wantErr: true,
+ },
+ {
+ name: "ConnectorSpec requires SSOTestFlow",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 60 * time.Minute,
+ ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"},
+ },
+ wantErr: true,
+ },
+ {
+ name: "ConnectorSpec with SSOTestFlow works",
+ req: SAMLAuthRequest{
+ ConnectorID: "foo",
+ PublicKey: []byte(exampleSSHCert),
+ CertTTL: 60 * time.Minute,
+ SSOTestFlow: true,
+ ConnectorSpec: &types.SAMLConnectorSpecV2{Display: "dummy"},
+ },
+ wantErr: false,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := tt.req.Check()
+ if tt.wantErr {
+ require.Error(t, err)
+ require.True(t, trace.IsBadParameter(err))
+ } else {
+ require.NoError(t, err)
+ }
+ })
+ }
+}
diff --git a/lib/services/local/users.go b/lib/services/local/users.go
index 2f64cd2c8ce70..1d8df2e342d1c 100644
--- a/lib/services/local/users.go
+++ b/lib/services/local/users.go
@@ -1200,11 +1200,11 @@ func (s *IdentityService) CreateSAMLAuthRequest(req services.SAMLAuthRequest, tt
}
// GetSAMLAuthRequest returns SAML auth request if found
-func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthRequest, error) {
+func (s *IdentityService) GetSAMLAuthRequest(ctx context.Context, id string) (*services.SAMLAuthRequest, error) {
if id == "" {
return nil, trace.BadParameter("missing parameter id")
}
- item, err := s.Get(context.TODO(), backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id))
+ item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, samlPrefix, requestsPrefix, id))
if err != nil {
return nil, trace.Wrap(err)
}
@@ -1215,6 +1215,62 @@ func (s *IdentityService) GetSAMLAuthRequest(id string) (*services.SAMLAuthReque
return &req, nil
}
+// CreateSSODiagnosticInfo creates new SAML diagnostic info record.
+func (s *IdentityService) CreateSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string, entry types.SSODiagnosticInfo) error {
+ if authRequestID == "" {
+ return trace.BadParameter("missing parameter authRequestID")
+ }
+
+ switch authKind {
+ case types.KindSAML, types.KindGithub, types.KindOIDC:
+ // nothing to do
+ default:
+ return trace.BadParameter("unsupported authKind %q", authKind)
+ }
+
+ jsonValue, err := json.Marshal(entry)
+ if err != nil {
+ return trace.Wrap(err)
+ }
+
+ item := backend.Item{
+ Key: backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID),
+ Value: jsonValue,
+ Expires: backend.Expiry(s.Clock(), time.Minute*15),
+ }
+ _, err = s.Create(ctx, item)
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ return nil
+}
+
+// GetSSODiagnosticInfo returns SSO diagnostic info records.
+func (s *IdentityService) GetSSODiagnosticInfo(ctx context.Context, authKind string, authRequestID string) (*types.SSODiagnosticInfo, error) {
+ if authRequestID == "" {
+ return nil, trace.BadParameter("missing parameter authRequestID")
+ }
+
+ switch authKind {
+ case types.KindSAML, types.KindGithub, types.KindOIDC:
+ // nothing to do
+ default:
+ return nil, trace.BadParameter("unsupported authKind %q", authKind)
+ }
+
+ item, err := s.Get(ctx, backend.Key(webPrefix, connectorsPrefix, authKind, requestsTracePrefix, authRequestID))
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ var req types.SSODiagnosticInfo
+ if err := json.Unmarshal(item.Value, &req); err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return &req, nil
+}
+
// CreateGithubConnector creates a new Github connector
func (s *IdentityService) CreateGithubConnector(connector types.GithubConnector) error {
if err := connector.CheckAndSetDefaults(); err != nil {
@@ -1485,6 +1541,7 @@ const (
samlPrefix = "saml"
githubPrefix = "github"
requestsPrefix = "requests"
+ requestsTracePrefix = "requestsTrace"
usedTOTPPrefix = "used_totp"
usedTOTPTTL = 30 * time.Second
mfaDevicePrefix = "mfa"
diff --git a/lib/services/local/users_test.go b/lib/services/local/users_test.go
index 424d78d8e09d9..21cc1485023f1 100644
--- a/lib/services/local/users_test.go
+++ b/lib/services/local/users_test.go
@@ -762,3 +762,41 @@ func TestIdentityService_UpsertGlobalWebauthnSessionData_maxLimit(t *testing.T)
require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeLogin, id3, sd))
require.NoError(t, identity.UpsertGlobalWebauthnSessionData(ctx, scopeOther, id3, sd))
}
+
+func TestIdentityService_SSODiagnosticInfoCrud(t *testing.T) {
+ identity := newIdentityService(t, clockwork.NewFakeClock())
+ ctx := context.Background()
+
+ nilInfo, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "BAD_ID")
+ require.Nil(t, nilInfo)
+ require.Error(t, err)
+
+ info := types.SSODiagnosticInfo{
+ TestFlow: true,
+ Error: "foo bar baz",
+ Success: false,
+ CreateUserParams: &types.CreateUserParams{
+ ConnectorName: "bar",
+ Username: "baz",
+ },
+ SAMLAttributesToRoles: []types.AttributeMapping{
+ {
+ Name: "foo",
+ Value: "bar",
+ Roles: []string{"baz"},
+ },
+ },
+ SAMLAttributesToRolesWarnings: nil,
+ SAMLAttributeStatements: nil,
+ SAMLAssertionInfo: nil,
+ SAMLTraitsFromAssertions: nil,
+ SAMLConnectorTraitMapping: nil,
+ }
+
+ err = identity.CreateSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID", info)
+ require.NoError(t, err)
+
+ infoGet, err := identity.GetSSODiagnosticInfo(ctx, types.KindSAML, "MY_ID")
+ require.NoError(t, err)
+ require.Equal(t, &info, infoGet)
+}
diff --git a/lib/services/saml.go b/lib/services/saml.go
index 09f2963a2c893..563babcc901a6 100644
--- a/lib/services/saml.go
+++ b/lib/services/saml.go
@@ -69,7 +69,7 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error {
}
sc.SetIssuer(metadata.EntityID)
- if len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 {
+ if metadata.IDPSSODescriptor != nil && len(metadata.IDPSSODescriptor.SingleSignOnServices) > 0 {
sc.SetSSO(metadata.IDPSSODescriptor.SingleSignOnServices[0].Location)
}
}
@@ -95,6 +95,10 @@ func ValidateSAMLConnector(sc types.SAMLConnector) error {
})
}
+ if len(sc.GetAttributesToRoles()) == 0 {
+ return trace.BadParameter("attributes_to_roles is empty, authorization with connector would never assign any roles")
+ }
+
log.Debugf("[SAML] SSO: %v", sc.GetSSO())
log.Debugf("[SAML] Issuer: %v", sc.GetIssuer())
log.Debugf("[SAML] ACS: %v", sc.GetAssertionConsumerService())
@@ -124,33 +128,45 @@ func SAMLAssertionsToTraits(assertions saml2.AssertionInfo) map[string][]string
return traits
}
-// GetSAMLServiceProvider gets the SAMLConnector's service provider
-func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) {
- certStore := dsig.MemoryX509CertificateStore{
- Roots: []*x509.Certificate{},
+// CheckSAMLEntityDescriptor checks if the entity descriptor XML is valid and has at least one valid certificate.
+func CheckSAMLEntityDescriptor(entityDescriptor string) ([]*x509.Certificate, error) {
+ if entityDescriptor == "" {
+ return nil, nil
}
- if sc.GetEntityDescriptor() != "" {
- metadata := &samltypes.EntityDescriptor{}
- if err := xml.Unmarshal([]byte(sc.GetEntityDescriptor()), metadata); err != nil {
- return nil, trace.Wrap(err, "failed to parse entity_descriptor")
- }
+ metadata := &samltypes.EntityDescriptor{}
+ if err := xml.Unmarshal([]byte(entityDescriptor), metadata); err != nil {
+ return nil, trace.Wrap(err, "failed to parse entity_descriptor")
+ }
- for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors {
- for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates {
- certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data))
- if err != nil {
- return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor")
- }
- cert, err := x509.ParseCertificate(certData)
- if err != nil {
- return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor")
- }
- certStore.Roots = append(certStore.Roots, cert)
+ var roots []*x509.Certificate
+
+ for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors {
+ for _, samlCert := range kd.KeyInfo.X509Data.X509Certificates {
+ certData, err := base64.StdEncoding.DecodeString(strings.TrimSpace(samlCert.Data))
+ if err != nil {
+ return nil, trace.Wrap(err, "failed to decode certificate defined in entity_descriptor")
+ }
+ cert, err := x509.ParseCertificate(certData)
+ if err != nil {
+ return nil, trace.Wrap(err, "failed to parse certificate defined in entity_descriptor")
}
+ roots = append(roots, cert)
}
}
+ return roots, nil
+}
+
+// GetSAMLServiceProvider gets the SAMLConnector's service provider
+func GetSAMLServiceProvider(sc types.SAMLConnector, clock clockwork.Clock) (*saml2.SAMLServiceProvider, error) {
+ roots, errEd := CheckSAMLEntityDescriptor(sc.GetEntityDescriptor())
+ if errEd != nil {
+ return nil, trace.Wrap(errEd)
+ }
+
+ certStore := dsig.MemoryX509CertificateStore{Roots: roots}
+
if sc.GetCert() != "" {
cert, err := tlsca.ParseCertificatePEM([]byte(sc.GetCert()))
if err != nil {
diff --git a/lib/services/saml_test.go b/lib/services/saml_test.go
index d1d77509cef6e..551a97299f7a5 100644
--- a/lib/services/saml_test.go
+++ b/lib/services/saml_test.go
@@ -18,10 +18,12 @@ package services
import (
"strings"
+ "testing"
"github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/fixtures"
+ "github.com/stretchr/testify/require"
"gopkg.in/check.v1"
kyaml "k8s.io/apimachinery/pkg/util/yaml"
)
@@ -49,3 +51,20 @@ func (s *SAMLSuite) TestParseFromMetadata(c *check.C) {
c.Assert(oc.GetSigningKeyPair(), check.NotNil)
c.Assert(oc.GetAttributes(), check.DeepEquals, []string{"groups"})
}
+
+func TestCheckSAMLEntityDescriptor(t *testing.T) {
+ input := fixtures.SAMLOktaConnectorV2
+
+ decoder := kyaml.NewYAMLOrJSONDecoder(strings.NewReader(input), defaults.LookaheadBufSize)
+ var raw UnknownResource
+ err := decoder.Decode(&raw)
+ require.NoError(t, err)
+
+ oc, err := UnmarshalSAMLConnector(raw.Raw)
+ require.NoError(t, err)
+
+ ed := oc.GetEntityDescriptor()
+ certs, err := CheckSAMLEntityDescriptor(ed)
+ require.NoError(t, err)
+ require.Len(t, certs, 1)
+}
diff --git a/lib/teleterm/clusters/cluster_auth.go b/lib/teleterm/clusters/cluster_auth.go
index 0fd7282fc9f58..0e57c74d1edeb 100644
--- a/lib/teleterm/clusters/cluster_auth.go
+++ b/lib/teleterm/clusters/cluster_auth.go
@@ -157,7 +157,7 @@ func (c *Cluster) SSOLogin(ctx context.Context, providerType, providerName strin
Protocol: providerType,
BindAddr: c.clusterClient.BindAddr,
Browser: c.clusterClient.Browser,
- })
+ }, nil)
if err != nil {
return trace.Wrap(err)
}
diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go
index b2fa5440524bb..6d8d7e56717ee 100644
--- a/lib/web/apiserver.go
+++ b/lib/web/apiserver.go
@@ -1378,6 +1378,19 @@ func ConstructSSHResponse(response AuthParams) (*url.URL, error) {
return u, nil
}
+func redirectURLWithError(clientRedirectURL string, errReply error) (*url.URL, error) {
+ u, err := url.Parse(clientRedirectURL)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ values := u.Query()
+ values.Set("err", errReply.Error())
+
+ u.RawQuery = values.Encode()
+ return u, nil
+}
+
// CreateSessionReq is a request to create session from username, password and
// second factor token.
type CreateSessionReq struct {
diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go
index 191d7912ffd70..302510831d18c 100644
--- a/lib/web/apiserver_test.go
+++ b/lib/web/apiserver_test.go
@@ -581,7 +581,7 @@ func TestSAMLSuccess(t *testing.T) {
id := doc.Root().SelectAttr("ID")
require.NotNil(t, id)
- authRequest, err := s.server.Auth().GetSAMLAuthRequest(id.Value)
+ authRequest, err := s.server.Auth().GetSAMLAuthRequest(context.Background(), id.Value)
require.NoError(t, err)
// now swap the request id to the hardcoded one in fixtures
diff --git a/lib/web/saml.go b/lib/web/saml.go
index f618404161802..74a857c642913 100644
--- a/lib/web/saml.go
+++ b/lib/web/saml.go
@@ -19,6 +19,8 @@ package web
import (
"net/http"
+ "github.com/gravitational/teleport/lib/auth"
+
"github.com/gravitational/teleport/lib/client"
"github.com/gravitational/teleport/lib/httplib"
"github.com/gravitational/teleport/lib/services"
@@ -96,9 +98,23 @@ func (h *Handler) samlACS(w http.ResponseWriter, r *http.Request, p httprouter.P
return client.LoginFailedRedirectURL
}
- response, err := h.cfg.ProxyClient.ValidateSAMLResponse(samlResponse)
+ response, err := h.cfg.ProxyClient.ValidateSAMLResponse(r.Context(), samlResponse)
+
if err != nil {
logger.WithError(err).Error("Error while processing callback.")
+
+ // try to find the auth request, which bears the original client redirect URL.
+ // if found, use it to terminate the flow.
+ //
+ // this improves the UX by terminating the failed SSO flow immediately, rather than hoping for a timeout.
+ if requestID, errParse := auth.ParseSAMLInResponseTo(samlResponse); errParse == nil {
+ if request, errGet := h.cfg.ProxyClient.GetSAMLAuthRequest(r.Context(), requestID); errGet == nil && !request.CreateWebSession {
+ if url, errEnc := redirectURLWithError(request.ClientRedirectURL, err); errEnc == nil {
+ return url.String()
+ }
+ }
+ }
+
return client.LoginFailedBadCallbackRedirectURL
}