github.com/cloudwan/edgelq-sdk@v1.15.4/logging/resources/v1/bucket/bucket.pb.object_ext.go (about) 1 // Code generated by protoc-gen-goten-object 2 // File: edgelq/logging/proto/v1/bucket.proto 3 // DO NOT EDIT!!! 4 5 package bucket 6 7 import ( 8 "fmt" 9 "sort" 10 11 "google.golang.org/protobuf/proto" 12 googlefieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" 13 14 gotenobject "github.com/cloudwan/goten-sdk/runtime/object" 15 ) 16 17 // proto imports 18 import ( 19 iam_organization "github.com/cloudwan/edgelq-sdk/iam/resources/v1/organization" 20 iam_project "github.com/cloudwan/edgelq-sdk/iam/resources/v1/project" 21 log_descriptor "github.com/cloudwan/edgelq-sdk/logging/resources/v1/log_descriptor" 22 meta_service "github.com/cloudwan/goten-sdk/meta-service/resources/v1/service" 23 meta "github.com/cloudwan/goten-sdk/types/meta" 24 ) 25 26 // ensure the imports are used 27 var ( 28 _ = new(fmt.Stringer) 29 _ = new(sort.Interface) 30 31 _ = new(proto.Message) 32 _ = googlefieldmaskpb.FieldMask{} 33 34 _ = new(gotenobject.FieldPath) 35 ) 36 37 // make sure we're using proto imports 38 var ( 39 _ = &iam_organization.Organization{} 40 _ = &iam_project.Project{} 41 _ = &log_descriptor.LogDescriptor{} 42 _ = &meta_service.Service{} 43 _ = &meta.Meta{} 44 ) 45 46 func (o *Bucket) GotenObjectExt() {} 47 48 func (o *Bucket) MakeFullFieldMask() *Bucket_FieldMask { 49 return FullBucket_FieldMask() 50 } 51 52 func (o *Bucket) MakeRawFullFieldMask() gotenobject.FieldMask { 53 return FullBucket_FieldMask() 54 } 55 56 func (o *Bucket) MakeDiffFieldMask(other *Bucket) *Bucket_FieldMask { 57 if o == nil && other == nil { 58 return &Bucket_FieldMask{} 59 } 60 if o == nil || other == nil { 61 return FullBucket_FieldMask() 62 } 63 64 res := &Bucket_FieldMask{} 65 if o.GetName().String() != other.GetName().String() { 66 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorName}) 67 } 68 { 69 subMask := o.GetMetadata().MakeDiffFieldMask(other.GetMetadata()) 70 if subMask.IsFull() { 71 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorMetadata}) 72 } else { 73 for _, subpath := range subMask.Paths { 74 res.Paths = append(res.Paths, &Bucket_FieldSubPath{selector: Bucket_FieldPathSelectorMetadata, subPath: subpath}) 75 } 76 } 77 } 78 79 if len(o.GetServices()) == len(other.GetServices()) { 80 for i, lValue := range o.GetServices() { 81 rValue := other.GetServices()[i] 82 if lValue != rValue { 83 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorServices}) 84 break 85 } 86 } 87 } else { 88 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorServices}) 89 } 90 91 if len(o.GetVersions()) == len(other.GetVersions()) { 92 for i, lValue := range o.GetVersions() { 93 rValue := other.GetVersions()[i] 94 if lValue != rValue { 95 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorVersions}) 96 break 97 } 98 } 99 } else { 100 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorVersions}) 101 } 102 103 if len(o.GetLogs()) == len(other.GetLogs()) { 104 for i, lValue := range o.GetLogs() { 105 rValue := other.GetLogs()[i] 106 if len(lValue.MakeDiffFieldMask(rValue).Paths) > 0 { 107 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorLogs}) 108 break 109 } 110 } 111 } else { 112 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorLogs}) 113 } 114 115 if len(o.GetRequiredAltKvs()) == len(other.GetRequiredAltKvs()) { 116 for i, lValue := range o.GetRequiredAltKvs() { 117 rValue := other.GetRequiredAltKvs()[i] 118 if len(lValue.MakeDiffFieldMask(rValue).Paths) > 0 { 119 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorRequiredAltKvs}) 120 break 121 } 122 } 123 } else { 124 res.Paths = append(res.Paths, &Bucket_FieldTerminalPath{selector: Bucket_FieldPathSelectorRequiredAltKvs}) 125 } 126 return res 127 } 128 129 func (o *Bucket) MakeRawDiffFieldMask(other gotenobject.GotenObjectExt) gotenobject.FieldMask { 130 return o.MakeDiffFieldMask(other.(*Bucket)) 131 } 132 133 func (o *Bucket) Clone() *Bucket { 134 if o == nil { 135 return nil 136 } 137 result := &Bucket{} 138 if o.Name == nil { 139 result.Name = nil 140 } else if data, err := o.Name.ProtoString(); err != nil { 141 panic(err) 142 } else { 143 result.Name = &Name{} 144 if err := result.Name.ParseProtoString(data); err != nil { 145 panic(err) 146 } 147 } 148 result.Metadata = o.Metadata.Clone() 149 result.Services = make([]string, len(o.Services)) 150 for i, sourceValue := range o.Services { 151 result.Services[i] = sourceValue 152 } 153 result.Versions = make([]string, len(o.Versions)) 154 for i, sourceValue := range o.Versions { 155 result.Versions[i] = sourceValue 156 } 157 result.Logs = make([]*Bucket_RequiredTypedLabels, len(o.Logs)) 158 for i, sourceValue := range o.Logs { 159 result.Logs[i] = sourceValue.Clone() 160 } 161 result.RequiredAltKvs = make([]*Bucket_ResolvedKeysWithValues, len(o.RequiredAltKvs)) 162 for i, sourceValue := range o.RequiredAltKvs { 163 result.RequiredAltKvs[i] = sourceValue.Clone() 164 } 165 return result 166 } 167 168 func (o *Bucket) CloneRaw() gotenobject.GotenObjectExt { 169 return o.Clone() 170 } 171 172 func (o *Bucket) Merge(source *Bucket) { 173 if source.GetName() != nil { 174 if data, err := source.GetName().ProtoString(); err != nil { 175 panic(err) 176 } else { 177 o.Name = &Name{} 178 if err := o.Name.ParseProtoString(data); err != nil { 179 panic(err) 180 } 181 } 182 } else { 183 o.Name = nil 184 } 185 if source.GetMetadata() != nil { 186 if o.Metadata == nil { 187 o.Metadata = new(meta.Meta) 188 } 189 o.Metadata.Merge(source.GetMetadata()) 190 } 191 for _, sourceValue := range source.GetServices() { 192 exists := false 193 for _, currentValue := range o.Services { 194 if currentValue == sourceValue { 195 exists = true 196 break 197 } 198 } 199 if !exists { 200 var newDstElement string 201 newDstElement = sourceValue 202 o.Services = append(o.Services, newDstElement) 203 } 204 } 205 206 for _, sourceValue := range source.GetVersions() { 207 exists := false 208 for _, currentValue := range o.Versions { 209 if currentValue == sourceValue { 210 exists = true 211 break 212 } 213 } 214 if !exists { 215 var newDstElement string 216 newDstElement = sourceValue 217 o.Versions = append(o.Versions, newDstElement) 218 } 219 } 220 221 for _, sourceValue := range source.GetLogs() { 222 exists := false 223 for _, currentValue := range o.Logs { 224 if proto.Equal(sourceValue, currentValue) { 225 exists = true 226 break 227 } 228 } 229 if !exists { 230 var newDstElement *Bucket_RequiredTypedLabels 231 if sourceValue != nil { 232 newDstElement = new(Bucket_RequiredTypedLabels) 233 newDstElement.Merge(sourceValue) 234 } 235 o.Logs = append(o.Logs, newDstElement) 236 } 237 } 238 239 for _, sourceValue := range source.GetRequiredAltKvs() { 240 exists := false 241 for _, currentValue := range o.RequiredAltKvs { 242 if proto.Equal(sourceValue, currentValue) { 243 exists = true 244 break 245 } 246 } 247 if !exists { 248 var newDstElement *Bucket_ResolvedKeysWithValues 249 if sourceValue != nil { 250 newDstElement = new(Bucket_ResolvedKeysWithValues) 251 newDstElement.Merge(sourceValue) 252 } 253 o.RequiredAltKvs = append(o.RequiredAltKvs, newDstElement) 254 } 255 } 256 257 } 258 259 func (o *Bucket) MergeRaw(source gotenobject.GotenObjectExt) { 260 o.Merge(source.(*Bucket)) 261 } 262 263 func (o *Bucket_ResolvedValues) GotenObjectExt() {} 264 265 func (o *Bucket_ResolvedValues) MakeFullFieldMask() *Bucket_ResolvedValues_FieldMask { 266 return FullBucket_ResolvedValues_FieldMask() 267 } 268 269 func (o *Bucket_ResolvedValues) MakeRawFullFieldMask() gotenobject.FieldMask { 270 return FullBucket_ResolvedValues_FieldMask() 271 } 272 273 func (o *Bucket_ResolvedValues) MakeDiffFieldMask(other *Bucket_ResolvedValues) *Bucket_ResolvedValues_FieldMask { 274 if o == nil && other == nil { 275 return &Bucket_ResolvedValues_FieldMask{} 276 } 277 if o == nil || other == nil { 278 return FullBucket_ResolvedValues_FieldMask() 279 } 280 281 res := &Bucket_ResolvedValues_FieldMask{} 282 if o.GetKey() != other.GetKey() { 283 res.Paths = append(res.Paths, &BucketResolvedValues_FieldTerminalPath{selector: BucketResolvedValues_FieldPathSelectorKey}) 284 } 285 286 if len(o.GetValues()) == len(other.GetValues()) { 287 for i, lValue := range o.GetValues() { 288 rValue := other.GetValues()[i] 289 if lValue != rValue { 290 res.Paths = append(res.Paths, &BucketResolvedValues_FieldTerminalPath{selector: BucketResolvedValues_FieldPathSelectorValues}) 291 break 292 } 293 } 294 } else { 295 res.Paths = append(res.Paths, &BucketResolvedValues_FieldTerminalPath{selector: BucketResolvedValues_FieldPathSelectorValues}) 296 } 297 return res 298 } 299 300 func (o *Bucket_ResolvedValues) MakeRawDiffFieldMask(other gotenobject.GotenObjectExt) gotenobject.FieldMask { 301 return o.MakeDiffFieldMask(other.(*Bucket_ResolvedValues)) 302 } 303 304 func (o *Bucket_ResolvedValues) Clone() *Bucket_ResolvedValues { 305 if o == nil { 306 return nil 307 } 308 result := &Bucket_ResolvedValues{} 309 result.Key = o.Key 310 result.Values = make([]int64, len(o.Values)) 311 for i, sourceValue := range o.Values { 312 result.Values[i] = sourceValue 313 } 314 return result 315 } 316 317 func (o *Bucket_ResolvedValues) CloneRaw() gotenobject.GotenObjectExt { 318 return o.Clone() 319 } 320 321 func (o *Bucket_ResolvedValues) Merge(source *Bucket_ResolvedValues) { 322 o.Key = source.GetKey() 323 for _, sourceValue := range source.GetValues() { 324 exists := false 325 for _, currentValue := range o.Values { 326 if currentValue == sourceValue { 327 exists = true 328 break 329 } 330 } 331 if !exists { 332 var newDstElement int64 333 newDstElement = sourceValue 334 o.Values = append(o.Values, newDstElement) 335 } 336 } 337 338 } 339 340 func (o *Bucket_ResolvedValues) MergeRaw(source gotenobject.GotenObjectExt) { 341 o.Merge(source.(*Bucket_ResolvedValues)) 342 } 343 344 func (o *Bucket_ResolvedKeysWithValues) GotenObjectExt() {} 345 346 func (o *Bucket_ResolvedKeysWithValues) MakeFullFieldMask() *Bucket_ResolvedKeysWithValues_FieldMask { 347 return FullBucket_ResolvedKeysWithValues_FieldMask() 348 } 349 350 func (o *Bucket_ResolvedKeysWithValues) MakeRawFullFieldMask() gotenobject.FieldMask { 351 return FullBucket_ResolvedKeysWithValues_FieldMask() 352 } 353 354 func (o *Bucket_ResolvedKeysWithValues) MakeDiffFieldMask(other *Bucket_ResolvedKeysWithValues) *Bucket_ResolvedKeysWithValues_FieldMask { 355 if o == nil && other == nil { 356 return &Bucket_ResolvedKeysWithValues_FieldMask{} 357 } 358 if o == nil || other == nil { 359 return FullBucket_ResolvedKeysWithValues_FieldMask() 360 } 361 362 res := &Bucket_ResolvedKeysWithValues_FieldMask{} 363 364 if len(o.GetResolvedKvs()) == len(other.GetResolvedKvs()) { 365 for i, lValue := range o.GetResolvedKvs() { 366 rValue := other.GetResolvedKvs()[i] 367 if len(lValue.MakeDiffFieldMask(rValue).Paths) > 0 { 368 res.Paths = append(res.Paths, &BucketResolvedKeysWithValues_FieldTerminalPath{selector: BucketResolvedKeysWithValues_FieldPathSelectorResolvedKvs}) 369 break 370 } 371 } 372 } else { 373 res.Paths = append(res.Paths, &BucketResolvedKeysWithValues_FieldTerminalPath{selector: BucketResolvedKeysWithValues_FieldPathSelectorResolvedKvs}) 374 } 375 return res 376 } 377 378 func (o *Bucket_ResolvedKeysWithValues) MakeRawDiffFieldMask(other gotenobject.GotenObjectExt) gotenobject.FieldMask { 379 return o.MakeDiffFieldMask(other.(*Bucket_ResolvedKeysWithValues)) 380 } 381 382 func (o *Bucket_ResolvedKeysWithValues) Clone() *Bucket_ResolvedKeysWithValues { 383 if o == nil { 384 return nil 385 } 386 result := &Bucket_ResolvedKeysWithValues{} 387 result.ResolvedKvs = make([]*Bucket_ResolvedValues, len(o.ResolvedKvs)) 388 for i, sourceValue := range o.ResolvedKvs { 389 result.ResolvedKvs[i] = sourceValue.Clone() 390 } 391 return result 392 } 393 394 func (o *Bucket_ResolvedKeysWithValues) CloneRaw() gotenobject.GotenObjectExt { 395 return o.Clone() 396 } 397 398 func (o *Bucket_ResolvedKeysWithValues) Merge(source *Bucket_ResolvedKeysWithValues) { 399 for _, sourceValue := range source.GetResolvedKvs() { 400 exists := false 401 for _, currentValue := range o.ResolvedKvs { 402 if proto.Equal(sourceValue, currentValue) { 403 exists = true 404 break 405 } 406 } 407 if !exists { 408 var newDstElement *Bucket_ResolvedValues 409 if sourceValue != nil { 410 newDstElement = new(Bucket_ResolvedValues) 411 newDstElement.Merge(sourceValue) 412 } 413 o.ResolvedKvs = append(o.ResolvedKvs, newDstElement) 414 } 415 } 416 417 } 418 419 func (o *Bucket_ResolvedKeysWithValues) MergeRaw(source gotenobject.GotenObjectExt) { 420 o.Merge(source.(*Bucket_ResolvedKeysWithValues)) 421 } 422 423 func (o *Bucket_RequiredTypedLabels) GotenObjectExt() {} 424 425 func (o *Bucket_RequiredTypedLabels) MakeFullFieldMask() *Bucket_RequiredTypedLabels_FieldMask { 426 return FullBucket_RequiredTypedLabels_FieldMask() 427 } 428 429 func (o *Bucket_RequiredTypedLabels) MakeRawFullFieldMask() gotenobject.FieldMask { 430 return FullBucket_RequiredTypedLabels_FieldMask() 431 } 432 433 func (o *Bucket_RequiredTypedLabels) MakeDiffFieldMask(other *Bucket_RequiredTypedLabels) *Bucket_RequiredTypedLabels_FieldMask { 434 if o == nil && other == nil { 435 return &Bucket_RequiredTypedLabels_FieldMask{} 436 } 437 if o == nil || other == nil { 438 return FullBucket_RequiredTypedLabels_FieldMask() 439 } 440 441 res := &Bucket_RequiredTypedLabels_FieldMask{} 442 443 if len(o.GetDescriptors()) == len(other.GetDescriptors()) { 444 for i, lValue := range o.GetDescriptors() { 445 rValue := other.GetDescriptors()[i] 446 if lValue.String() != rValue.String() { 447 res.Paths = append(res.Paths, &BucketRequiredTypedLabels_FieldTerminalPath{selector: BucketRequiredTypedLabels_FieldPathSelectorDescriptors}) 448 break 449 } 450 } 451 } else { 452 res.Paths = append(res.Paths, &BucketRequiredTypedLabels_FieldTerminalPath{selector: BucketRequiredTypedLabels_FieldPathSelectorDescriptors}) 453 } 454 455 if len(o.GetLabels()) == len(other.GetLabels()) { 456 for i, lValue := range o.GetLabels() { 457 rValue := other.GetLabels()[i] 458 if len(lValue.MakeDiffFieldMask(rValue).Paths) > 0 { 459 res.Paths = append(res.Paths, &BucketRequiredTypedLabels_FieldTerminalPath{selector: BucketRequiredTypedLabels_FieldPathSelectorLabels}) 460 break 461 } 462 } 463 } else { 464 res.Paths = append(res.Paths, &BucketRequiredTypedLabels_FieldTerminalPath{selector: BucketRequiredTypedLabels_FieldPathSelectorLabels}) 465 } 466 return res 467 } 468 469 func (o *Bucket_RequiredTypedLabels) MakeRawDiffFieldMask(other gotenobject.GotenObjectExt) gotenobject.FieldMask { 470 return o.MakeDiffFieldMask(other.(*Bucket_RequiredTypedLabels)) 471 } 472 473 func (o *Bucket_RequiredTypedLabels) Clone() *Bucket_RequiredTypedLabels { 474 if o == nil { 475 return nil 476 } 477 result := &Bucket_RequiredTypedLabels{} 478 result.Descriptors = make([]*log_descriptor.Reference, len(o.Descriptors)) 479 for i, sourceValue := range o.Descriptors { 480 if sourceValue == nil { 481 result.Descriptors[i] = nil 482 } else if data, err := sourceValue.ProtoString(); err != nil { 483 panic(err) 484 } else { 485 result.Descriptors[i] = &log_descriptor.Reference{} 486 if err := result.Descriptors[i].ParseProtoString(data); err != nil { 487 panic(err) 488 } 489 } 490 } 491 result.Labels = map[string]*Bucket_RequiredTypedLabels_Strings{} 492 for key, sourceValue := range o.Labels { 493 result.Labels[key] = sourceValue.Clone() 494 } 495 return result 496 } 497 498 func (o *Bucket_RequiredTypedLabels) CloneRaw() gotenobject.GotenObjectExt { 499 return o.Clone() 500 } 501 502 func (o *Bucket_RequiredTypedLabels) Merge(source *Bucket_RequiredTypedLabels) { 503 for _, sourceValue := range source.GetDescriptors() { 504 exists := false 505 for _, currentValue := range o.Descriptors { 506 leftProtoStr, _ := currentValue.ProtoString() 507 rightProtoStr, _ := sourceValue.ProtoString() 508 if leftProtoStr == rightProtoStr { 509 exists = true 510 break 511 } 512 } 513 if !exists { 514 var newDstElement *log_descriptor.Reference 515 if sourceValue != nil { 516 if data, err := sourceValue.ProtoString(); err != nil { 517 panic(err) 518 } else { 519 newDstElement = &log_descriptor.Reference{} 520 if err := newDstElement.ParseProtoString(data); err != nil { 521 panic(err) 522 } 523 } 524 } 525 o.Descriptors = append(o.Descriptors, newDstElement) 526 } 527 } 528 529 if source.GetLabels() != nil { 530 if o.Labels == nil { 531 o.Labels = make(map[string]*Bucket_RequiredTypedLabels_Strings, len(source.GetLabels())) 532 } 533 for key, sourceValue := range source.GetLabels() { 534 if sourceValue != nil { 535 if o.Labels[key] == nil { 536 o.Labels[key] = new(Bucket_RequiredTypedLabels_Strings) 537 } 538 o.Labels[key].Merge(sourceValue) 539 } 540 } 541 } 542 } 543 544 func (o *Bucket_RequiredTypedLabels) MergeRaw(source gotenobject.GotenObjectExt) { 545 o.Merge(source.(*Bucket_RequiredTypedLabels)) 546 } 547 548 func (o *Bucket_RequiredTypedLabels_Strings) GotenObjectExt() {} 549 550 func (o *Bucket_RequiredTypedLabels_Strings) MakeFullFieldMask() *Bucket_RequiredTypedLabels_Strings_FieldMask { 551 return FullBucket_RequiredTypedLabels_Strings_FieldMask() 552 } 553 554 func (o *Bucket_RequiredTypedLabels_Strings) MakeRawFullFieldMask() gotenobject.FieldMask { 555 return FullBucket_RequiredTypedLabels_Strings_FieldMask() 556 } 557 558 func (o *Bucket_RequiredTypedLabels_Strings) MakeDiffFieldMask(other *Bucket_RequiredTypedLabels_Strings) *Bucket_RequiredTypedLabels_Strings_FieldMask { 559 if o == nil && other == nil { 560 return &Bucket_RequiredTypedLabels_Strings_FieldMask{} 561 } 562 if o == nil || other == nil { 563 return FullBucket_RequiredTypedLabels_Strings_FieldMask() 564 } 565 566 res := &Bucket_RequiredTypedLabels_Strings_FieldMask{} 567 568 if len(o.GetStrings()) == len(other.GetStrings()) { 569 for i, lValue := range o.GetStrings() { 570 rValue := other.GetStrings()[i] 571 if lValue != rValue { 572 res.Paths = append(res.Paths, &BucketRequiredTypedLabelsStrings_FieldTerminalPath{selector: BucketRequiredTypedLabelsStrings_FieldPathSelectorStrings}) 573 break 574 } 575 } 576 } else { 577 res.Paths = append(res.Paths, &BucketRequiredTypedLabelsStrings_FieldTerminalPath{selector: BucketRequiredTypedLabelsStrings_FieldPathSelectorStrings}) 578 } 579 return res 580 } 581 582 func (o *Bucket_RequiredTypedLabels_Strings) MakeRawDiffFieldMask(other gotenobject.GotenObjectExt) gotenobject.FieldMask { 583 return o.MakeDiffFieldMask(other.(*Bucket_RequiredTypedLabels_Strings)) 584 } 585 586 func (o *Bucket_RequiredTypedLabels_Strings) Clone() *Bucket_RequiredTypedLabels_Strings { 587 if o == nil { 588 return nil 589 } 590 result := &Bucket_RequiredTypedLabels_Strings{} 591 result.Strings = make([]string, len(o.Strings)) 592 for i, sourceValue := range o.Strings { 593 result.Strings[i] = sourceValue 594 } 595 return result 596 } 597 598 func (o *Bucket_RequiredTypedLabels_Strings) CloneRaw() gotenobject.GotenObjectExt { 599 return o.Clone() 600 } 601 602 func (o *Bucket_RequiredTypedLabels_Strings) Merge(source *Bucket_RequiredTypedLabels_Strings) { 603 for _, sourceValue := range source.GetStrings() { 604 exists := false 605 for _, currentValue := range o.Strings { 606 if currentValue == sourceValue { 607 exists = true 608 break 609 } 610 } 611 if !exists { 612 var newDstElement string 613 newDstElement = sourceValue 614 o.Strings = append(o.Strings, newDstElement) 615 } 616 } 617 618 } 619 620 func (o *Bucket_RequiredTypedLabels_Strings) MergeRaw(source gotenobject.GotenObjectExt) { 621 o.Merge(source.(*Bucket_RequiredTypedLabels_Strings)) 622 }