From 2b6639093f147fbc7daa3cd1dae8425f0f5d5238 Mon Sep 17 00:00:00 2001 From: Jesse Peterson Date: Sun, 21 Jun 2020 10:25:11 -0700 Subject: [PATCH] Marshal InstallEnterpriseApplication embedded manifest (#669) Marshal Assets of InstallEnterpriseApplication embedded manifest Update to support SHA256, Metadata, and other related fields. Update tests to use and test for new fields. Match JSON field names to the plist field names. The manifest field names don't follow typical CamelCase key names like normal Plists. It looks more like JSON. To avoid confusion just make them match. This makes it simpler to follow along with Apple's documentation when composing commands in JSON for the MicroMDM API. Otherwise we have to use our Go struct field names which are specific to us and nobody should need to figure that out (or really have to translate between the two). Update the test case to match. --- go.mod | 2 +- go.sum | 18 + mdm/appmanifest/appmanifest.go | 29 +- mdm/mdm/internal/mdmproto/mdm.pb.go | 602 +++++++++++++++++----------- mdm/mdm/internal/mdmproto/mdm.proto | 3 + mdm/mdm/marshal_proto.go | 39 ++ mdm/mdm/mdm_command_test.go | 31 +- mdm/mdm/unmarshal_proto.go | 49 +++ 8 files changed, 521 insertions(+), 252 deletions(-) diff --git a/go.mod b/go.mod index 936bf9eb..3f5a32a7 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/go-sql-driver/mysql v1.4.0 // indirect github.com/go-stack/stack v1.7.0 // indirect github.com/gogo/protobuf v1.3.1 - github.com/golang/protobuf v1.3.2 + github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.6.2 diff --git a/go.sum b/go.sum index 7500cea1..c84726cd 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,16 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -77,7 +87,15 @@ golang.org/x/sys v0.0.0-20180614134839-8883426083c0/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.2.0 h1:S0iUepdCWODXRvtE+gcRDd15L+k+k1AiHlMiMjefH24= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/Masterminds/squirrel.v1 v1.0.0-20170825200431-a6b93000bd21 h1:GmGVIcDxdecAcVjcTp4IpK4VmCMxXhyZKwN2eIzsZ4Y= gopkg.in/Masterminds/squirrel.v1 v1.0.0-20170825200431-a6b93000bd21/go.mod h1:8PH4rQjb7OdPC6OWDDuY6J/PT8iSNTiff3jmccc2m10= diff --git a/mdm/appmanifest/appmanifest.go b/mdm/appmanifest/appmanifest.go index 915585cc..77e946cb 100644 --- a/mdm/appmanifest/appmanifest.go +++ b/mdm/appmanifest/appmanifest.go @@ -15,34 +15,37 @@ const DefaultMD5Size = 10 << 20 // 10MB // http://help.apple.com/deployment/osx/#/ior5df10f73a type Manifest struct { - ManifestItems []Item `plist:"items"` + ManifestItems []Item `plist:"items" json:"items"` } type Item struct { - Assets []Asset `plist:"assets"` + Assets []Asset `plist:"assets" json:"assets"` // Apple claims the metadata struct is required, // but testing shows otherwise. - Metadata *Metadata `plist:"metadata,omitempty"` + Metadata *Metadata `plist:"metadata,omitempty" json:"metadata,omitempty"` } type Asset struct { - Kind string `plist:"kind"` - MD5Size int64 `plist:"md5-size"` - MD5s []string `plist:"md5s"` - URL string `plist:"url"` + Kind string `plist:"kind" json:"kind"` + MD5Size int64 `plist:"md5-size,omitempty" json:"md5-size,omitempty"` + MD5s []string `plist:"md5s,omitempty" json:"md5s,omitempty"` + SHA256Size int64 `plist:"sha256-size,omitempty" json:"sha256-size,omitempty"` + SHA256s []string `plist:"sha256s,omitempty" json:"sha256s,omitempty"` + URL string `plist:"url" json:"url"` } type Metadata struct { BundleInfo - Items []BundleInfo `plist:"items,omitempty"` - Kind string `plist:"kind"` - Subtitle string `plist:"subtitle"` - Title string `plist:"title"` + Items []BundleInfo `plist:"items,omitempty" json:"items,omitempty"` + Kind string `plist:"kind" json:"kind"` + Subtitle string `plist:"subtitle" json:"subtitle"` + Title string `plist:"title" json:"title"` + SizeInBytes int64 `plist:"sizeInBytes,omitempty" json:"sizeInBytes,omitempty"` } type BundleInfo struct { - BundleIdentifier string `plist:"bundle-identifier"` - BundleVersion string `plist:"bundle-version"` + BundleIdentifier string `plist:"bundle-identifier" json:"bundle-identifier"` + BundleVersion string `plist:"bundle-version" json:"bundle-version"` } // File is an io.Reader which knows its size. diff --git a/mdm/mdm/internal/mdmproto/mdm.pb.go b/mdm/mdm/internal/mdmproto/mdm.pb.go index bcecf215..6849547b 100644 --- a/mdm/mdm/internal/mdmproto/mdm.pb.go +++ b/mdm/mdm/internal/mdmproto/mdm.pb.go @@ -132,6 +132,8 @@ type Command struct { //- DeviceConfigured //- AvailableOSUpdates //- NSExtensionMappings + //- EnableRemoteDesktop + //- DisableRemoteDesktop //- ActivationLockBypassCode // // Types that are valid to be assigned to Request: @@ -1822,6 +1824,8 @@ type Asset struct { Md5Size int64 `protobuf:"varint,2,opt,name=md5_size,json=md5Size,proto3" json:"md5_size,omitempty"` Md5S []string `protobuf:"bytes,3,rep,name=md5s,proto3" json:"md5s,omitempty"` Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` + Sha256Size int64 `protobuf:"varint,5,opt,name=sha256_size,json=sha256Size,proto3" json:"sha256_size,omitempty"` + Sha256S []string `protobuf:"bytes,6,rep,name=sha256s,proto3" json:"sha256s,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1888,6 +1892,20 @@ func (m *Asset) GetUrl() string { return "" } +func (m *Asset) GetSha256Size() int64 { + if m != nil { + return m.Sha256Size + } + return 0 +} + +func (m *Asset) GetSha256S() []string { + if m != nil { + return m.Sha256S + } + return nil +} + type Metadata struct { BundleIdentifier string `protobuf:"bytes,1,opt,name=bundle_identifier,json=bundleIdentifier,proto3" json:"bundle_identifier,omitempty"` BundleVersion string `protobuf:"bytes,2,opt,name=bundle_version,json=bundleVersion,proto3" json:"bundle_version,omitempty"` @@ -1895,6 +1913,7 @@ type Metadata struct { Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` Subtitle string `protobuf:"bytes,5,opt,name=subtitle,proto3" json:"subtitle,omitempty"` Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` + SizeInBytes int64 `protobuf:"varint,7,opt,name=size_in_bytes,json=sizeInBytes,proto3" json:"size_in_bytes,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1975,6 +1994,13 @@ func (m *Metadata) GetTitle() string { return "" } +func (m *Metadata) GetSizeInBytes() int64 { + if m != nil { + return m.SizeInBytes + } + return 0 +} + type BundleInfo struct { BundleIdentifier string `protobuf:"bytes,1,opt,name=bundle_identifier,json=bundleIdentifier,proto3" json:"bundle_identifier,omitempty"` BundleVersion string `protobuf:"bytes,2,opt,name=bundle_version,json=bundleVersion,proto3" json:"bundle_version,omitempty"` @@ -4466,242 +4492,245 @@ func init() { func init() { proto.RegisterFile("mdm.proto", fileDescriptor_fd1fa389f704dbf7) } var fileDescriptor_fd1fa389f704dbf7 = []byte{ - // 3746 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0x4b, 0x73, 0x1c, 0x47, - 0x72, 0xc6, 0x10, 0x20, 0x30, 0x93, 0x18, 0x00, 0x83, 0xc2, 0x83, 0x03, 0x80, 0x04, 0xc8, 0xe6, - 0x6a, 0x45, 0x69, 0x25, 0xd2, 0xa6, 0xc4, 0x5d, 0xed, 0x5a, 0xb2, 0x05, 0x02, 0xe4, 0x02, 0x2b, - 0x82, 0x40, 0xf4, 0x90, 0x54, 0x84, 0xb5, 0xeb, 0xde, 0x46, 0x77, 0x61, 0xa6, 0x02, 0xfd, 0xda, - 0xaa, 0xee, 0x81, 0x46, 0x67, 0x3b, 0x7c, 0xf6, 0xc5, 0xe1, 0xf0, 0xc5, 0x77, 0x87, 0xff, 0x80, - 0x7d, 0xf3, 0xcd, 0xc7, 0x0d, 0xff, 0x82, 0x0d, 0xf9, 0x57, 0xf8, 0xe6, 0xc8, 0x7a, 0x74, 0xf7, - 0xf4, 0x34, 0x06, 0xbc, 0xf8, 0x36, 0x9d, 0xf9, 0x65, 0xd6, 0x33, 0xb3, 0xf2, 0x31, 0xd0, 0x0a, - 0xfd, 0xf0, 0x71, 0xc2, 0xe3, 0x34, 0x26, 0xcd, 0xd0, 0x0f, 0xe5, 0x2f, 0xeb, 0xf7, 0xb0, 0x7c, - 0x10, 0x87, 0xa1, 0x1b, 0xf9, 0x67, 0xee, 0x28, 0x88, 0x5d, 0x9f, 0x3c, 0x80, 0xb6, 0xa7, 0x28, - 0x4e, 0x96, 0x31, 0xbf, 0xdb, 0xb8, 0xdf, 0x78, 0xd4, 0xb2, 0x17, 0x35, 0xed, 0x6d, 0xc6, 0x7c, - 0xf2, 0x33, 0x58, 0xd0, 0x9f, 0xdd, 0x5b, 0xf7, 0x1b, 0x8f, 0x16, 0x9f, 0xae, 0x3e, 0x36, 0x0a, - 0x1f, 0x6b, 0x6d, 0xb6, 0x41, 0x58, 0xff, 0x76, 0x07, 0x16, 0x34, 0x11, 0x75, 0x73, 0xfa, 0x87, - 0x8c, 0x8a, 0xd4, 0x49, 0x47, 0x09, 0x35, 0xba, 0x35, 0xed, 0xcd, 0x28, 0xa1, 0xe4, 0x00, 0x56, - 0x58, 0x24, 0x52, 0x37, 0x08, 0x9c, 0x84, 0xc7, 0x17, 0x2c, 0xa0, 0x7a, 0x8c, 0x6e, 0x31, 0xc6, - 0xb1, 0x02, 0x9c, 0x29, 0xfe, 0xd1, 0x8c, 0xbd, 0xcc, 0xc6, 0x28, 0xe4, 0x6b, 0x58, 0xe6, 0x34, - 0x8c, 0x87, 0x34, 0xd7, 0x31, 0x2b, 0x75, 0xdc, 0x29, 0x74, 0xd8, 0x92, 0x5f, 0xa8, 0x58, 0xe2, - 0x65, 0x02, 0x19, 0xc0, 0xdd, 0xd2, 0x34, 0x86, 0x4c, 0xb0, 0x38, 0x62, 0x51, 0x3f, 0xd7, 0x37, - 0x27, 0xf5, 0xfd, 0xa4, 0x6e, 0x4e, 0x39, 0xb8, 0x50, 0xbe, 0xcd, 0xae, 0xe5, 0x12, 0x0a, 0x3b, - 0xe5, 0xb9, 0x56, 0x07, 0xba, 0x2d, 0x07, 0x7a, 0x58, 0x33, 0xf1, 0x9a, 0x71, 0xb6, 0x4a, 0x8b, - 0xa8, 0x0c, 0x73, 0x0e, 0x66, 0x12, 0xd4, 0x77, 0xdc, 0x24, 0x09, 0x98, 0xe7, 0xa6, 0x2c, 0x8e, - 0x9c, 0x80, 0x89, 0xb4, 0x3b, 0x2f, 0x47, 0xb1, 0x26, 0x96, 0x43, 0xfd, 0xfd, 0x02, 0xfa, 0x8a, - 0x89, 0xf4, 0x68, 0xc6, 0xee, 0xb2, 0x6b, 0x78, 0xe4, 0x15, 0x10, 0x9f, 0x0e, 0x99, 0x47, 0x1d, - 0x16, 0x5d, 0xc4, 0x3c, 0x94, 0x9c, 0xee, 0x82, 0xd4, 0xbd, 0x53, 0xe8, 0x3e, 0x94, 0x98, 0xe3, - 0x02, 0x72, 0x34, 0x63, 0xaf, 0xfa, 0x55, 0x22, 0xf9, 0x05, 0x2c, 0x6a, 0x6d, 0x41, 0xec, 0x5d, - 0x76, 0x9b, 0x52, 0xcd, 0x7a, 0x55, 0xcd, 0xab, 0xd8, 0xbb, 0x3c, 0x9a, 0xb1, 0xc1, 0xcf, 0xbf, - 0xf0, 0xf4, 0xbd, 0x80, 0xba, 0xdc, 0x49, 0x5c, 0x21, 0xbc, 0xd8, 0xa7, 0xdd, 0x56, 0xf5, 0xf4, - 0x0f, 0x90, 0x7f, 0xa6, 0xd9, 0x78, 0xfa, 0x5e, 0x99, 0x40, 0x7e, 0x05, 0x6d, 0xca, 0x5d, 0x41, - 0x1d, 0xa5, 0xb5, 0x0b, 0x52, 0x7e, 0xa3, 0x90, 0x7f, 0x81, 0x5c, 0x35, 0x81, 0xa3, 0x19, 0x7b, - 0x91, 0x16, 0x9f, 0xe4, 0x18, 0x56, 0xcd, 0x1d, 0x0f, 0x19, 0xe7, 0x31, 0x67, 0x51, 0xbf, 0xbb, - 0x28, 0x15, 0x6c, 0x97, 0x4f, 0x51, 0x42, 0x4e, 0x0c, 0xe2, 0x68, 0xc6, 0xee, 0xf0, 0x0a, 0x8d, - 0x7c, 0x89, 0xe6, 0x22, 0x52, 0xce, 0x3c, 0xdc, 0x10, 0xd1, 0x6d, 0x4b, 0x2d, 0x9b, 0x65, 0x2d, - 0x05, 0xf7, 0x68, 0xc6, 0x1e, 0x43, 0x93, 0x13, 0x58, 0xcb, 0x22, 0xdc, 0x3a, 0x27, 0x13, 0x94, - 0x3b, 0xae, 0xe7, 0xc5, 0x59, 0x94, 0x76, 0x97, 0xaa, 0xc7, 0xf1, 0x56, 0x82, 0xde, 0x0a, 0xca, - 0xf7, 0x15, 0x04, 0x8f, 0x23, 0xab, 0x12, 0xd5, 0x71, 0x04, 0x34, 0xa5, 0x52, 0x5d, 0x77, 0x79, - 0xf2, 0x38, 0x90, 0x89, 0x12, 0xea, 0x38, 0xcc, 0x17, 0x39, 0x84, 0x0e, 0x8d, 0xdc, 0xf3, 0x00, - 0xcf, 0x11, 0x37, 0x05, 0x0f, 0x64, 0xa5, 0x6a, 0xd2, 0x2f, 0x24, 0xe2, 0x55, 0x2c, 0xd2, 0x13, - 0x75, 0x22, 0xcb, 0x74, 0x8c, 0x42, 0x4e, 0x61, 0xcd, 0x18, 0x64, 0xe9, 0xf6, 0x76, 0x3b, 0x52, - 0xd1, 0xdd, 0x89, 0x8b, 0x5b, 0xba, 0x9a, 0x47, 0x33, 0x36, 0x61, 0x13, 0x54, 0xf2, 0x16, 0x36, - 0xf4, 0x96, 0x38, 0x5e, 0x1c, 0x5d, 0xb0, 0x7e, 0xc6, 0x95, 0xca, 0x55, 0xa9, 0x72, 0xb7, 0x50, - 0xa9, 0x77, 0xe0, 0xa0, 0x8c, 0x3a, 0x9a, 0xb1, 0xd7, 0xdd, 0x1a, 0x3a, 0xe9, 0xc1, 0x06, 0xce, - 0x6f, 0xe4, 0x70, 0xea, 0xd3, 0x30, 0x91, 0x26, 0x26, 0xef, 0x20, 0x91, 0x6a, 0xef, 0x95, 0xd4, - 0x22, 0xcc, 0xce, 0x51, 0x07, 0x6a, 0xdd, 0x6b, 0xee, 0x24, 0x99, 0xfc, 0x16, 0xba, 0xa1, 0x1b, - 0xb9, 0xfd, 0x3a, 0xd3, 0x5d, 0x93, 0x7a, 0xef, 0x17, 0x7a, 0x4f, 0x14, 0x72, 0xd2, 0x70, 0x37, - 0xc3, 0x5a, 0x0e, 0x9a, 0xad, 0xf6, 0x40, 0xe5, 0x9d, 0x5d, 0xaf, 0xde, 0x13, 0xe5, 0x78, 0xc6, - 0x37, 0x76, 0x95, 0x57, 0x89, 0xe4, 0xd7, 0xb0, 0xca, 0xa2, 0x21, 0x4b, 0xa9, 0x93, 0xc6, 0xe8, - 0xc5, 0xfa, 0xdc, 0x0d, 0xbb, 0x1b, 0x52, 0xd9, 0x56, 0xf9, 0x98, 0x10, 0xf2, 0x26, 0x3e, 0x53, - 0x80, 0xa3, 0x19, 0x7b, 0x85, 0x8d, 0x93, 0xf0, 0x80, 0x86, 0x6e, 0xc0, 0x7c, 0x37, 0x75, 0xcb, - 0x13, 0x13, 0xdd, 0xcd, 0xea, 0x01, 0xbd, 0x53, 0xb0, 0xf2, 0x34, 0xd0, 0x1c, 0xd6, 0x8d, 0x78, - 0x99, 0x4e, 0xbe, 0x82, 0x25, 0x73, 0x91, 0x42, 0xea, 0x33, 0xb7, 0x7b, 0xa7, 0x6a, 0x55, 0xfa, - 0x0a, 0x9d, 0x20, 0x17, 0xad, 0x8a, 0x95, 0xbe, 0xd1, 0x35, 0xe8, 0xcd, 0x52, 0xd2, 0xdd, 0xaa, - 0x6b, 0x50, 0xdb, 0x64, 0x84, 0x17, 0x79, 0xf1, 0x49, 0xfe, 0x0c, 0x9a, 0x82, 0xa6, 0x29, 0x8b, - 0xfa, 0xa2, 0xbb, 0x25, 0xe5, 0x48, 0x21, 0xd7, 0xd3, 0x9c, 0xa3, 0x19, 0x3b, 0x47, 0x91, 0x2b, - 0x78, 0x50, 0x77, 0xf0, 0xe3, 0x17, 0x76, 0x5b, 0xaa, 0xfa, 0x68, 0xda, 0x0d, 0xa8, 0xde, 0xdd, - 0xbd, 0x70, 0x3a, 0x84, 0x44, 0xb0, 0x5b, 0x37, 0xb0, 0x9b, 0xa6, 0x9c, 0x9d, 0x67, 0x29, 0x15, - 0xdd, 0x1d, 0x39, 0xea, 0x4f, 0xa7, 0x8d, 0xba, 0x9f, 0xa3, 0x8f, 0x66, 0xec, 0xbb, 0xe1, 0x14, - 0x3e, 0xbe, 0xb7, 0x75, 0xe3, 0x5d, 0x50, 0xea, 0x9f, 0xbb, 0xde, 0x65, 0xf7, 0x6e, 0xf5, 0xbd, - 0x9d, 0x1c, 0xed, 0xa5, 0xc6, 0xe2, 0x7b, 0x1b, 0x5e, 0xcb, 0x45, 0x03, 0x15, 0x34, 0x75, 0x2e, - 0x18, 0x0f, 0xaf, 0x5c, 0x4e, 0xe5, 0x23, 0x71, 0x15, 0x73, 0xbf, 0x7b, 0xaf, 0x6a, 0xa0, 0x3d, - 0x9a, 0xbe, 0xd4, 0xa8, 0x33, 0x0d, 0x42, 0x03, 0x15, 0x93, 0x64, 0x34, 0xd0, 0x21, 0xe5, 0xec, - 0x62, 0x54, 0xa3, 0x77, 0xb7, 0x6a, 0xa0, 0xef, 0x24, 0xb2, 0x46, 0xf5, 0xe6, 0xb0, 0x96, 0x43, - 0xbe, 0x85, 0x3b, 0x38, 0x65, 0x37, 0x4b, 0x63, 0xc7, 0xf5, 0x43, 0x16, 0x15, 0xca, 0xf7, 0xaa, - 0xb6, 0xd0, 0xa3, 0xe9, 0x7e, 0x96, 0xc6, 0xfb, 0x08, 0x2b, 0xa9, 0x5e, 0x17, 0x35, 0x74, 0xf2, - 0x1b, 0x20, 0xc2, 0x1b, 0x50, 0x3f, 0x0b, 0xa8, 0x13, 0x0b, 0x27, 0x4b, 0xd0, 0x8a, 0xba, 0xf7, - 0xab, 0x8f, 0x55, 0x4f, 0x63, 0x4e, 0x7b, 0x6f, 0x25, 0x02, 0x1f, 0x2b, 0x23, 0x77, 0x2a, 0x14, - 0x4d, 0x4e, 0x72, 0x42, 0x97, 0x23, 0x3c, 0x37, 0xea, 0x3e, 0x98, 0x98, 0x64, 0x45, 0x61, 0xcf, - 0x73, 0xa5, 0x47, 0xad, 0x2a, 0x45, 0x3a, 0x39, 0x83, 0x75, 0xd7, 0x4b, 0xd9, 0x90, 0x3a, 0x91, - 0x70, 0xe8, 0xf7, 0x29, 0x8d, 0x84, 0x74, 0x03, 0x56, 0xd5, 0xf5, 0xef, 0x4b, 0xd4, 0xeb, 0xde, - 0x8b, 0x1c, 0x83, 0xae, 0x5f, 0xc9, 0xbe, 0x16, 0x05, 0x15, 0x35, 0xf2, 0x38, 0xc5, 0xe9, 0x61, - 0x68, 0x34, 0x74, 0xb3, 0x20, 0x75, 0x2e, 0xe9, 0xa8, 0xfb, 0xb0, 0xaa, 0xd1, 0x96, 0xa8, 0x97, - 0x2c, 0xa0, 0xef, 0x10, 0xf4, 0x0d, 0x1d, 0xa1, 0x46, 0x9e, 0x53, 0x87, 0x9a, 0x8a, 0xe6, 0x62, - 0x9c, 0x0a, 0x8d, 0x52, 0xca, 0x13, 0xce, 0xc4, 0xb8, 0x3b, 0xfd, 0x49, 0xd5, 0x5c, 0xb4, 0x97, - 0x79, 0x91, 0xc3, 0xc7, 0x3d, 0xab, 0x09, 0x3f, 0x6b, 0xf9, 0xf8, 0xb6, 0xe3, 0x8d, 0x38, 0x8f, - 0xe3, 0x54, 0xa4, 0xdc, 0x4d, 0x9c, 0x34, 0xbe, 0xa4, 0x51, 0xf7, 0x83, 0xaa, 0xcf, 0xee, 0xd1, - 0xf4, 0xb9, 0xc1, 0xbc, 0x41, 0x08, 0xfa, 0x6c, 0x51, 0x25, 0x3e, 0x6f, 0xc1, 0x82, 0x0e, 0x3e, - 0xac, 0x8f, 0x61, 0x79, 0x3c, 0xbc, 0x26, 0x5d, 0x58, 0x48, 0x54, 0x6e, 0x20, 0xe3, 0xf5, 0xb6, - 0x6d, 0x3e, 0xad, 0x27, 0xb0, 0x34, 0x16, 0x46, 0x93, 0x5d, 0x00, 0xe6, 0xd3, 0x28, 0x65, 0x17, - 0x8c, 0x72, 0x1d, 0xdd, 0x97, 0x28, 0xd6, 0x29, 0x6c, 0x5f, 0x1f, 0x27, 0x93, 0x3f, 0x87, 0xf5, - 0xda, 0x58, 0x5b, 0x8d, 0xba, 0x96, 0x4c, 0x8a, 0x58, 0x4f, 0x60, 0xeb, 0xda, 0x78, 0x98, 0x10, - 0x98, 0x2b, 0x65, 0x30, 0xf2, 0xb7, 0x35, 0x80, 0xee, 0x75, 0xa1, 0x2d, 0xb9, 0x0f, 0x8b, 0xc5, - 0x5c, 0x45, 0xb7, 0x71, 0x7f, 0x16, 0x93, 0x93, 0x12, 0x89, 0x7c, 0x0c, 0xab, 0x25, 0x2f, 0x25, - 0x9c, 0x38, 0x0a, 0x46, 0x32, 0x3d, 0x69, 0xda, 0x2b, 0x85, 0xcb, 0x11, 0xa7, 0x51, 0x30, 0xb2, - 0x3e, 0x85, 0xd5, 0x89, 0x40, 0x17, 0xf7, 0xf2, 0x0f, 0x19, 0xe5, 0x8c, 0x1a, 0xf5, 0xe6, 0xd3, - 0x7a, 0x0a, 0x4b, 0x63, 0x41, 0x29, 0xe6, 0x4a, 0x3a, 0x7c, 0x53, 0x67, 0xab, 0x76, 0x61, 0x51, - 0xd1, 0xe4, 0xb1, 0x59, 0xdf, 0x01, 0x14, 0x41, 0x30, 0xe9, 0xc0, 0x6c, 0xc2, 0x22, 0xbd, 0x5a, - 0xfc, 0x89, 0xa3, 0x85, 0x54, 0x08, 0xb7, 0xaf, 0x72, 0xa8, 0x96, 0x6d, 0x3e, 0x51, 0x79, 0x32, - 0x88, 0x23, 0xea, 0x44, 0x59, 0x78, 0x4e, 0xb9, 0x4c, 0x8f, 0x5a, 0xf6, 0xa2, 0xa4, 0xbd, 0x96, - 0x24, 0xeb, 0xef, 0x1b, 0xb0, 0x58, 0x0a, 0x73, 0x6b, 0xd4, 0x7f, 0x02, 0x24, 0xe1, 0x54, 0x50, - 0x3e, 0xa4, 0x8e, 0x7c, 0xa5, 0x93, 0xc0, 0x8d, 0xf4, 0x76, 0x74, 0x0c, 0xe7, 0xd0, 0x4d, 0xdd, - 0xb3, 0xc0, 0x8d, 0xc8, 0x17, 0xd0, 0xf5, 0x99, 0x70, 0x83, 0x20, 0xbe, 0xc2, 0x93, 0xfd, 0x9e, - 0x85, 0x2c, 0x1d, 0x39, 0x82, 0xa6, 0x59, 0x22, 0x87, 0x6f, 0xda, 0x9b, 0x86, 0x7f, 0x66, 0xd8, - 0x3d, 0xe4, 0x5a, 0xff, 0xda, 0x80, 0x4e, 0x35, 0x5e, 0x26, 0x1f, 0x41, 0xc7, 0xa7, 0x22, 0x65, - 0x91, 0x7a, 0x28, 0x22, 0x37, 0x34, 0xe9, 0xe4, 0x4a, 0x89, 0xfe, 0xda, 0x0d, 0x29, 0x79, 0x0a, - 0x1b, 0x65, 0xa8, 0x49, 0x51, 0x7c, 0xbd, 0x29, 0x6b, 0x25, 0xa6, 0x3e, 0x31, 0x9f, 0xec, 0x40, - 0x0b, 0x5d, 0x97, 0x93, 0xb2, 0x90, 0xea, 0xdd, 0x69, 0x22, 0xe1, 0x0d, 0x0b, 0x29, 0xd9, 0x86, - 0x66, 0xee, 0x80, 0xe7, 0x14, 0xcf, 0x7c, 0x5b, 0xfb, 0xd0, 0x2e, 0x47, 0xe5, 0xfa, 0x52, 0xe3, - 0x7d, 0x74, 0xc6, 0x62, 0xf9, 0x86, 0x5c, 0xf2, 0x9a, 0xe6, 0x95, 0x45, 0xac, 0x27, 0xb0, 0x3a, - 0x11, 0x93, 0xe3, 0x98, 0x18, 0x77, 0x97, 0xd6, 0x99, 0x7f, 0x5b, 0xa7, 0x78, 0x0f, 0xf2, 0x78, - 0x7b, 0x0a, 0x92, 0x7c, 0x00, 0xcb, 0x17, 0x31, 0xf7, 0x30, 0xb1, 0x09, 0xa8, 0xf4, 0x4b, 0xea, - 0xb8, 0x96, 0x24, 0xf5, 0x50, 0x13, 0x2d, 0x06, 0xcb, 0xe3, 0x01, 0x79, 0xf9, 0x2a, 0x35, 0xa6, - 0x5f, 0xa5, 0x5b, 0x13, 0x57, 0x09, 0x67, 0x74, 0x11, 0xc7, 0x69, 0x14, 0xa7, 0xf9, 0x5e, 0x9a, - 0x6f, 0xeb, 0x3f, 0x66, 0x81, 0x4c, 0xc6, 0xec, 0xe4, 0xa7, 0xb0, 0xc2, 0xd2, 0x2c, 0xa2, 0xc2, - 0x11, 0x69, 0xcc, 0xe5, 0x69, 0xe1, 0xb8, 0xb3, 0xf6, 0x92, 0x22, 0xf7, 0x90, 0x7a, 0xec, 0x57, - 0x3c, 0xce, 0xad, 0xaa, 0xc7, 0x21, 0x5f, 0xc1, 0x42, 0x9c, 0xa8, 0x1d, 0x9f, 0xad, 0x66, 0xd2, - 0x93, 0xc3, 0x9e, 0x2a, 0xa8, 0x6d, 0x64, 0x70, 0x71, 0xa1, 0x1b, 0xb1, 0x0b, 0xcc, 0xe6, 0x32, - 0x1e, 0xe8, 0xd3, 0x5e, 0x34, 0xb4, 0xb7, 0x3c, 0xc0, 0x8b, 0xa8, 0x4c, 0x3f, 0xa4, 0x51, 0xea, - 0x5c, 0x04, 0x6e, 0x5f, 0xc8, 0xa4, 0x7d, 0xd6, 0xb8, 0x04, 0xa4, 0xbf, 0x44, 0x32, 0x39, 0x85, - 0xa5, 0xf1, 0xc8, 0x6d, 0xbe, 0x1a, 0xb9, 0x4d, 0x4e, 0x69, 0x2c, 0x2c, 0xb3, 0xc7, 0xe5, 0xc9, - 0x4b, 0x80, 0x52, 0x44, 0xb6, 0x70, 0xcd, 0x13, 0x53, 0x1b, 0x71, 0xd9, 0x25, 0x49, 0xf2, 0x73, - 0xb8, 0xe3, 0x0d, 0xdc, 0xa8, 0x4f, 0x9d, 0xd2, 0x52, 0x04, 0xbe, 0x72, 0x32, 0xed, 0x6e, 0xd9, - 0x1b, 0x8a, 0x7d, 0x92, 0x73, 0x7b, 0xc8, 0xb4, 0x0e, 0x61, 0xeb, 0xda, 0x4d, 0x24, 0x1f, 0xc2, - 0x4a, 0x92, 0x71, 0x6f, 0x80, 0x79, 0x74, 0x48, 0xd3, 0x41, 0x6c, 0x8e, 0x70, 0xd9, 0x90, 0x4f, - 0x24, 0xd5, 0x7a, 0x00, 0x7b, 0x37, 0xac, 0xdb, 0xda, 0x85, 0xbb, 0xd3, 0x16, 0x63, 0xfd, 0x6f, - 0x23, 0x07, 0xd4, 0x3f, 0x98, 0x8f, 0xa1, 0x69, 0x0e, 0x4d, 0xce, 0x62, 0x2c, 0xf4, 0x3e, 0xd1, - 0x1c, 0x3b, 0xc7, 0x4c, 0x1c, 0xfc, 0xad, 0xc9, 0x83, 0xff, 0x0b, 0xd8, 0x2e, 0x43, 0x9c, 0x84, - 0x45, 0xf2, 0xd9, 0xf2, 0x28, 0x4f, 0xf1, 0xb6, 0xcd, 0x3e, 0x6a, 0xdb, 0x77, 0x4a, 0x02, 0x67, - 0x8a, 0x7f, 0x80, 0x6c, 0x72, 0x0c, 0x0f, 0x0c, 0x9e, 0xd3, 0x61, 0x6c, 0xe2, 0xfa, 0x01, 0xf5, - 0x2e, 0x1d, 0x7c, 0x8a, 0x19, 0xa7, 0xca, 0xb7, 0x34, 0xed, 0x5d, 0x0d, 0xb4, 0x73, 0xdc, 0x01, - 0xc2, 0x6c, 0x8d, 0xb2, 0x8e, 0xa1, 0x69, 0x16, 0x40, 0xbe, 0x82, 0xe5, 0x7c, 0x4e, 0x2c, 0xa5, - 0xa1, 0x7a, 0x66, 0xc6, 0xb2, 0x1b, 0x83, 0x3d, 0x4e, 0x69, 0x68, 0x2f, 0x85, 0xa5, 0x2f, 0x61, - 0xf5, 0xa1, 0x5d, 0x66, 0x93, 0x0f, 0x61, 0xde, 0x15, 0x82, 0xa6, 0x46, 0xcd, 0x4a, 0x29, 0xd8, - 0x42, 0xba, 0xad, 0xd9, 0x72, 0x7b, 0x69, 0xea, 0xe2, 0x2b, 0xa0, 0xcb, 0x75, 0xe5, 0xed, 0xd5, - 0x1c, 0x3b, 0xc7, 0x58, 0xbf, 0x85, 0xdb, 0x52, 0x01, 0xbe, 0xd1, 0x97, 0x2c, 0xca, 0xdf, 0x68, - 0xfc, 0x4d, 0xb6, 0xa0, 0x19, 0xfa, 0xcf, 0x1c, 0xc1, 0x7e, 0x50, 0xef, 0xd6, 0xac, 0xbd, 0x10, - 0xfa, 0xcf, 0x7a, 0xec, 0x07, 0xf9, 0xa4, 0x87, 0xfe, 0x33, 0xb5, 0xbb, 0x2d, 0x5b, 0xfe, 0xc6, - 0x87, 0xa9, 0x30, 0x4d, 0xfc, 0x69, 0xfd, 0xb1, 0x01, 0x4d, 0x33, 0x28, 0xf9, 0x19, 0xac, 0x9e, - 0x67, 0x91, 0x1f, 0xa0, 0x0f, 0xa9, 0x84, 0x26, 0x1d, 0xc5, 0x38, 0x2e, 0xdc, 0xc5, 0x07, 0xb0, - 0xac, 0xc1, 0x43, 0xca, 0x85, 0xf1, 0x8f, 0x2d, 0x7b, 0x49, 0x51, 0xdf, 0x29, 0x22, 0xf9, 0x18, - 0x6e, 0xab, 0xdd, 0x9d, 0x95, 0xdb, 0x52, 0xaa, 0x82, 0x3c, 0x57, 0x1a, 0xa3, 0x8b, 0xd8, 0x56, - 0x90, 0x7c, 0x85, 0x73, 0xa5, 0x15, 0x6e, 0x43, 0x53, 0x64, 0xe7, 0x29, 0x4b, 0x75, 0x81, 0x0f, - 0x1f, 0x17, 0xfd, 0x4d, 0xd6, 0xe1, 0xb6, 0x62, 0xcc, 0x4b, 0x86, 0xfa, 0xb0, 0x7e, 0x0f, 0x50, - 0xa8, 0xfe, 0xff, 0x58, 0x93, 0xf5, 0x37, 0xb0, 0x56, 0x53, 0x91, 0xb8, 0x29, 0xa4, 0x43, 0x2b, - 0xaf, 0x56, 0x3a, 0x94, 0xfa, 0x65, 0x3e, 0xa6, 0xc8, 0xfa, 0x15, 0x6c, 0xd6, 0x57, 0x26, 0x6e, - 0x8e, 0xbb, 0xac, 0xcf, 0x60, 0x75, 0xa2, 0xfa, 0x70, 0x63, 0xb0, 0xf9, 0x2d, 0xac, 0x54, 0xaa, - 0x0c, 0xe4, 0x1e, 0x80, 0xae, 0x48, 0x38, 0x79, 0x5c, 0xd8, 0xd2, 0x94, 0x63, 0x1f, 0x77, 0x4a, - 0x16, 0x21, 0x94, 0x31, 0x16, 0x66, 0xbf, 0x54, 0x50, 0xdf, 0xf2, 0xc0, 0xfa, 0x02, 0xd6, 0xeb, - 0x2a, 0x0e, 0xef, 0xb1, 0x8e, 0x7f, 0x99, 0x83, 0xf5, 0xba, 0x6a, 0x12, 0x79, 0x05, 0x0f, 0xc5, - 0x25, 0x4b, 0x9c, 0x84, 0xb3, 0xd0, 0xe5, 0x3a, 0x2c, 0x72, 0xf2, 0xfa, 0x14, 0xa7, 0xea, 0xbd, - 0x50, 0x41, 0xc3, 0x1e, 0x42, 0xcf, 0x14, 0x52, 0x46, 0x48, 0x46, 0xa5, 0x86, 0x91, 0x77, 0xf0, - 0x11, 0x66, 0x07, 0xf5, 0xca, 0x5c, 0xe1, 0x70, 0xda, 0xcf, 0x02, 0x97, 0xab, 0x42, 0x9e, 0x0a, - 0x00, 0x1e, 0x0a, 0x9a, 0xd6, 0xa8, 0xdc, 0x17, 0xb6, 0xc2, 0xca, 0xc8, 0xa2, 0x07, 0x1f, 0xfa, - 0x71, 0xa4, 0x13, 0xd1, 0x24, 0x4e, 0xb2, 0x00, 0x73, 0x28, 0x33, 0x8c, 0x19, 0x80, 0x45, 0x17, - 0xb1, 0x76, 0x5d, 0x16, 0xc2, 0x31, 0xed, 0x3c, 0xd3, 0x60, 0x3d, 0x84, 0xd6, 0x2e, 0xef, 0xf2, - 0x2f, 0x61, 0x4b, 0x46, 0xb9, 0xb5, 0x6a, 0x6e, 0xab, 0xc0, 0x10, 0x01, 0xf5, 0xa2, 0x55, 0xa9, - 0x8b, 0x2c, 0x08, 0x54, 0x30, 0xa8, 0xcc, 0x67, 0x33, 0x19, 0x13, 0x7b, 0x99, 0x05, 0x81, 0x8c, - 0x09, 0x6b, 0x44, 0x65, 0x95, 0x54, 0x8a, 0x2e, 0xd4, 0x89, 0xe2, 0x0e, 0x48, 0xd1, 0xef, 0x60, - 0x4b, 0x6e, 0x80, 0xde, 0x56, 0x99, 0x8f, 0x6b, 0x1d, 0xc6, 0x21, 0x94, 0x92, 0x7d, 0x5c, 0xbd, - 0xda, 0x51, 0x04, 0x6a, 0x5d, 0xc2, 0xde, 0x74, 0x6b, 0xe9, 0xd6, 0x3f, 0x34, 0x60, 0xb3, 0x5e, - 0x04, 0x2f, 0xaf, 0x18, 0xc4, 0x3c, 0x2d, 0xc7, 0xba, 0x2d, 0x49, 0x91, 0xd3, 0xda, 0x81, 0x56, - 0xb1, 0xf8, 0x5b, 0x3a, 0xca, 0x32, 0xcb, 0x7d, 0x08, 0x4b, 0x26, 0x42, 0x75, 0x06, 0xae, 0x18, - 0xc8, 0x60, 0xa8, 0x6d, 0xb7, 0x0d, 0xf1, 0xc8, 0x15, 0x03, 0xb2, 0x09, 0xf3, 0x03, 0xe6, 0xfb, - 0x34, 0xd2, 0xa7, 0xa7, 0xbf, 0x2c, 0x0e, 0xed, 0x72, 0x49, 0xec, 0xbd, 0x63, 0xb3, 0x1d, 0x68, - 0xc9, 0x1a, 0x59, 0xc9, 0x92, 0x9a, 0x92, 0x80, 0xaf, 0xe7, 0x3d, 0x00, 0xc5, 0x94, 0x8d, 0x20, - 0x15, 0x15, 0x2a, 0xf8, 0x9b, 0x51, 0x42, 0xad, 0x11, 0x2c, 0x96, 0x0a, 0x69, 0x15, 0x74, 0xa3, - 0x82, 0xae, 0x9b, 0xd1, 0xad, 0xba, 0x19, 0xe1, 0x36, 0xa0, 0xbb, 0x13, 0x29, 0x06, 0x38, 0xcc, - 0xd7, 0xe3, 0xb6, 0x0b, 0xe2, 0xb1, 0x6f, 0xfd, 0x12, 0x9a, 0xa6, 0x16, 0x47, 0x3e, 0x2d, 0x55, - 0xec, 0xd4, 0x13, 0xb8, 0x3a, 0x51, 0xb1, 0x2b, 0xca, 0x75, 0xd6, 0x7f, 0x36, 0x61, 0x41, 0x53, - 0xd1, 0xef, 0xe3, 0x03, 0x60, 0x5e, 0x36, 0xfc, 0x4d, 0xbe, 0xcc, 0x5b, 0x1a, 0xf9, 0x29, 0xd5, - 0x74, 0x46, 0xf0, 0xc4, 0x8c, 0x6e, 0xdd, 0xd7, 0x90, 0x87, 0xf8, 0x0c, 0x9a, 0x83, 0x58, 0xa4, - 0x52, 0x74, 0xb6, 0x5a, 0x50, 0x3d, 0xd2, 0x9c, 0x7c, 0x52, 0x06, 0x4a, 0x9e, 0xc3, 0xd2, 0x30, - 0xc6, 0x31, 0x79, 0xec, 0x86, 0x2c, 0xea, 0xeb, 0xde, 0x55, 0xa9, 0xd0, 0xf5, 0x0e, 0xd9, 0xb6, - 0xe2, 0x1a, 0xf9, 0xf6, 0xb0, 0x44, 0x24, 0xdf, 0x40, 0x07, 0xf7, 0x28, 0x8e, 0xdc, 0xc0, 0x19, - 0xc4, 0xa9, 0x48, 0xe2, 0x54, 0x77, 0xa6, 0x4a, 0x57, 0xfd, 0x4c, 0x23, 0x8e, 0x14, 0xc0, 0x68, - 0x5a, 0x49, 0xc6, 0xe9, 0xe4, 0x0b, 0x68, 0x5d, 0xb9, 0x41, 0x90, 0xb8, 0x09, 0xe5, 0x3a, 0x04, - 0x2e, 0x15, 0x9b, 0xbe, 0x35, 0x2c, 0x23, 0x5f, 0x80, 0xc9, 0x5f, 0x41, 0x5b, 0x26, 0x9a, 0x66, - 0x25, 0x0b, 0xd5, 0x82, 0x0d, 0x66, 0x9b, 0x95, 0x85, 0x2c, 0xfa, 0x05, 0x0d, 0x87, 0x3e, 0x0f, - 0x32, 0x9a, 0xc6, 0x71, 0x3a, 0xd0, 0x1d, 0xa5, 0xd2, 0xd0, 0xcf, 0x0d, 0x2b, 0x1f, 0x3a, 0x07, - 0x93, 0xdf, 0xc1, 0xe6, 0x35, 0x85, 0xd0, 0x56, 0x35, 0xec, 0xae, 0x0d, 0x51, 0x8d, 0xca, 0x0d, - 0xb7, 0xb6, 0xfe, 0xf9, 0x25, 0x2c, 0x86, 0x7e, 0xe8, 0x98, 0x5c, 0x05, 0xaa, 0x37, 0xe3, 0xe4, - 0xf0, 0x44, 0xc7, 0xd5, 0xf9, 0xcd, 0x08, 0xfd, 0xd0, 0x84, 0xda, 0x14, 0xb6, 0x4d, 0xaf, 0x4b, - 0x36, 0xcb, 0x9c, 0x3e, 0x77, 0x3d, 0xea, 0x24, 0x94, 0xb3, 0xd8, 0xd7, 0xcd, 0xa7, 0x47, 0xa5, - 0x83, 0xd2, 0xd8, 0x57, 0xb1, 0x77, 0xf9, 0x6b, 0x44, 0x9e, 0x49, 0xa0, 0xd1, 0x7c, 0x27, 0xa9, - 0xe7, 0x93, 0xef, 0x60, 0x33, 0x74, 0xbf, 0x67, 0x61, 0x16, 0x62, 0x2e, 0x2b, 0x1f, 0x36, 0xe9, - 0x35, 0x4d, 0x67, 0xea, 0x83, 0x72, 0x94, 0x29, 0x71, 0xb6, 0x86, 0xa1, 0xf3, 0xcc, 0x67, 0xbe, - 0x1e, 0xd6, 0x30, 0xc9, 0x5f, 0xc3, 0x86, 0xcf, 0xdc, 0x7e, 0x14, 0x8b, 0x94, 0x79, 0x8e, 0xc8, - 0xce, 0x43, 0x26, 0x64, 0xb4, 0xb2, 0x54, 0xd5, 0x7d, 0x98, 0xc3, 0x7a, 0x39, 0x2a, 0xd7, 0xed, - 0xd7, 0x30, 0xd1, 0x04, 0xdc, 0x24, 0x71, 0xdc, 0xc8, 0x0d, 0x46, 0x29, 0xf3, 0x84, 0xee, 0x5e, - 0x8d, 0x37, 0x63, 0xf6, 0x0d, 0x37, 0x37, 0x01, 0xb7, 0x44, 0x24, 0x17, 0xb0, 0x75, 0x7d, 0x09, - 0x7e, 0xa5, 0x9a, 0xc8, 0x5d, 0x97, 0xc9, 0x18, 0xdd, 0x5d, 0xf7, 0xba, 0x54, 0xe7, 0x09, 0xac, - 0xd5, 0xd8, 0x23, 0x26, 0xe0, 0xaa, 0x23, 0xe6, 0xeb, 0x28, 0xc0, 0x7c, 0x5a, 0x4f, 0x61, 0xb3, - 0xde, 0xf2, 0xa6, 0xc8, 0xfc, 0x25, 0x74, 0xaa, 0x76, 0x86, 0x81, 0x27, 0x0b, 0x4d, 0x82, 0xdf, - 0xb6, 0xd5, 0x07, 0x52, 0xaf, 0x06, 0x94, 0x9b, 0x48, 0x5c, 0x7d, 0x58, 0x8f, 0x81, 0x4c, 0x9a, - 0xda, 0x94, 0xf1, 0x3e, 0x81, 0x4e, 0xd5, 0xb8, 0xa6, 0xa0, 0xff, 0xb1, 0x01, 0x77, 0xa7, 0x19, - 0xd1, 0x8d, 0x41, 0xe9, 0xbb, 0x6b, 0x8d, 0x55, 0xb9, 0xdc, 0xbd, 0x1b, 0x8c, 0xf5, 0x1a, 0x2b, - 0xb5, 0xfe, 0xae, 0x01, 0x7b, 0x37, 0x9c, 0xec, 0x8d, 0x73, 0x7b, 0x0e, 0xf7, 0xc6, 0xee, 0x8e, - 0xe3, 0xab, 0xba, 0x0f, 0x86, 0x22, 0x79, 0xfe, 0xd4, 0xb6, 0x77, 0xc6, 0x40, 0x87, 0x39, 0x06, - 0xb7, 0xdd, 0x7a, 0x0a, 0x1b, 0xf5, 0x6d, 0x94, 0x2d, 0x68, 0x0e, 0x93, 0xa8, 0xfc, 0xc7, 0x8d, - 0x85, 0x61, 0x12, 0xbd, 0xcd, 0x98, 0x6f, 0x7d, 0x6e, 0xea, 0x91, 0xa5, 0xe7, 0x85, 0xec, 0x8d, - 0x3f, 0x48, 0x7a, 0xb6, 0xc5, 0x9b, 0x63, 0x7d, 0x0a, 0x2b, 0x95, 0x97, 0x05, 0x93, 0x97, 0xfc, - 0x19, 0xd2, 0xf5, 0x25, 0xf3, 0x6d, 0xfd, 0x06, 0x56, 0x27, 0x3c, 0x15, 0x79, 0x36, 0xee, 0xdb, - 0x1a, 0xd5, 0xce, 0x71, 0x21, 0x51, 0x76, 0x6a, 0x96, 0x0f, 0x50, 0x70, 0xc8, 0x3b, 0x78, 0x24, - 0x2b, 0xf9, 0xba, 0xf3, 0x89, 0x4e, 0x4e, 0xd6, 0x0a, 0xa9, 0xef, 0x5c, 0x0d, 0x58, 0x40, 0x1d, - 0x91, 0x25, 0x94, 0x0f, 0x99, 0xc8, 0xaf, 0xd3, 0x4f, 0x0a, 0x3c, 0x3a, 0xb2, 0x7d, 0x85, 0xfe, - 0x16, 0xc1, 0xbd, 0x1c, 0x6b, 0xfd, 0x0e, 0x76, 0xa7, 0xbb, 0x43, 0xcc, 0xf3, 0xa7, 0x38, 0x57, - 0x15, 0xf9, 0x5c, 0xe7, 0x32, 0xad, 0x1e, 0xec, 0x4c, 0x71, 0x85, 0xe4, 0xf3, 0x6b, 0x3d, 0xaa, - 0xd2, 0x5b, 0xeb, 0x2a, 0xad, 0x5f, 0xc0, 0xce, 0x14, 0x1f, 0x38, 0xc5, 0xb0, 0x9e, 0xc8, 0x1c, - 0xaf, 0xea, 0xe8, 0xa6, 0x08, 0x1c, 0xc0, 0xde, 0x0d, 0xcd, 0xc4, 0xf7, 0xc8, 0x7a, 0xbe, 0x86, - 0xbb, 0xd3, 0x7a, 0x83, 0xef, 0xa1, 0xa1, 0x0f, 0xdb, 0xd7, 0xf7, 0xfb, 0xde, 0xa3, 0x6e, 0xff, - 0x21, 0xac, 0xe8, 0xff, 0x2e, 0xe4, 0x0d, 0x45, 0x95, 0xf6, 0x2c, 0x2b, 0xb2, 0x51, 0x65, 0xfd, - 0x6d, 0x03, 0xd6, 0x6a, 0xda, 0x7e, 0xe4, 0x23, 0xe8, 0x78, 0x19, 0xe7, 0x78, 0x3c, 0x79, 0xe5, - 0x57, 0x57, 0x9b, 0x35, 0x3d, 0x87, 0x3e, 0x80, 0x76, 0x44, 0xaf, 0x0a, 0x98, 0xae, 0x1c, 0x45, - 0xf4, 0x2a, 0x87, 0xec, 0xc1, 0xa2, 0xaa, 0x83, 0xc7, 0x3c, 0x0e, 0x85, 0xae, 0x7e, 0x83, 0x24, - 0x9d, 0x22, 0xc5, 0xfa, 0x1c, 0x36, 0xeb, 0x9b, 0x84, 0x63, 0xa5, 0xe7, 0x46, 0xa5, 0xf4, 0x7c, - 0x0a, 0xeb, 0x75, 0xdd, 0x3f, 0x8c, 0x44, 0xfb, 0xa5, 0x3e, 0x08, 0xfe, 0x9e, 0x4c, 0x08, 0x6e, - 0x4d, 0x26, 0x04, 0xf8, 0x4a, 0x54, 0x3b, 0x75, 0xe4, 0x63, 0x58, 0x50, 0xad, 0x3d, 0x13, 0x10, - 0x77, 0x4a, 0xff, 0x24, 0x91, 0x0c, 0xdb, 0x00, 0xac, 0x11, 0xcc, 0x6b, 0xa9, 0x3d, 0x58, 0x4c, - 0x78, 0xec, 0x67, 0x9e, 0x6a, 0xb4, 0x69, 0x3f, 0xa3, 0x49, 0xdf, 0xd0, 0x91, 0x2c, 0x16, 0x6a, - 0xc0, 0x78, 0x95, 0x62, 0x59, 0x93, 0x4d, 0xe9, 0x45, 0xe6, 0xe8, 0xfa, 0x7f, 0x20, 0xd2, 0x27, - 0xea, 0x18, 0xde, 0x34, 0xf5, 0xf7, 0x25, 0xd1, 0xfa, 0x04, 0xd6, 0xeb, 0x9a, 0x8c, 0xf8, 0x9c, - 0xc9, 0x52, 0xb7, 0xbe, 0xe8, 0xea, 0xc3, 0x7a, 0x05, 0x64, 0xb2, 0x79, 0x48, 0x7e, 0x0e, 0x77, - 0x2e, 0x58, 0x90, 0x52, 0x5e, 0x74, 0x1d, 0x9d, 0x24, 0x66, 0x51, 0x6a, 0xee, 0xd8, 0x86, 0x62, - 0xe7, 0x22, 0x67, 0x92, 0x69, 0xfd, 0xa9, 0x01, 0x64, 0xb2, 0x73, 0x88, 0xbe, 0xf9, 0x92, 0x8e, - 0xca, 0x19, 0xcc, 0xc2, 0x25, 0x1d, 0xc9, 0xfc, 0xe5, 0x10, 0x3a, 0x45, 0x27, 0x52, 0x75, 0x78, - 0xf4, 0x4b, 0x55, 0x8a, 0xf0, 0x73, 0x65, 0xaa, 0x39, 0x60, 0xaf, 0xe4, 0x22, 0x8a, 0x80, 0x7b, - 0x88, 0x37, 0xcf, 0xa3, 0x1c, 0xef, 0xbd, 0xe7, 0xea, 0x6a, 0x7b, 0xdb, 0x5e, 0x8e, 0xe8, 0xd5, - 0x41, 0x41, 0x25, 0x5f, 0xc3, 0x5d, 0x4e, 0x93, 0x60, 0xe4, 0xd0, 0xc8, 0xe3, 0x23, 0x5d, 0xb9, - 0x29, 0x49, 0xcd, 0x49, 0xa9, 0x6d, 0x89, 0x79, 0x91, 0x43, 0x4a, 0x1a, 0xac, 0x7f, 0x6e, 0xc0, - 0x4a, 0x65, 0x3e, 0xd3, 0xae, 0xa6, 0x6a, 0x15, 0xa1, 0x33, 0xa6, 0x78, 0xfe, 0x0e, 0xfd, 0x3e, - 0x89, 0x79, 0xaa, 0xef, 0x5c, 0x47, 0x73, 0xbe, 0xa1, 0xa3, 0x17, 0x92, 0x4e, 0xbe, 0x82, 0x9d, - 0x49, 0x74, 0x61, 0x51, 0xea, 0xc0, 0xbb, 0x55, 0x31, 0x73, 0xdf, 0xad, 0x2f, 0x61, 0x75, 0xa2, - 0xef, 0x89, 0x9b, 0x53, 0xed, 0x96, 0xaa, 0x49, 0x2e, 0x9f, 0x8f, 0x01, 0xad, 0xff, 0x6e, 0xc0, - 0x92, 0x4d, 0x45, 0x16, 0xa4, 0xe6, 0x1f, 0x91, 0x04, 0xe6, 0x32, 0xbf, 0xd4, 0x47, 0xf4, 0xd9, - 0xe4, 0xbf, 0x24, 0x6f, 0x4d, 0xfe, 0x4b, 0xf2, 0x19, 0x2c, 0x52, 0xce, 0x63, 0xee, 0x78, 0x03, - 0x97, 0x45, 0x93, 0xa5, 0xc2, 0x17, 0xc8, 0x3c, 0x40, 0x9e, 0x0d, 0x34, 0xff, 0x6d, 0xf5, 0x60, - 0xbe, 0x97, 0xba, 0x69, 0x26, 0x48, 0x07, 0xda, 0xfb, 0xde, 0x65, 0x14, 0x5f, 0x05, 0xd4, 0xef, - 0x53, 0xbf, 0x33, 0x43, 0x5a, 0x70, 0x5b, 0x4a, 0x75, 0x1a, 0x64, 0x13, 0x88, 0xfe, 0x57, 0xe5, - 0x4b, 0xd9, 0x5d, 0x54, 0xf4, 0x5b, 0xa4, 0x09, 0x73, 0xc7, 0x7e, 0x40, 0x3b, 0xb3, 0x04, 0x60, - 0xfe, 0x75, 0x9c, 0xbe, 0x8e, 0xaf, 0x3a, 0x73, 0xd6, 0xbf, 0x37, 0x00, 0x8a, 0xf1, 0xc8, 0x67, - 0xb0, 0x11, 0xc4, 0x9e, 0x1b, 0xb0, 0x1f, 0xa8, 0xef, 0xf8, 0x54, 0x78, 0x9c, 0x25, 0x79, 0x81, - 0xa9, 0x65, 0xaf, 0xe7, 0xcc, 0xc3, 0x82, 0x87, 0x6f, 0x55, 0x26, 0x1c, 0x1a, 0xf5, 0x03, 0x26, - 0x06, 0x63, 0x52, 0x6a, 0xf1, 0xeb, 0x99, 0x78, 0xa1, 0x98, 0x65, 0xa9, 0x07, 0xd0, 0x56, 0xbb, - 0xe0, 0xc7, 0xa1, 0xda, 0x06, 0xb9, 0x51, 0x92, 0x76, 0x28, 0x49, 0x98, 0xdc, 0xeb, 0x8d, 0x8a, - 0x7d, 0x75, 0xf9, 0x6e, 0xdb, 0x2d, 0xb5, 0x23, 0xb1, 0x4f, 0x9f, 0x77, 0xfe, 0xeb, 0xc7, 0xdd, - 0xc6, 0x1f, 0x7f, 0xdc, 0x6d, 0xfc, 0xe9, 0xc7, 0xdd, 0xc6, 0x3f, 0xfd, 0xcf, 0xee, 0xcc, 0xf9, - 0xbc, 0xdc, 0xc0, 0xcf, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xfc, 0x7e, 0x95, 0xd2, 0x2a, - 0x00, 0x00, + // 3797 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x73, 0x1b, 0x47, + 0x76, 0x27, 0x48, 0x8a, 0x04, 0x1e, 0x40, 0x12, 0x6c, 0x7e, 0x08, 0x24, 0x25, 0x52, 0x1a, 0xd9, + 0x6b, 0xd9, 0x6b, 0x4b, 0x89, 0x6c, 0x79, 0xbd, 0xbb, 0x76, 0x62, 0x8a, 0x94, 0x96, 0x5c, 0x8b, + 0x22, 0x6b, 0x20, 0xc9, 0x55, 0x71, 0x36, 0xb3, 0x43, 0x4c, 0x13, 0xe8, 0xe2, 0x7c, 0x6d, 0xf7, + 0x0c, 0x68, 0xf8, 0x9c, 0x54, 0xce, 0xb9, 0x24, 0xa9, 0x5c, 0x72, 0x4f, 0xe5, 0x1f, 0x48, 0x6e, + 0xb9, 0xe5, 0x98, 0xca, 0x5f, 0xe0, 0x72, 0xfe, 0x85, 0x5c, 0x72, 0x4b, 0xbd, 0xfe, 0x98, 0x19, + 0x0c, 0x86, 0xa0, 0x2e, 0x7b, 0x43, 0xbf, 0xf7, 0xeb, 0xd7, 0x3d, 0xaf, 0xbb, 0xdf, 0x27, 0xa0, + 0x11, 0x78, 0xc1, 0xa3, 0x98, 0x47, 0x49, 0x44, 0xea, 0x81, 0x17, 0xc8, 0x5f, 0xd6, 0xef, 0x61, + 0xf9, 0x20, 0x0a, 0x02, 0x37, 0xf4, 0xce, 0xdc, 0x91, 0x1f, 0xb9, 0x1e, 0xb9, 0x0f, 0xad, 0x9e, + 0xa2, 0x38, 0x69, 0xca, 0xbc, 0x4e, 0xed, 0x5e, 0xed, 0x61, 0xc3, 0x6e, 0x6a, 0xda, 0x9b, 0x94, + 0x79, 0xe4, 0xe7, 0xb0, 0xa8, 0x87, 0x9d, 0xd9, 0x7b, 0xb5, 0x87, 0xcd, 0x27, 0xab, 0x8f, 0x8c, + 0xc0, 0x47, 0x5a, 0x9a, 0x6d, 0x10, 0xd6, 0xbf, 0xde, 0x86, 0x45, 0x4d, 0x44, 0xd9, 0x9c, 0xfe, + 0x21, 0xa5, 0x22, 0x71, 0x92, 0x51, 0x4c, 0x8d, 0x6c, 0x4d, 0x7b, 0x3d, 0x8a, 0x29, 0x39, 0x80, + 0x15, 0x16, 0x8a, 0xc4, 0xf5, 0x7d, 0x27, 0xe6, 0xd1, 0x05, 0xf3, 0xa9, 0x5e, 0xa3, 0x93, 0xaf, + 0x71, 0xac, 0x00, 0x67, 0x8a, 0x7f, 0x34, 0x63, 0x2f, 0xb3, 0x31, 0x0a, 0xf9, 0x1a, 0x96, 0x39, + 0x0d, 0xa2, 0x21, 0xcd, 0x64, 0xcc, 0x49, 0x19, 0xb7, 0x73, 0x19, 0xb6, 0xe4, 0xe7, 0x22, 0x96, + 0x78, 0x91, 0x40, 0x06, 0x70, 0xa7, 0xb0, 0x8d, 0x21, 0x13, 0x2c, 0x0a, 0x59, 0xd8, 0xcf, 0xe4, + 0xcd, 0x4b, 0x79, 0xef, 0x55, 0xed, 0x29, 0x03, 0xe7, 0xc2, 0xb7, 0xd9, 0xb5, 0x5c, 0x42, 0x61, + 0xa7, 0xb8, 0xd7, 0xf2, 0x42, 0xb7, 0xe4, 0x42, 0x0f, 0x2a, 0x36, 0x5e, 0xb1, 0xce, 0x56, 0xe1, + 0x23, 0x4a, 0xcb, 0x9c, 0x83, 0xd9, 0x04, 0xf5, 0x1c, 0x37, 0x8e, 0x7d, 0xd6, 0x73, 0x13, 0x16, + 0x85, 0x8e, 0xcf, 0x44, 0xd2, 0x59, 0x90, 0xab, 0x58, 0x13, 0x9f, 0x43, 0xbd, 0xfd, 0x1c, 0xfa, + 0x92, 0x89, 0xe4, 0x68, 0xc6, 0xee, 0xb0, 0x6b, 0x78, 0xe4, 0x25, 0x10, 0x8f, 0x0e, 0x59, 0x8f, + 0x3a, 0x2c, 0xbc, 0x88, 0x78, 0x20, 0x39, 0x9d, 0x45, 0x29, 0x7b, 0x27, 0x97, 0x7d, 0x28, 0x31, + 0xc7, 0x39, 0xe4, 0x68, 0xc6, 0x5e, 0xf5, 0xca, 0x44, 0xf2, 0x0b, 0x68, 0x6a, 0x69, 0x7e, 0xd4, + 0xbb, 0xec, 0xd4, 0xa5, 0x98, 0xf5, 0xb2, 0x98, 0x97, 0x51, 0xef, 0xf2, 0x68, 0xc6, 0x06, 0x2f, + 0x1b, 0xe1, 0xe9, 0xf7, 0x7c, 0xea, 0x72, 0x27, 0x76, 0x85, 0xe8, 0x45, 0x1e, 0xed, 0x34, 0xca, + 0xa7, 0x7f, 0x80, 0xfc, 0x33, 0xcd, 0xc6, 0xd3, 0xef, 0x15, 0x09, 0xe4, 0x57, 0xd0, 0xa2, 0xdc, + 0x15, 0xd4, 0x51, 0x52, 0x3b, 0x20, 0xe7, 0x6f, 0xe4, 0xf3, 0x9f, 0x23, 0x57, 0x6d, 0xe0, 0x68, + 0xc6, 0x6e, 0xd2, 0x7c, 0x48, 0x8e, 0x61, 0xd5, 0xdc, 0xf1, 0x80, 0x71, 0x1e, 0x71, 0x16, 0xf6, + 0x3b, 0x4d, 0x29, 0x60, 0xbb, 0x78, 0x8a, 0x12, 0x72, 0x62, 0x10, 0x47, 0x33, 0x76, 0x9b, 0x97, + 0x68, 0xe4, 0x4b, 0x7c, 0x2e, 0x22, 0xe1, 0xac, 0x87, 0x0a, 0x11, 0x9d, 0x96, 0x94, 0xb2, 0x59, + 0x94, 0x92, 0x73, 0x8f, 0x66, 0xec, 0x31, 0x34, 0x39, 0x81, 0xb5, 0x34, 0x44, 0xd5, 0x39, 0xa9, + 0xa0, 0xdc, 0x71, 0x7b, 0xbd, 0x28, 0x0d, 0x93, 0xce, 0x52, 0xf9, 0x38, 0xde, 0x48, 0xd0, 0x1b, + 0x41, 0xf9, 0xbe, 0x82, 0xe0, 0x71, 0xa4, 0x65, 0xa2, 0x3a, 0x0e, 0x9f, 0x26, 0x54, 0x8a, 0xeb, + 0x2c, 0x4f, 0x1e, 0x07, 0x32, 0x71, 0x86, 0x3a, 0x0e, 0x33, 0x22, 0x87, 0xd0, 0xa6, 0xa1, 0x7b, + 0xee, 0xe3, 0x39, 0xa2, 0x52, 0xf0, 0x40, 0x56, 0xca, 0x4f, 0xfa, 0xb9, 0x44, 0xbc, 0x8c, 0x44, + 0x72, 0xa2, 0x4e, 0x64, 0x99, 0x8e, 0x51, 0xc8, 0x29, 0xac, 0x99, 0x07, 0x59, 0xb8, 0xbd, 0x9d, + 0xb6, 0x14, 0x74, 0x67, 0xe2, 0xe2, 0x16, 0xae, 0xe6, 0xd1, 0x8c, 0x4d, 0xd8, 0x04, 0x95, 0xbc, + 0x81, 0x0d, 0xad, 0x12, 0xa7, 0x17, 0x85, 0x17, 0xac, 0x9f, 0x72, 0x25, 0x72, 0x55, 0x8a, 0xdc, + 0xcd, 0x45, 0x6a, 0x0d, 0x1c, 0x14, 0x51, 0x47, 0x33, 0xf6, 0xba, 0x5b, 0x41, 0x27, 0x5d, 0xd8, + 0xc0, 0xfd, 0x8d, 0x1c, 0x4e, 0x3d, 0x1a, 0xc4, 0xf2, 0x89, 0xc9, 0x3b, 0x48, 0xa4, 0xd8, 0xbb, + 0x05, 0xb1, 0x08, 0xb3, 0x33, 0xd4, 0x81, 0xfa, 0xee, 0x35, 0x77, 0x92, 0x4c, 0xfe, 0x12, 0x3a, + 0x81, 0x1b, 0xba, 0xfd, 0xaa, 0xa7, 0xbb, 0x26, 0xe5, 0xde, 0xcb, 0xe5, 0x9e, 0x28, 0xe4, 0xe4, + 0xc3, 0xdd, 0x0c, 0x2a, 0x39, 0xf8, 0x6c, 0xb5, 0x05, 0x2a, 0x6a, 0x76, 0xbd, 0x7c, 0x4f, 0x94, + 0xe1, 0x19, 0x57, 0xec, 0x2a, 0x2f, 0x13, 0xc9, 0x6f, 0x60, 0x95, 0x85, 0x43, 0x96, 0x50, 0x27, + 0x89, 0xd0, 0x8a, 0xf5, 0xb9, 0x1b, 0x74, 0x36, 0xa4, 0xb0, 0xad, 0xe2, 0x31, 0x21, 0xe4, 0x75, + 0x74, 0xa6, 0x00, 0x47, 0x33, 0xf6, 0x0a, 0x1b, 0x27, 0xe1, 0x01, 0x0d, 0x5d, 0x9f, 0x79, 0x6e, + 0xe2, 0x16, 0x37, 0x26, 0x3a, 0x9b, 0xe5, 0x03, 0x7a, 0xab, 0x60, 0xc5, 0x6d, 0xe0, 0x73, 0x58, + 0x37, 0xd3, 0x8b, 0x74, 0xf2, 0x15, 0x2c, 0x99, 0x8b, 0x14, 0x50, 0x8f, 0xb9, 0x9d, 0xdb, 0xe5, + 0x57, 0xa5, 0xaf, 0xd0, 0x09, 0x72, 0xf1, 0x55, 0xb1, 0xc2, 0x18, 0x4d, 0x83, 0x56, 0x96, 0x9a, + 0xdd, 0x29, 0x9b, 0x06, 0xa5, 0x26, 0x33, 0xb9, 0xc9, 0xf3, 0x21, 0xf9, 0x13, 0xa8, 0x0b, 0x9a, + 0x24, 0x2c, 0xec, 0x8b, 0xce, 0x96, 0x9c, 0x47, 0xf2, 0x79, 0x5d, 0xcd, 0x39, 0x9a, 0xb1, 0x33, + 0x14, 0xb9, 0x82, 0xfb, 0x55, 0x07, 0x3f, 0x7e, 0x61, 0xb7, 0xa5, 0xa8, 0x0f, 0xa7, 0xdd, 0x80, + 0xf2, 0xdd, 0xdd, 0x0b, 0xa6, 0x43, 0x48, 0x08, 0xbb, 0x55, 0x0b, 0xbb, 0x49, 0xc2, 0xd9, 0x79, + 0x9a, 0x50, 0xd1, 0xd9, 0x91, 0xab, 0xfe, 0x6c, 0xda, 0xaa, 0xfb, 0x19, 0xfa, 0x68, 0xc6, 0xbe, + 0x13, 0x4c, 0xe1, 0xa3, 0xbf, 0xad, 0x5a, 0xef, 0x82, 0x52, 0xef, 0xdc, 0xed, 0x5d, 0x76, 0xee, + 0x94, 0xfd, 0xed, 0xe4, 0x6a, 0x2f, 0x34, 0x16, 0xfd, 0x6d, 0x70, 0x2d, 0x17, 0x1f, 0xa8, 0xa0, + 0x89, 0x73, 0xc1, 0x78, 0x70, 0xe5, 0x72, 0x2a, 0x9d, 0xc4, 0x55, 0xc4, 0xbd, 0xce, 0xdd, 0xf2, + 0x03, 0xed, 0xd2, 0xe4, 0x85, 0x46, 0x9d, 0x69, 0x10, 0x3e, 0x50, 0x31, 0x49, 0xc6, 0x07, 0x3a, + 0xa4, 0x9c, 0x5d, 0x8c, 0x2a, 0xe4, 0xee, 0x96, 0x1f, 0xe8, 0x5b, 0x89, 0xac, 0x10, 0xbd, 0x39, + 0xac, 0xe4, 0x90, 0x6f, 0xe1, 0x36, 0x6e, 0xd9, 0x4d, 0x93, 0xc8, 0x71, 0xbd, 0x80, 0x85, 0xb9, + 0xf0, 0xbd, 0xf2, 0x5b, 0xe8, 0xd2, 0x64, 0x3f, 0x4d, 0xa2, 0x7d, 0x84, 0x15, 0x44, 0xaf, 0x8b, + 0x0a, 0x3a, 0xf9, 0x2d, 0x10, 0xd1, 0x1b, 0x50, 0x2f, 0xf5, 0xa9, 0x13, 0x09, 0x27, 0x8d, 0xf1, + 0x15, 0x75, 0xee, 0x95, 0x9d, 0x55, 0x57, 0x63, 0x4e, 0xbb, 0x6f, 0x24, 0x02, 0x9d, 0x95, 0x99, + 0x77, 0x2a, 0x14, 0x4d, 0x6e, 0x72, 0x42, 0x96, 0x23, 0x7a, 0x6e, 0xd8, 0xb9, 0x3f, 0xb1, 0xc9, + 0x92, 0xc0, 0x6e, 0xcf, 0x95, 0x16, 0xb5, 0x2c, 0x14, 0xe9, 0xe4, 0x0c, 0xd6, 0xdd, 0x5e, 0xc2, + 0x86, 0xd4, 0x09, 0x85, 0x43, 0xbf, 0x4f, 0x68, 0x28, 0xa4, 0x19, 0xb0, 0xca, 0xa6, 0x7f, 0x5f, + 0xa2, 0x5e, 0x75, 0x9f, 0x67, 0x18, 0x34, 0xfd, 0x6a, 0xee, 0x2b, 0x91, 0x53, 0x51, 0x22, 0x8f, + 0x12, 0xdc, 0x1e, 0x86, 0x46, 0x43, 0x37, 0xf5, 0x13, 0xe7, 0x92, 0x8e, 0x3a, 0x0f, 0xca, 0x12, + 0x6d, 0x89, 0x7a, 0xc1, 0x7c, 0xfa, 0x16, 0x41, 0xdf, 0xd0, 0x11, 0x4a, 0xe4, 0x19, 0x75, 0xa8, + 0xa9, 0xf8, 0x5c, 0x8c, 0x51, 0xa1, 0x61, 0x42, 0x79, 0xcc, 0x99, 0x18, 0x37, 0xa7, 0xef, 0x95, + 0x9f, 0x8b, 0xb6, 0x32, 0xcf, 0x33, 0xf8, 0xb8, 0x65, 0x35, 0xe1, 0x67, 0x25, 0x1f, 0x7d, 0x3b, + 0xde, 0x88, 0xf3, 0x28, 0x4a, 0x44, 0xc2, 0xdd, 0xd8, 0x49, 0xa2, 0x4b, 0x1a, 0x76, 0xde, 0x2f, + 0xdb, 0xec, 0x2e, 0x4d, 0x9e, 0x19, 0xcc, 0x6b, 0x84, 0xa0, 0xcd, 0x16, 0x65, 0xe2, 0xb3, 0x06, + 0x2c, 0xea, 0xe0, 0xc3, 0xfa, 0x08, 0x96, 0xc7, 0xc3, 0x6b, 0xd2, 0x81, 0xc5, 0x58, 0xe5, 0x06, + 0x32, 0x5e, 0x6f, 0xd9, 0x66, 0x68, 0x3d, 0x86, 0xa5, 0xb1, 0x30, 0x9a, 0xec, 0x02, 0x30, 0x8f, + 0x86, 0x09, 0xbb, 0x60, 0x94, 0xeb, 0xe8, 0xbe, 0x40, 0xb1, 0x4e, 0x61, 0xfb, 0xfa, 0x38, 0x99, + 0xfc, 0x29, 0xac, 0x57, 0xc6, 0xda, 0x6a, 0xd5, 0xb5, 0x78, 0x72, 0x8a, 0xf5, 0x18, 0xb6, 0xae, + 0x8d, 0x87, 0x09, 0x81, 0xf9, 0x42, 0x06, 0x23, 0x7f, 0x5b, 0x03, 0xe8, 0x5c, 0x17, 0xda, 0x92, + 0x7b, 0xd0, 0xcc, 0xf7, 0x2a, 0x3a, 0xb5, 0x7b, 0x73, 0x98, 0x9c, 0x14, 0x48, 0xe4, 0x23, 0x58, + 0x2d, 0x58, 0x29, 0xe1, 0x44, 0xa1, 0x3f, 0x92, 0xe9, 0x49, 0xdd, 0x5e, 0xc9, 0x4d, 0x8e, 0x38, + 0x0d, 0xfd, 0x91, 0xf5, 0x09, 0xac, 0x4e, 0x04, 0xba, 0xa8, 0xcb, 0x3f, 0xa4, 0x94, 0x33, 0x6a, + 0xc4, 0x9b, 0xa1, 0xf5, 0x04, 0x96, 0xc6, 0x82, 0x52, 0xcc, 0x95, 0x74, 0xf8, 0xa6, 0xce, 0x56, + 0x69, 0xa1, 0xa9, 0x68, 0xf2, 0xd8, 0xac, 0xef, 0x00, 0xf2, 0x20, 0x98, 0xb4, 0x61, 0x2e, 0x66, + 0xa1, 0xfe, 0x5a, 0xfc, 0x89, 0xab, 0x05, 0x54, 0x08, 0xb7, 0xaf, 0x72, 0xa8, 0x86, 0x6d, 0x86, + 0x28, 0x3c, 0x1e, 0x44, 0x21, 0x75, 0xc2, 0x34, 0x38, 0xa7, 0x5c, 0xa6, 0x47, 0x0d, 0xbb, 0x29, + 0x69, 0xaf, 0x24, 0xc9, 0xfa, 0xdb, 0x1a, 0x34, 0x0b, 0x61, 0x6e, 0x85, 0xf8, 0x8f, 0x81, 0xc4, + 0x9c, 0x0a, 0xca, 0x87, 0xd4, 0x91, 0x5e, 0x3a, 0xf6, 0xdd, 0x50, 0xab, 0xa3, 0x6d, 0x38, 0x87, + 0x6e, 0xe2, 0x9e, 0xf9, 0x6e, 0x48, 0xbe, 0x80, 0x8e, 0xc7, 0x84, 0xeb, 0xfb, 0xd1, 0x15, 0x9e, + 0xec, 0xf7, 0x2c, 0x60, 0xc9, 0xc8, 0x11, 0x34, 0x49, 0x63, 0xb9, 0x7c, 0xdd, 0xde, 0x34, 0xfc, + 0x33, 0xc3, 0xee, 0x22, 0xd7, 0xfa, 0x97, 0x1a, 0xb4, 0xcb, 0xf1, 0x32, 0xf9, 0x10, 0xda, 0x1e, + 0x15, 0x09, 0x0b, 0x95, 0xa3, 0x08, 0xdd, 0xc0, 0xa4, 0x93, 0x2b, 0x05, 0xfa, 0x2b, 0x37, 0xa0, + 0xe4, 0x09, 0x6c, 0x14, 0xa1, 0x26, 0x45, 0xf1, 0xb4, 0x52, 0xd6, 0x0a, 0x4c, 0x7d, 0x62, 0x1e, + 0xd9, 0x81, 0x06, 0x9a, 0x2e, 0x27, 0x61, 0x01, 0xd5, 0xda, 0xa9, 0x23, 0xe1, 0x35, 0x0b, 0x28, + 0xd9, 0x86, 0x7a, 0x66, 0x80, 0xe7, 0x15, 0xcf, 0x8c, 0xad, 0x7d, 0x68, 0x15, 0xa3, 0x72, 0x7d, + 0xa9, 0xf1, 0x3e, 0x3a, 0x63, 0xb1, 0x7c, 0x4d, 0x7e, 0xf2, 0x9a, 0xe6, 0x15, 0xa7, 0x58, 0x8f, + 0x61, 0x75, 0x22, 0x26, 0xc7, 0x35, 0x31, 0xee, 0x2e, 0x7c, 0x67, 0x36, 0xb6, 0x4e, 0xf1, 0x1e, + 0x64, 0xf1, 0xf6, 0x14, 0x24, 0x79, 0x1f, 0x96, 0x2f, 0x22, 0xde, 0xc3, 0xc4, 0xc6, 0xa7, 0xd2, + 0x2e, 0xa9, 0xe3, 0x5a, 0x92, 0xd4, 0x43, 0x4d, 0xb4, 0x18, 0x2c, 0x8f, 0x07, 0xe4, 0xc5, 0xab, + 0x54, 0x9b, 0x7e, 0x95, 0x66, 0x27, 0xae, 0x12, 0xee, 0xe8, 0x22, 0x8a, 0x92, 0x30, 0x4a, 0x32, + 0x5d, 0x9a, 0xb1, 0xf5, 0xef, 0x73, 0x40, 0x26, 0x63, 0x76, 0xf2, 0x33, 0x58, 0x61, 0x49, 0x1a, + 0x52, 0xe1, 0x88, 0x24, 0xe2, 0xf2, 0xb4, 0x70, 0xdd, 0x39, 0x7b, 0x49, 0x91, 0xbb, 0x48, 0x3d, + 0xf6, 0x4a, 0x16, 0x67, 0xb6, 0x6c, 0x71, 0xc8, 0x57, 0xb0, 0x18, 0xc5, 0x4a, 0xe3, 0x73, 0xe5, + 0x4c, 0x7a, 0x72, 0xd9, 0x53, 0x05, 0xb5, 0xcd, 0x1c, 0xfc, 0xb8, 0xc0, 0x0d, 0xd9, 0x05, 0x66, + 0x73, 0x29, 0xf7, 0xf5, 0x69, 0x37, 0x0d, 0xed, 0x0d, 0xf7, 0xf1, 0x22, 0xaa, 0xa7, 0x1f, 0xd0, + 0x30, 0x71, 0x2e, 0x7c, 0xb7, 0x2f, 0x64, 0xd2, 0x3e, 0x67, 0x4c, 0x02, 0xd2, 0x5f, 0x20, 0x99, + 0x9c, 0xc2, 0xd2, 0x78, 0xe4, 0xb6, 0x50, 0x8e, 0xdc, 0x26, 0xb7, 0x34, 0x16, 0x96, 0xd9, 0xe3, + 0xf3, 0xc9, 0x0b, 0x80, 0x42, 0x44, 0xb6, 0x78, 0x8d, 0x8b, 0xa9, 0x8c, 0xb8, 0xec, 0xc2, 0x4c, + 0xf2, 0x39, 0xdc, 0xee, 0x0d, 0xdc, 0xb0, 0x4f, 0x9d, 0xc2, 0xa7, 0x08, 0xf4, 0x72, 0x32, 0xed, + 0x6e, 0xd8, 0x1b, 0x8a, 0x7d, 0x92, 0x71, 0xbb, 0xc8, 0xb4, 0x0e, 0x61, 0xeb, 0x5a, 0x25, 0x92, + 0x0f, 0x60, 0x25, 0x4e, 0x79, 0x6f, 0x80, 0x79, 0x74, 0x40, 0x93, 0x41, 0x64, 0x8e, 0x70, 0xd9, + 0x90, 0x4f, 0x24, 0xd5, 0xba, 0x0f, 0x7b, 0x37, 0x7c, 0xb7, 0xb5, 0x0b, 0x77, 0xa6, 0x7d, 0x8c, + 0xf5, 0x7f, 0xb5, 0x0c, 0x50, 0xed, 0x30, 0x1f, 0x41, 0xdd, 0x1c, 0x9a, 0xdc, 0xc5, 0x58, 0xe8, + 0x7d, 0xa2, 0x39, 0x76, 0x86, 0x99, 0x38, 0xf8, 0xd9, 0xc9, 0x83, 0xff, 0x35, 0x6c, 0x17, 0x21, + 0x4e, 0xcc, 0x42, 0xe9, 0xb6, 0x7a, 0x94, 0x27, 0x78, 0xdb, 0xe6, 0x1e, 0xb6, 0xec, 0xdb, 0x85, + 0x09, 0x67, 0x8a, 0x7f, 0x80, 0x6c, 0x72, 0x0c, 0xf7, 0x0d, 0x9e, 0xd3, 0x61, 0x64, 0xe2, 0xfa, + 0x01, 0xed, 0x5d, 0x3a, 0xe8, 0x8a, 0x19, 0xa7, 0xca, 0xb6, 0xd4, 0xed, 0x5d, 0x0d, 0xb4, 0x33, + 0xdc, 0x01, 0xc2, 0x6c, 0x8d, 0xb2, 0x8e, 0xa1, 0x6e, 0x3e, 0x80, 0x7c, 0x05, 0xcb, 0xd9, 0x9e, + 0x58, 0x42, 0x03, 0xe5, 0x66, 0xc6, 0xb2, 0x1b, 0x83, 0x3d, 0x4e, 0x68, 0x60, 0x2f, 0x05, 0x85, + 0x91, 0xb0, 0xfa, 0xd0, 0x2a, 0xb2, 0xc9, 0x07, 0xb0, 0xe0, 0x0a, 0x41, 0x13, 0x23, 0x66, 0xa5, + 0x10, 0x6c, 0x21, 0xdd, 0xd6, 0x6c, 0xa9, 0x5e, 0x9a, 0xb8, 0xe8, 0x05, 0x74, 0xb9, 0xae, 0xa8, + 0x5e, 0xcd, 0xb1, 0x33, 0x8c, 0xf5, 0x0f, 0x35, 0xb8, 0x25, 0x25, 0xa0, 0x93, 0xbe, 0x64, 0x61, + 0xe6, 0xa4, 0xf1, 0x37, 0xd9, 0x82, 0x7a, 0xe0, 0x3d, 0x75, 0x04, 0xfb, 0x41, 0x39, 0xae, 0x39, + 0x7b, 0x31, 0xf0, 0x9e, 0x76, 0xd9, 0x0f, 0xd2, 0xa7, 0x07, 0xde, 0x53, 0xa5, 0xde, 0x86, 0x2d, + 0x7f, 0xa3, 0x67, 0xca, 0xdf, 0x26, 0xfe, 0x24, 0x7b, 0xd0, 0x14, 0x03, 0xf7, 0xc9, 0xd3, 0xcf, + 0x95, 0x0c, 0xf5, 0x1c, 0x41, 0x91, 0xa4, 0x98, 0x0e, 0x2c, 0xaa, 0x91, 0xe8, 0x2c, 0x28, 0x3f, + 0xac, 0x87, 0xd6, 0xff, 0xd6, 0xa0, 0x6e, 0x36, 0x4c, 0x7e, 0x0e, 0xab, 0xe7, 0x69, 0xe8, 0xf9, + 0x68, 0x7f, 0x4a, 0x61, 0x4d, 0x5b, 0x31, 0x8e, 0x73, 0x53, 0xf3, 0x3e, 0x2c, 0x6b, 0xf0, 0x90, + 0x72, 0x61, 0x6c, 0x6b, 0xc3, 0x5e, 0x52, 0xd4, 0xb7, 0x8a, 0x48, 0x3e, 0x82, 0x5b, 0xea, 0x64, + 0xe6, 0xa4, 0x4a, 0x0b, 0x15, 0x94, 0x67, 0x4a, 0x62, 0x78, 0x11, 0xd9, 0x0a, 0x92, 0x29, 0x67, + 0xbe, 0xa0, 0x9c, 0x6d, 0xa8, 0x8b, 0xf4, 0x3c, 0x61, 0x89, 0x2e, 0x0e, 0xa2, 0x63, 0xd2, 0x63, + 0xb2, 0x0e, 0xb7, 0x14, 0x63, 0x41, 0x32, 0xd4, 0x80, 0x58, 0xb0, 0x84, 0x6a, 0x70, 0x58, 0xe8, + 0x9c, 0x8f, 0x8c, 0xa1, 0x98, 0xb3, 0x9b, 0x48, 0x3c, 0x0e, 0x9f, 0x21, 0xc9, 0xfa, 0x3d, 0x40, + 0xbe, 0xfc, 0x1f, 0xe3, 0xbb, 0xad, 0xbf, 0x82, 0xb5, 0x8a, 0x8a, 0xc7, 0x4d, 0x21, 0x23, 0x5a, + 0x91, 0x72, 0x25, 0x45, 0x89, 0x5f, 0xe6, 0x63, 0x82, 0xac, 0x5f, 0xc1, 0x66, 0x75, 0xe5, 0xe3, + 0xe6, 0xb8, 0xce, 0xfa, 0x14, 0x56, 0x27, 0xaa, 0x1b, 0x37, 0x06, 0xb3, 0xdf, 0xc2, 0x4a, 0xa9, + 0x8a, 0x41, 0xee, 0x02, 0xe8, 0x8a, 0x87, 0x93, 0xc5, 0x9d, 0x0d, 0x4d, 0x39, 0xf6, 0x50, 0x53, + 0xb2, 0xc8, 0xa1, 0x1e, 0x7b, 0x6e, 0x56, 0x96, 0x72, 0xea, 0x1b, 0xee, 0x5b, 0x5f, 0xc0, 0x7a, + 0x55, 0x45, 0xe3, 0x1d, 0xbe, 0xe3, 0x9f, 0xe7, 0x61, 0xbd, 0xaa, 0x5a, 0x45, 0x5e, 0xc2, 0x03, + 0x71, 0xc9, 0x62, 0x27, 0xe6, 0x2c, 0x70, 0xb9, 0x0e, 0xbb, 0x9c, 0xac, 0xfe, 0xc5, 0xa9, 0xf2, + 0x47, 0x2a, 0x28, 0xd9, 0x43, 0xe8, 0x99, 0x42, 0xca, 0x08, 0xcc, 0x88, 0xd4, 0x30, 0xf2, 0x16, + 0x3e, 0xc4, 0xec, 0xa3, 0x5a, 0x98, 0x2b, 0x1c, 0x4e, 0xfb, 0xa9, 0xef, 0x72, 0x55, 0x28, 0x54, + 0x01, 0xc6, 0x03, 0x41, 0x93, 0x0a, 0x91, 0xfb, 0xc2, 0x56, 0x58, 0x19, 0xb9, 0x74, 0xe1, 0x03, + 0x2f, 0x0a, 0x75, 0xa2, 0x1b, 0x47, 0x71, 0xea, 0x63, 0x8e, 0x66, 0x96, 0x31, 0x0b, 0xb0, 0xf0, + 0x22, 0xd2, 0xa6, 0xd1, 0x42, 0x38, 0xa6, 0xb5, 0x67, 0x1a, 0xac, 0x97, 0xd0, 0xd2, 0xe5, 0x5d, + 0xfe, 0x25, 0x6c, 0xc9, 0x28, 0xba, 0x52, 0xcc, 0x2d, 0x15, 0x78, 0x22, 0xa0, 0x7a, 0x6a, 0x79, + 0xd6, 0x45, 0xea, 0xfb, 0x2a, 0xd8, 0x54, 0x4f, 0x6c, 0x33, 0x1e, 0x9b, 0xf6, 0x22, 0xf5, 0x7d, + 0x19, 0x73, 0x56, 0x4c, 0x95, 0x55, 0x58, 0x39, 0x75, 0xb1, 0x6a, 0x2a, 0x6a, 0x40, 0x4e, 0xfd, + 0x0e, 0xb6, 0xa4, 0x02, 0xb4, 0x5a, 0x65, 0xbe, 0xaf, 0x65, 0x18, 0xa3, 0x51, 0x28, 0x26, 0xe0, + 0xd7, 0x2b, 0x8d, 0x22, 0x50, 0xcb, 0x12, 0xf6, 0xa6, 0x5b, 0x49, 0xb7, 0xfe, 0xae, 0x06, 0x9b, + 0xd5, 0x53, 0xf0, 0xf2, 0x8a, 0x41, 0xc4, 0x93, 0x62, 0x2c, 0xdd, 0x90, 0x14, 0xb9, 0xad, 0x1d, + 0x68, 0xe4, 0x1f, 0x3f, 0xab, 0xa3, 0x38, 0xf3, 0xb9, 0x0f, 0x60, 0xc9, 0x44, 0xc0, 0xce, 0xc0, + 0x15, 0x03, 0x19, 0x6c, 0xb5, 0xec, 0x96, 0x21, 0x1e, 0xb9, 0x62, 0x40, 0x36, 0x61, 0x61, 0xc0, + 0x3c, 0x8f, 0x86, 0xfa, 0xf4, 0xf4, 0xc8, 0xe2, 0xd0, 0x2a, 0x96, 0xdc, 0xde, 0x39, 0xf6, 0xdb, + 0x81, 0x86, 0xac, 0xc1, 0x15, 0x5e, 0x52, 0x5d, 0x12, 0xd0, 0x3b, 0xdf, 0x05, 0x50, 0x4c, 0xd9, + 0x68, 0x52, 0x51, 0xa7, 0x82, 0xbf, 0x1e, 0xc5, 0xd4, 0x1a, 0x41, 0xb3, 0x50, 0xa8, 0x2b, 0xa1, + 0x6b, 0x25, 0x74, 0xd5, 0x8e, 0x66, 0xab, 0x76, 0x84, 0x6a, 0x40, 0x73, 0x27, 0x12, 0x0c, 0xa0, + 0x98, 0xa7, 0xd7, 0x6d, 0xe5, 0xc4, 0x63, 0xcf, 0xfa, 0x25, 0xd4, 0x4d, 0xad, 0x8f, 0x7c, 0x52, + 0xa8, 0x08, 0x2a, 0x17, 0xbb, 0x3a, 0x51, 0x11, 0xcc, 0xcb, 0x81, 0xd6, 0x7f, 0xd4, 0x61, 0x51, + 0x53, 0xd1, 0x37, 0xa0, 0x93, 0x30, 0x8e, 0x13, 0x7f, 0x93, 0x2f, 0xb3, 0x96, 0x49, 0x76, 0x4a, + 0x15, 0x9d, 0x17, 0x3c, 0x31, 0x23, 0x5b, 0xf7, 0x4d, 0xe4, 0x21, 0x3e, 0x85, 0xfa, 0x20, 0x12, + 0x89, 0x9c, 0x3a, 0x57, 0x2e, 0xd8, 0x1e, 0x69, 0x4e, 0xb6, 0x29, 0x03, 0x25, 0xcf, 0x60, 0x69, + 0x18, 0xe1, 0x9a, 0x3c, 0x72, 0x03, 0x16, 0xf6, 0x75, 0x6f, 0xac, 0x50, 0x48, 0x7b, 0x8b, 0x6c, + 0x5b, 0x71, 0xcd, 0xfc, 0xd6, 0xb0, 0x40, 0x24, 0xdf, 0x40, 0x1b, 0x75, 0x14, 0x85, 0xae, 0xef, + 0x0c, 0xa2, 0x44, 0xc4, 0x51, 0xa2, 0x3b, 0x5f, 0x85, 0xab, 0x7e, 0xa6, 0x11, 0x47, 0x0a, 0x60, + 0x24, 0xad, 0xc4, 0xe3, 0x74, 0xf2, 0x05, 0x34, 0xae, 0x5c, 0xdf, 0x8f, 0xdd, 0x98, 0x72, 0x1d, + 0x62, 0x17, 0x8a, 0x59, 0xdf, 0x1a, 0x96, 0x99, 0x9f, 0x83, 0xc9, 0x9f, 0x43, 0x4b, 0x26, 0xb2, + 0xe6, 0x4b, 0x16, 0xcb, 0x05, 0x21, 0xcc, 0x66, 0x4b, 0x1f, 0xd2, 0xf4, 0x72, 0x1a, 0x2e, 0x7d, + 0xee, 0xa7, 0x34, 0x89, 0xa2, 0x64, 0xa0, 0x3b, 0x56, 0x85, 0xa5, 0x9f, 0x19, 0x56, 0xb6, 0x74, + 0x06, 0x26, 0xbf, 0x83, 0xcd, 0x6b, 0x0a, 0xad, 0x8d, 0x72, 0x58, 0x5f, 0x19, 0x02, 0x1b, 0x91, + 0x1b, 0x6e, 0x65, 0x7d, 0xf5, 0x4b, 0x68, 0x06, 0x5e, 0xe0, 0x98, 0x5c, 0x08, 0xca, 0x37, 0xe3, + 0xe4, 0xf0, 0x44, 0xc7, 0xed, 0xd9, 0xcd, 0x08, 0xbc, 0xc0, 0x84, 0xf2, 0x14, 0xb6, 0x4d, 0x2f, + 0x4d, 0x36, 0xe3, 0x9c, 0x3e, 0x77, 0x7b, 0xd4, 0x89, 0x29, 0x67, 0x91, 0xa7, 0x9b, 0x5b, 0x0f, + 0x0b, 0x07, 0xa5, 0xb1, 0x2f, 0xa3, 0xde, 0xe5, 0x6f, 0x10, 0x79, 0x26, 0x81, 0x46, 0xf2, 0xed, + 0xb8, 0x9a, 0x4f, 0xbe, 0x83, 0xcd, 0xc0, 0xfd, 0x9e, 0x05, 0x69, 0x80, 0xb9, 0xb2, 0x74, 0x6c, + 0xd2, 0x6a, 0x9a, 0xce, 0xd7, 0xfb, 0xc5, 0x28, 0x56, 0xe2, 0x6c, 0x0d, 0x43, 0xe3, 0x99, 0xed, + 0x7c, 0x3d, 0xa8, 0x60, 0x92, 0xbf, 0x80, 0x0d, 0x8f, 0xb9, 0xfd, 0x30, 0x12, 0x09, 0xeb, 0x39, + 0x22, 0x3d, 0x0f, 0x98, 0x90, 0xd1, 0xca, 0x52, 0x59, 0xf6, 0x61, 0x06, 0xeb, 0x66, 0xa8, 0x4c, + 0xb6, 0x57, 0xc1, 0xc4, 0x27, 0xe0, 0xc6, 0xb1, 0xe3, 0x86, 0xae, 0x3f, 0x4a, 0x58, 0x4f, 0xe8, + 0xee, 0xd8, 0x78, 0xb3, 0x67, 0xdf, 0x70, 0xb3, 0x27, 0xe0, 0x16, 0x88, 0xe4, 0x02, 0xb6, 0xae, + 0x2f, 0xf1, 0xaf, 0x94, 0x13, 0xc5, 0xeb, 0x32, 0x25, 0x23, 0xbb, 0xe3, 0x5e, 0x97, 0x4a, 0x3d, + 0x86, 0xb5, 0x8a, 0xf7, 0x88, 0x11, 0xb1, 0xea, 0xb8, 0x79, 0x3a, 0x0a, 0x30, 0x43, 0xeb, 0x09, + 0x6c, 0x56, 0xbf, 0xbc, 0x29, 0x73, 0xfe, 0x0c, 0xda, 0xe5, 0x77, 0x86, 0xc1, 0x29, 0x0b, 0x4c, + 0x01, 0xa1, 0x65, 0xab, 0x01, 0x52, 0xaf, 0x06, 0x94, 0x9b, 0x40, 0x5f, 0x0d, 0xac, 0x47, 0x40, + 0x26, 0x9f, 0xda, 0x94, 0xf5, 0x3e, 0x86, 0x76, 0xf9, 0x71, 0x4d, 0x41, 0xff, 0x7d, 0x0d, 0xee, + 0x4c, 0x7b, 0x44, 0x37, 0x06, 0xa5, 0x6f, 0xaf, 0x7d, 0xac, 0xca, 0xe4, 0xee, 0xdd, 0xf0, 0x58, + 0xaf, 0x79, 0xa5, 0xd6, 0xdf, 0xd4, 0x60, 0xef, 0x86, 0x93, 0xbd, 0x71, 0x6f, 0xcf, 0xe0, 0xee, + 0xd8, 0xdd, 0x71, 0x3c, 0x55, 0x57, 0xc2, 0x50, 0x24, 0xcb, 0xcf, 0x5a, 0xf6, 0xce, 0x18, 0xe8, + 0x30, 0xc3, 0xa0, 0xda, 0xad, 0x27, 0xb0, 0x51, 0xdd, 0xa6, 0xd9, 0x82, 0xfa, 0x30, 0x0e, 0x8b, + 0x7f, 0x0c, 0x59, 0x1c, 0xc6, 0xe1, 0x9b, 0x94, 0x79, 0xd6, 0x67, 0xa6, 0xde, 0x59, 0x70, 0x2f, + 0x98, 0x88, 0x15, 0x1d, 0x92, 0xde, 0x6d, 0xee, 0x73, 0xac, 0x4f, 0x60, 0xa5, 0xe4, 0x59, 0x30, + 0xc1, 0xc9, 0xdc, 0x90, 0xae, 0x5f, 0x99, 0xb1, 0xf5, 0x5b, 0x58, 0x9d, 0xb0, 0x54, 0xe4, 0xe9, + 0xb8, 0x6d, 0xab, 0x95, 0x3b, 0xd3, 0xf9, 0x8c, 0xa2, 0x51, 0xb3, 0x3c, 0x80, 0x9c, 0x43, 0xde, + 0xc2, 0x43, 0xd9, 0x29, 0xd0, 0x9d, 0x55, 0x34, 0x72, 0xb2, 0x16, 0x49, 0x3d, 0xe7, 0x6a, 0xc0, + 0x7c, 0xea, 0x88, 0x34, 0xa6, 0x7c, 0xc8, 0x44, 0x76, 0x9d, 0xde, 0xcb, 0xf1, 0x68, 0xc8, 0xf6, + 0x15, 0xfa, 0x5b, 0x04, 0x77, 0x33, 0xac, 0xf5, 0x3b, 0xd8, 0x9d, 0x6e, 0x0e, 0xc9, 0xaf, 0xa7, + 0x1a, 0x57, 0x15, 0xf9, 0x5c, 0x67, 0x32, 0xad, 0x2e, 0xec, 0x4c, 0x31, 0x85, 0xe4, 0xb3, 0x6b, + 0x2d, 0xaa, 0x92, 0x5b, 0x69, 0x2a, 0xad, 0x5f, 0xc0, 0xce, 0x14, 0x1b, 0x38, 0xe5, 0x61, 0x3d, + 0x96, 0x39, 0x5e, 0xd9, 0xd0, 0x4d, 0x99, 0x70, 0x00, 0x7b, 0x37, 0x34, 0x2b, 0xdf, 0x21, 0xeb, + 0xf9, 0x1a, 0xee, 0x4c, 0xeb, 0x3d, 0xbe, 0x83, 0x84, 0x3e, 0x6c, 0x5f, 0xdf, 0x4f, 0x7c, 0x87, + 0xbe, 0xc0, 0x07, 0xb0, 0xa2, 0xff, 0x1b, 0x91, 0x35, 0x2c, 0x55, 0xda, 0xb3, 0xac, 0xc8, 0x46, + 0x94, 0xf5, 0xd7, 0x35, 0x58, 0xab, 0x68, 0x2b, 0x92, 0x0f, 0xa1, 0xdd, 0x4b, 0x39, 0xc7, 0xe3, + 0xc9, 0x2a, 0xcb, 0xba, 0x9a, 0xad, 0xe9, 0x19, 0xf4, 0x3e, 0xb4, 0x42, 0x7a, 0x95, 0xc3, 0x74, + 0x65, 0x2a, 0xa4, 0x57, 0x19, 0x64, 0x0f, 0x9a, 0xaa, 0xce, 0x1e, 0xf1, 0x28, 0x10, 0xba, 0xba, + 0x0e, 0x92, 0x74, 0x8a, 0x14, 0xeb, 0x33, 0xd8, 0xac, 0x6e, 0x42, 0x8e, 0x95, 0xb6, 0x6b, 0xa5, + 0xd2, 0xf6, 0x29, 0xac, 0x57, 0x75, 0x17, 0x31, 0x12, 0xed, 0x17, 0xfa, 0x2c, 0xf8, 0x7b, 0x32, + 0x21, 0x98, 0x9d, 0x4c, 0x08, 0xd0, 0x4b, 0x94, 0x3b, 0x81, 0xe4, 0x23, 0x58, 0x54, 0xad, 0x43, + 0x13, 0x10, 0xb7, 0x0b, 0xff, 0x54, 0x91, 0x0c, 0xdb, 0x00, 0xac, 0x11, 0x2c, 0xe8, 0x59, 0x7b, + 0xd0, 0x8c, 0x79, 0xe4, 0xa5, 0x3d, 0xd5, 0xc8, 0xd3, 0x76, 0x46, 0x93, 0xbe, 0xa1, 0x23, 0x59, + 0x8c, 0xd4, 0x80, 0xf1, 0x2a, 0xc5, 0xb2, 0x26, 0x9b, 0xf2, 0x8c, 0xcc, 0xd1, 0xf5, 0xff, 0x4c, + 0xa4, 0x4d, 0xd4, 0x31, 0xbc, 0xf9, 0xd3, 0xc0, 0xbe, 0x24, 0x5a, 0x1f, 0xc3, 0x7a, 0x55, 0x13, + 0x13, 0xdd, 0x99, 0x2c, 0xa5, 0xeb, 0x8b, 0xae, 0x06, 0xd6, 0x4b, 0x20, 0x93, 0xcd, 0x49, 0xf2, + 0x39, 0xdc, 0xbe, 0x60, 0x7e, 0x42, 0x79, 0xde, 0xd5, 0x74, 0xe2, 0x88, 0x85, 0x89, 0xb9, 0x63, + 0x1b, 0x8a, 0x9d, 0x4d, 0x39, 0x93, 0x4c, 0xeb, 0xc7, 0x1a, 0x90, 0xc9, 0xce, 0x24, 0xda, 0xe6, + 0x4b, 0x3a, 0x2a, 0x66, 0x30, 0x8b, 0x97, 0x74, 0x24, 0xf3, 0x97, 0x43, 0x68, 0xe7, 0x9d, 0x4e, + 0xd5, 0x41, 0xd2, 0x9e, 0xaa, 0x10, 0xe1, 0x67, 0xc2, 0x54, 0xf3, 0xc1, 0x5e, 0xc9, 0xa6, 0x28, + 0x02, 0xea, 0x10, 0x6f, 0x5e, 0x8f, 0x72, 0xbc, 0xf7, 0x3d, 0x57, 0x57, 0xf3, 0x5b, 0xf6, 0x72, + 0x48, 0xaf, 0x0e, 0x72, 0x2a, 0xf9, 0x1a, 0xee, 0x70, 0x1a, 0xfb, 0x23, 0x87, 0x86, 0x3d, 0x3e, + 0xd2, 0x95, 0x9b, 0xc2, 0xac, 0x79, 0x39, 0x6b, 0x5b, 0x62, 0x9e, 0x67, 0x90, 0x82, 0x04, 0xeb, + 0x9f, 0x6a, 0xb0, 0x52, 0xda, 0xcf, 0xb4, 0xab, 0xa9, 0x5a, 0x51, 0x68, 0x8c, 0x29, 0x9e, 0xbf, + 0x43, 0xbf, 0x8f, 0x23, 0x9e, 0xe8, 0x3b, 0xd7, 0xd6, 0x9c, 0x6f, 0xe8, 0xe8, 0xb9, 0xa4, 0x93, + 0xaf, 0x60, 0x67, 0x12, 0x9d, 0xbf, 0x28, 0x75, 0xe0, 0x9d, 0xf2, 0x34, 0x73, 0xdf, 0xad, 0x2f, + 0x61, 0x75, 0xa2, 0xaf, 0x8a, 0xca, 0x29, 0x77, 0x63, 0xd5, 0x26, 0x97, 0xcf, 0xc7, 0x80, 0xd6, + 0x7f, 0xd7, 0x60, 0xc9, 0xa6, 0x22, 0xf5, 0x13, 0xf3, 0x8f, 0x4b, 0x02, 0xf3, 0xa9, 0x57, 0xe8, + 0x53, 0x7a, 0x6c, 0xf2, 0x5f, 0x98, 0xb3, 0x93, 0xff, 0xc2, 0x7c, 0x0a, 0x4d, 0xca, 0x79, 0xc4, + 0x9d, 0xde, 0xc0, 0x65, 0xe1, 0x64, 0x39, 0xf1, 0x39, 0x32, 0x0f, 0x90, 0x67, 0x03, 0xcd, 0x7e, + 0x5b, 0x5d, 0x58, 0xe8, 0x26, 0x6e, 0x92, 0x0a, 0xd2, 0x86, 0xd6, 0x7e, 0xef, 0x32, 0x8c, 0xae, + 0x7c, 0xea, 0xf5, 0xa9, 0xd7, 0x9e, 0x21, 0x0d, 0xb8, 0x25, 0x67, 0xb5, 0x6b, 0x64, 0x13, 0x88, + 0xfe, 0xd7, 0xe6, 0x0b, 0xd9, 0xbd, 0x54, 0xf4, 0x59, 0x52, 0x87, 0xf9, 0x63, 0xcf, 0xa7, 0xed, + 0x39, 0x02, 0xb0, 0xf0, 0x2a, 0x4a, 0x5e, 0x45, 0x57, 0xed, 0x79, 0xeb, 0xdf, 0x6a, 0x00, 0xf9, + 0x7a, 0xe4, 0x53, 0xd8, 0xf0, 0xa3, 0x9e, 0xeb, 0xb3, 0x1f, 0xa8, 0xe7, 0x78, 0x54, 0xf4, 0x38, + 0x8b, 0xb3, 0x02, 0x53, 0xc3, 0x5e, 0xcf, 0x98, 0x87, 0x39, 0x0f, 0x7d, 0x55, 0x2a, 0x1c, 0x1a, + 0xf6, 0x7d, 0x26, 0x06, 0x63, 0xb3, 0xd4, 0xc7, 0xaf, 0xa7, 0xe2, 0xb9, 0x62, 0x16, 0x67, 0xdd, + 0x87, 0x96, 0xd2, 0x82, 0x17, 0x05, 0x4a, 0x0d, 0x52, 0x51, 0x92, 0x76, 0x28, 0x49, 0x98, 0xdc, + 0x6b, 0x45, 0x45, 0x9e, 0xba, 0x7c, 0xb7, 0xec, 0x86, 0xd2, 0x48, 0xe4, 0xd1, 0x67, 0xed, 0xff, + 0xfc, 0x69, 0xb7, 0xf6, 0x5f, 0x3f, 0xed, 0xd6, 0x7e, 0xfc, 0x69, 0xb7, 0xf6, 0x8f, 0xff, 0xb3, + 0x3b, 0x73, 0xbe, 0x20, 0x15, 0xf8, 0xe9, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xaf, 0xde, + 0x66, 0x32, 0x2b, 0x00, 0x00, } func (m *CommandPayload) Marshal() (dAtA []byte, err error) { @@ -6528,6 +6557,20 @@ func (m *Asset) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Sha256S) > 0 { + for iNdEx := len(m.Sha256S) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Sha256S[iNdEx]) + copy(dAtA[i:], m.Sha256S[iNdEx]) + i = encodeVarintMdm(dAtA, i, uint64(len(m.Sha256S[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } + if m.Sha256Size != 0 { + i = encodeVarintMdm(dAtA, i, uint64(m.Sha256Size)) + i-- + dAtA[i] = 0x28 + } if len(m.Url) > 0 { i -= len(m.Url) copy(dAtA[i:], m.Url) @@ -6583,6 +6626,11 @@ func (m *Metadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SizeInBytes != 0 { + i = encodeVarintMdm(dAtA, i, uint64(m.SizeInBytes)) + i-- + dAtA[i] = 0x38 + } if len(m.Title) > 0 { i -= len(m.Title) copy(dAtA[i:], m.Title) @@ -9520,6 +9568,15 @@ func (m *Asset) Size() (n int) { if l > 0 { n += 1 + l + sovMdm(uint64(l)) } + if m.Sha256Size != 0 { + n += 1 + sovMdm(uint64(m.Sha256Size)) + } + if len(m.Sha256S) > 0 { + for _, s := range m.Sha256S { + l = len(s) + n += 1 + l + sovMdm(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9558,6 +9615,9 @@ func (m *Metadata) Size() (n int) { if l > 0 { n += 1 + l + sovMdm(uint64(l)) } + if m.SizeInBytes != 0 { + n += 1 + sovMdm(uint64(m.SizeInBytes)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -14430,6 +14490,57 @@ func (m *Asset) Unmarshal(dAtA []byte) error { } m.Url = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sha256Size", wireType) + } + m.Sha256Size = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMdm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Sha256Size |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sha256S", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMdm + } + 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 ErrInvalidLengthMdm + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthMdm + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sha256S = append(m.Sha256S, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipMdm(dAtA[iNdEx:]) @@ -14678,6 +14789,25 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { } m.Title = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SizeInBytes", wireType) + } + m.SizeInBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMdm + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SizeInBytes |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipMdm(dAtA[iNdEx:]) diff --git a/mdm/mdm/internal/mdmproto/mdm.proto b/mdm/mdm/internal/mdmproto/mdm.proto index 213cc64a..db8b9f6a 100644 --- a/mdm/mdm/internal/mdmproto/mdm.proto +++ b/mdm/mdm/internal/mdmproto/mdm.proto @@ -180,6 +180,8 @@ message Asset { int64 md5_size = 2; repeated string md5s = 3; string url = 4; + int64 sha256_size = 5; + repeated string sha256s = 6; } message Metadata { @@ -189,6 +191,7 @@ message Metadata { string kind = 4; string subtitle = 5; string title = 6; + int64 size_in_bytes = 7; } message BundleInfo { diff --git a/mdm/mdm/marshal_proto.go b/mdm/mdm/marshal_proto.go index 6fffbf8f..e6179767 100644 --- a/mdm/mdm/marshal_proto.go +++ b/mdm/mdm/marshal_proto.go @@ -152,8 +152,47 @@ func commandToProto(cmd *Command) (*mdmproto.Command, error) { }, } case "InstallEnterpriseApplication": + var pbManifest *mdmproto.Manifest + if cmd.InstallEnterpriseApplication.Manifest != nil { + pbManifest = &(mdmproto.Manifest{}) + for _, item := range cmd.InstallEnterpriseApplication.Manifest.ManifestItems { + var pbManifestItem mdmproto.ManifestItem + for _, asset := range item.Assets { + pbAsset := mdmproto.Asset{ + Kind: asset.Kind, + Md5Size: asset.MD5Size, + Md5S: asset.MD5s, + Sha256Size: asset.SHA256Size, + Sha256S: asset.SHA256s, + Url: asset.URL, + } + pbManifestItem.Assets = append(pbManifestItem.Assets, &pbAsset) + } + if item.Metadata != nil { + pbManifestItem.Metadata = &(mdmproto.Metadata{ + BundleIdentifier: item.Metadata.BundleInfo.BundleIdentifier, + BundleVersion: item.Metadata.BundleInfo.BundleVersion, + Kind: item.Metadata.Kind, + SizeInBytes: item.Metadata.SizeInBytes, + Title: item.Metadata.Title, + Subtitle: item.Metadata.Subtitle, + }) + for _, bundleInfo := range item.Metadata.Items { + bpBundleInfo := &(mdmproto.BundleInfo{ + BundleIdentifier: bundleInfo.BundleIdentifier, + BundleVersion: bundleInfo.BundleVersion, + }) + pbManifestItem.Metadata.Items = append(pbManifestItem.Metadata.Items, bpBundleInfo) + } + } + if len(pbManifestItem.Assets) > 0 || pbManifestItem.Metadata != nil { + pbManifest.ManifestItems = append(pbManifest.ManifestItems, &pbManifestItem) + } + } + } cmdproto.Request = &mdmproto.Command_InstallEnterpriseApplication{ InstallEnterpriseApplication: &mdmproto.InstallEnterpriseApplication{ + Manifest: pbManifest, ManifestUrl: emptyStringIfNil(cmd.InstallEnterpriseApplication.ManifestURL), ManifestUrlPinningCerts: cmd.InstallEnterpriseApplication.ManifestURLPinningCerts, PinningRevocationCheckRequired: falseIfNil(cmd.InstallEnterpriseApplication.PinningRevocationCheckRequired), diff --git a/mdm/mdm/mdm_command_test.go b/mdm/mdm/mdm_command_test.go index f1e3ce7d..083711b0 100644 --- a/mdm/mdm/mdm_command_test.go +++ b/mdm/mdm/mdm_command_test.go @@ -72,7 +72,6 @@ func TestMarshalCommand(t *testing.T) { if err := enc.Encode(&payload); err != nil { t.Fatal(err) } - fmt.Println(buf.String()) }) t.Run(tt.Command.RequestType+"_plist", func(t *testing.T) { @@ -83,7 +82,6 @@ func TestMarshalCommand(t *testing.T) { if err := enc.Encode(&payload); err != nil { t.Fatal(err) } - fmt.Println(buf.String()) }) } } @@ -196,6 +194,35 @@ func TestEndToEnd(t *testing.T) { } }, }, + + { + name: "InstallEnterpriseApplication", + requestBytes: []byte( + `{"udid":"B59A5A44-EC36-4244-AB52-C40F6100528A","request_type":"InstallEnterpriseApplication","manifest":{"items":[{"metadata":{"items":[{"bundle-version":"1.7.5","bundle-identifier":"com.myenterprise.MyAppNotMAS"}],"bundle-version":"1.1","bundle-identifier":"com.myenterprise.MyAppPackage","kind":"display-image","sizeInBytes":1234,"title":"Test Title","subtitle":"Test Subtitle"},"Assets":[{"sha256-size":1234,"sha256s":["2a8a98c146c35ce29f8b9af4cf8218d2c026058e7eb35adb4a00236997593471"],"url":"https://example.com/p.pkg","kind":"software-package","md5-size":1234,"md5s":["cfdc14fa22a79bab2a8b423daca2c076"]}]}]}}`, + ), + testFn: func(t *testing.T, parts endToEndParts) { + needToSee := [][]byte{ + []byte(`cfdc14fa22a79bab2a8b423daca2c076`), + []byte(`https://example.com/p.pkg`), + []byte(`com.myenterprise.MyAppPackage`), + []byte(`1.1`), + []byte(`1234`), + []byte(`2a8a98c146c35ce29f8b9af4cf8218d2c026058e7eb35adb4a00236997593471`), + []byte(`com.myenterprise.MyAppPackage`), + []byte(`com.myenterprise.MyAppNotMAS`), + []byte(`1.7.5`), + []byte(`software-package`), + []byte(`display-image`), + []byte(`Test Title`), + []byte(`Test Subtitle`), + } + for _, b := range needToSee { + if !bytes.Contains(parts.plistData, b) { + t.Error(fmt.Sprintf("marshaled plist does not contain required bytes: '%s'", string(b))) + } + } + }, + }, } for _, tt := range tests { diff --git a/mdm/mdm/unmarshal_proto.go b/mdm/mdm/unmarshal_proto.go index 25dd2d56..98bd6e04 100644 --- a/mdm/mdm/unmarshal_proto.go +++ b/mdm/mdm/unmarshal_proto.go @@ -2,6 +2,7 @@ package mdm import ( "github.com/gogo/protobuf/proto" + "github.com/micromdm/micromdm/mdm/appmanifest" "github.com/micromdm/micromdm/mdm/mdm/internal/mdmproto" ) @@ -110,7 +111,55 @@ func protoToCommand(pb *mdmproto.Command) *Command { } case "InstallEnterpriseApplication": pbc := pb.GetInstallEnterpriseApplication() + var manifest *appmanifest.Manifest + if pbManifest := pbc.GetManifest(); pbManifest != nil { + manifest = &(appmanifest.Manifest{}) + if pbManifestItems := pbManifest.GetManifestItems(); pbManifestItems != nil { + for _, pbManifestItem := range pbManifestItems { + var manifestItem appmanifest.Item + if pbAssets := pbManifestItem.GetAssets(); pbAssets != nil { + for _, pbAsset := range pbAssets { + asset := appmanifest.Asset{ + Kind: pbAsset.Kind, + MD5s: pbAsset.Md5S, + MD5Size: pbAsset.Md5Size, + URL: pbAsset.Url, + SHA256s: pbAsset.Sha256S, + SHA256Size: pbAsset.Sha256Size, + } + manifestItem.Assets = append(manifestItem.Assets, asset) + } + } + if pbMetadata := pbManifestItem.GetMetadata(); pbMetadata != nil { + manifestItem.Metadata = &(appmanifest.Metadata{ + Kind: pbMetadata.Kind, + SizeInBytes: pbMetadata.SizeInBytes, + Title: pbMetadata.Title, + Subtitle: pbMetadata.Subtitle, + BundleInfo: appmanifest.BundleInfo{ + BundleIdentifier: pbMetadata.BundleIdentifier, + BundleVersion: pbMetadata.BundleVersion, + }, + }) + if pbMetadataItems := pbMetadata.GetItems(); pbMetadataItems != nil { + for _, pbMetadataItem := range pbMetadataItems { + bundleInfo := appmanifest.BundleInfo{ + BundleIdentifier: pbMetadataItem.BundleIdentifier, + BundleVersion: pbMetadataItem.BundleVersion, + } + manifestItem.Metadata.Items = append(manifestItem.Metadata.Items, bundleInfo) + } + } + } + if len(manifestItem.Assets) > 0 || manifestItem.Metadata != nil { + manifest.ManifestItems = append(manifest.ManifestItems, manifestItem) + } + } + } + } + cmd.InstallEnterpriseApplication = &InstallEnterpriseApplication{ + Manifest: manifest, ManifestURL: nilIfEmptyString(pbc.GetManifestUrl()), ManifestURLPinningCerts: pbc.GetManifestUrlPinningCerts(), PinningRevocationCheckRequired: nilIfFalse(pbc.GetPinningRevocationCheckRequired()),