From 1cc1b53c705bbea5a548eae22a729c80afad3c75 Mon Sep 17 00:00:00 2001 From: Simon Esposito Date: Wed, 5 Aug 2020 12:57:05 +0100 Subject: [PATCH] Add API for demoting group members (#445) Implement go runtime structured logger --- apigrpc/apigrpc.pb.go | 322 ++++++----- apigrpc/apigrpc.pb.gw.go | 113 ++++ apigrpc/apigrpc.proto | 5 + apigrpc/apigrpc.swagger.json | 482 ++++++++++++++++ console/console.pb.go | 8 +- console/console.swagger.json | 228 ++++++++ go.mod | 2 +- go.sum | 18 +- server/api_group.go | 71 +++ server/core_group.go | 152 ++++- server/pipeline_channel.go | 1 + server/runtime.go | 26 + server/runtime_go.go | 28 + server/runtime_go_logger.go | 73 +-- server/runtime_go_logger_test.go | 135 +++++ server/runtime_lua.go | 12 + .../heroiclabs/nakama-common/api/api.pb.go | 532 ++++++++++-------- .../heroiclabs/nakama-common/api/api.proto | 8 + .../nakama-common/runtime/runtime.go | 57 +- .../zap/zaptest/observer/logged_entry.go | 39 ++ .../zap/zaptest/observer/observer.go | 167 ++++++ vendor/modules.txt | 3 +- 22 files changed, 1979 insertions(+), 503 deletions(-) create mode 100644 server/runtime_go_logger_test.go create mode 100644 vendor/go.uber.org/zap/zaptest/observer/logged_entry.go create mode 100644 vendor/go.uber.org/zap/zaptest/observer/observer.go diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index aee6ac75c..42e1786ca 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -31,152 +31,154 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("apigrpc/apigrpc.proto", fileDescriptor_84e2d31978c605c7) } var fileDescriptor_84e2d31978c605c7 = []byte{ - // 2170 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0x5b, 0x6f, 0xdb, 0xc8, - 0x15, 0x2e, 0xbd, 0x6d, 0xe2, 0x8c, 0x7c, 0x1d, 0x5f, 0x12, 0xcb, 0x97, 0xc8, 0x5c, 0xc7, 0x9b, - 0xd5, 0x26, 0xa2, 0xed, 0xb4, 0x08, 0xea, 0x87, 0x76, 0x65, 0x27, 0x76, 0xb2, 0xf1, 0x66, 0x53, - 0x67, 0xd3, 0xa0, 0x01, 0x8a, 0x74, 0x44, 0x8e, 0x25, 0x46, 0x12, 0x87, 0x21, 0x47, 0x4e, 0x03, - 0x23, 0x58, 0xa0, 0x40, 0x51, 0xa0, 0x05, 0x8a, 0x45, 0xb6, 0xe8, 0x53, 0x9f, 0xf2, 0xd8, 0xc7, - 0xbe, 0x14, 0x05, 0xda, 0x5f, 0xd1, 0xbf, 0xd0, 0x1f, 0x52, 0xcc, 0x85, 0xe2, 0x8c, 0x38, 0x14, - 0x13, 0x65, 0xf3, 0x24, 0x9b, 0xdf, 0x99, 0xf3, 0x7d, 0x24, 0xcf, 0x9c, 0xf3, 0x91, 0x12, 0x58, - 0x40, 0xa1, 0xdf, 0x8c, 0x42, 0xd7, 0x91, 0x9f, 0xb5, 0x30, 0x22, 0x94, 0x40, 0x10, 0xa0, 0x36, - 0xea, 0xa2, 0x1a, 0x0a, 0xfd, 0xf2, 0x4a, 0x93, 0x90, 0x66, 0x07, 0xb3, 0x08, 0x07, 0x05, 0x01, - 0xa1, 0x88, 0xfa, 0x24, 0x88, 0x45, 0x64, 0x79, 0x59, 0xa2, 0xfc, 0xbf, 0x46, 0xef, 0xc4, 0xc1, - 0xdd, 0x90, 0xbe, 0x94, 0xe0, 0x35, 0xfe, 0xe1, 0x5e, 0x6f, 0xe2, 0xe0, 0x7a, 0xfc, 0x02, 0x35, - 0x9b, 0x38, 0x72, 0x48, 0xc8, 0x97, 0x1b, 0x52, 0x6d, 0x37, 0x7d, 0xda, 0xea, 0x35, 0x6a, 0x2e, - 0xe9, 0x3a, 0x2d, 0x1c, 0x11, 0xdf, 0xed, 0xa0, 0x46, 0xec, 0x08, 0x29, 0xd7, 0x5d, 0xd2, 0xed, - 0x92, 0x40, 0xa8, 0x08, 0x7d, 0xb1, 0x64, 0xe7, 0x5f, 0x3f, 0x03, 0xe7, 0xee, 0x73, 0x1c, 0x3e, - 0x06, 0xa0, 0xee, 0x79, 0x07, 0x91, 0x8f, 0x03, 0x2f, 0x86, 0xab, 0xb5, 0xf4, 0x0c, 0x6a, 0xe9, - 0xf1, 0x63, 0xfc, 0xbc, 0x87, 0x63, 0x5a, 0x5e, 0xac, 0x09, 0xd9, 0xb5, 0x44, 0x76, 0xed, 0x36, - 0x93, 0x6d, 0xc3, 0xdf, 0xfd, 0xf7, 0x7f, 0xdf, 0x8d, 0x4d, 0xd8, 0xc0, 0x39, 0xdd, 0x71, 0x4e, - 0xf8, 0x1a, 0xd8, 0x06, 0x93, 0x75, 0xcf, 0x3b, 0x8c, 0x48, 0x2f, 0x7c, 0x14, 0xe3, 0x28, 0x86, - 0x95, 0x81, 0xdc, 0x29, 0x54, 0x94, 0xbe, 0xc2, 0xd3, 0x97, 0xed, 0x4b, 0x2c, 0x7d, 0x93, 0x2d, - 0x73, 0xce, 0xf8, 0xc7, 0x53, 0xdf, 0x7b, 0xe5, 0x20, 0xcf, 0x83, 0xdf, 0x59, 0x60, 0xb6, 0xde, - 0xa3, 0x2d, 0x1c, 0x50, 0xdf, 0x45, 0x14, 0xd7, 0xc3, 0xb0, 0x83, 0xe1, 0x86, 0xc6, 0x38, 0x08, - 0x27, 0xac, 0x73, 0x6a, 0xd4, 0x43, 0x1c, 0xc7, 0x3e, 0x09, 0xec, 0xfd, 0xd7, 0xf5, 0xd9, 0xc6, - 0x34, 0x98, 0x04, 0x17, 0xf6, 0x50, 0xec, 0xbb, 0x6c, 0x31, 0xfc, 0x01, 0x97, 0xf1, 0xa9, 0xbd, - 0xc6, 0x64, 0x20, 0xd7, 0x25, 0xbd, 0x80, 0x3a, 0x48, 0x49, 0xeb, 0x20, 0x96, 0x77, 0xf7, 0xbc, - 0xc4, 0xe0, 0x5f, 0x2d, 0x00, 0x55, 0xda, 0xfd, 0x5e, 0x4c, 0x49, 0x17, 0x5e, 0xc9, 0x93, 0x25, - 0xf0, 0xa1, 0xba, 0x6e, 0xe5, 0xea, 0xaa, 0xda, 0x97, 0x73, 0x75, 0xb9, 0x3c, 0x71, 0xbe, 0xb0, - 0x5b, 0xf8, 0xd4, 0x77, 0x71, 0xbe, 0x30, 0x81, 0x7f, 0x00, 0x61, 0x1e, 0x4f, 0x9c, 0x0a, 0x1b, - 0xbc, 0x8f, 0xb7, 0xbb, 0xc8, 0xef, 0xe4, 0xdf, 0x47, 0x0e, 0x7f, 0x80, 0xfb, 0x88, 0x59, 0xde, - 0x54, 0xd5, 0xdf, 0x2c, 0x30, 0xaf, 0xd2, 0x1e, 0x20, 0x17, 0x37, 0x08, 0x69, 0xc3, 0x4f, 0xf2, - 0x84, 0x25, 0x11, 0x43, 0xb5, 0x1d, 0xe4, 0x6a, 0xbb, 0x66, 0xaf, 0xe7, 0x6a, 0x3b, 0x91, 0xa9, - 0x53, 0x79, 0xff, 0xb1, 0xc0, 0x65, 0x13, 0xf9, 0xdd, 0x20, 0xa6, 0x28, 0xa0, 0x87, 0xa8, 0x8b, - 0xe1, 0x4e, 0x91, 0x52, 0x25, 0x78, 0xa8, 0xe8, 0x5f, 0xe4, 0x8a, 0xbe, 0x69, 0x5f, 0x2b, 0x14, - 0xed, 0x0b, 0x96, 0x26, 0xea, 0x2a, 0x37, 0xfd, 0x8d, 0x05, 0x16, 0x55, 0x49, 0x4c, 0xc3, 0x3e, - 0x0e, 0x28, 0x8e, 0xe0, 0xa7, 0x79, 0xb2, 0xd3, 0x98, 0xa1, 0x6a, 0xef, 0xe4, 0xaa, 0xad, 0xd9, - 0x1f, 0xe7, 0xaa, 0x65, 0xf2, 0x5c, 0x9e, 0x3c, 0x7f, 0xcb, 0x1c, 0xf2, 0x4e, 0x95, 0xbf, 0x65, - 0x04, 0xfe, 0x01, 0xb6, 0x8c, 0x68, 0x91, 0xf9, 0x5b, 0xe6, 0x21, 0xc5, 0xa8, 0x9b, 0xbf, 0x65, - 0x38, 0xfc, 0x01, 0xb6, 0x4c, 0xcc, 0xf2, 0xa6, 0xaa, 0xda, 0x60, 0x72, 0x0f, 0x05, 0x79, 0xdd, - 0x5f, 0x83, 0xde, 0xaf, 0xfb, 0x37, 0x50, 0x00, 0x11, 0x98, 0xd8, 0xeb, 0x10, 0xb7, 0x9d, 0x4c, - 0xb1, 0xcb, 0x1a, 0x97, 0x82, 0x14, 0x51, 0x5d, 0xe2, 0x54, 0xd0, 0x9e, 0x49, 0xe7, 0x98, 0xd3, - 0x60, 0xeb, 0xe1, 0x2f, 0x41, 0x69, 0x3f, 0xc2, 0xec, 0xbe, 0x32, 0x66, 0xb8, 0xa6, 0x32, 0x28, - 0x40, 0x42, 0x30, 0xab, 0xe2, 0x1c, 0xb1, 0xe7, 0x79, 0xee, 0x29, 0xfb, 0x42, 0xff, 0x34, 0x76, - 0xad, 0x2a, 0xfc, 0x35, 0x98, 0xbc, 0x85, 0x3b, 0x98, 0xe2, 0x44, 0xbb, 0x76, 0x9d, 0x34, 0xe8, - 0x2d, 0x87, 0x70, 0x55, 0x1d, 0xc2, 0x2e, 0x28, 0x89, 0x1c, 0x06, 0xd9, 0x0a, 0x50, 0x94, 0x7a, - 0x85, 0xa7, 0x5e, 0xac, 0xce, 0x9b, 0x6e, 0x01, 0xfc, 0x83, 0x05, 0x2e, 0x8a, 0x64, 0x47, 0x18, - 0x79, 0x38, 0x6a, 0x10, 0x14, 0x79, 0xc7, 0xd8, 0x25, 0x91, 0x07, 0xab, 0x59, 0xc6, 0x4c, 0x50, - 0x11, 0xfb, 0x55, 0xce, 0x6e, 0x57, 0x2b, 0x8c, 0xbd, 0x93, 0xae, 0x76, 0xce, 0x94, 0x7f, 0xb8, - 0x12, 0x02, 0xe6, 0x04, 0xc7, 0x7d, 0x42, 0xfd, 0x13, 0x56, 0x98, 0xcc, 0x27, 0xc1, 0xcd, 0xac, - 0x08, 0x2d, 0xe0, 0x2d, 0xcb, 0xa2, 0xca, 0xcb, 0x22, 0x50, 0x56, 0xc2, 0x53, 0x30, 0x2f, 0xf2, - 0x3d, 0xa4, 0x24, 0x42, 0x4d, 0xfc, 0x55, 0xe3, 0x19, 0x76, 0x69, 0xac, 0x0f, 0x06, 0x53, 0x44, - 0x11, 0xe5, 0x2a, 0xa7, 0xbc, 0x58, 0x86, 0x8c, 0x32, 0x16, 0x4b, 0x1d, 0x8f, 0x27, 0x62, 0x65, - 0x73, 0x07, 0xfc, 0xe8, 0xf6, 0x29, 0x0e, 0x28, 0xd4, 0x0a, 0x8d, 0x1f, 0xca, 0x4d, 0xa9, 0x15, - 0x20, 0x66, 0xa1, 0x2c, 0xd3, 0x7d, 0x00, 0x0e, 0x31, 0xad, 0xcb, 0x6d, 0x9b, 0xb3, 0x56, 0x6f, - 0x14, 0x32, 0xd8, 0x9e, 0xe3, 0x09, 0x27, 0x61, 0x49, 0x69, 0x0a, 0xf0, 0x08, 0x8c, 0x1f, 0x62, - 0x2a, 0xf6, 0xfc, 0xb2, 0xb6, 0x0b, 0xe4, 0x51, 0xe3, 0x16, 0xe1, 0x88, 0x3d, 0xc3, 0x13, 0x02, - 0x38, 0xce, 0x12, 0xf6, 0x62, 0x1c, 0xc1, 0x87, 0xa0, 0x74, 0x07, 0xa3, 0x0e, 0x6d, 0xb9, 0x2d, - 0xec, 0xb6, 0x73, 0xe5, 0x15, 0x9c, 0x32, 0x9c, 0x70, 0x5a, 0x4a, 0x96, 0x6f, 0xc0, 0xc2, 0xdd, - 0x6e, 0x48, 0x22, 0x9a, 0xcc, 0xbe, 0x64, 0xef, 0x5d, 0x55, 0x25, 0x19, 0x43, 0x8a, 0x6e, 0xdb, - 0x06, 0x27, 0x5c, 0xb3, 0xe7, 0x94, 0x06, 0x92, 0x1d, 0xd8, 0x1e, 0xb8, 0xf0, 0x05, 0xf1, 0x45, - 0x0b, 0x84, 0x2b, 0x2a, 0x69, 0xff, 0x70, 0x11, 0xd1, 0x3a, 0x27, 0x5a, 0xb6, 0x97, 0x8c, 0x4d, - 0xf1, 0x19, 0xf1, 0x03, 0xf8, 0x5b, 0x30, 0xc5, 0xd2, 0x7d, 0x4d, 0x7a, 0x51, 0x80, 0xba, 0xac, - 0x58, 0xd6, 0x07, 0xa9, 0x52, 0xac, 0x88, 0xef, 0x33, 0xce, 0x77, 0x45, 0x0c, 0x4d, 0xda, 0x5f, - 0xe6, 0x9c, 0xa5, 0x7f, 0xa7, 0xcc, 0x01, 0x98, 0xba, 0xe7, 0xbb, 0x6d, 0xa5, 0xfb, 0x6b, 0xcc, - 0x3a, 0xf6, 0x7e, 0x67, 0xda, 0xf6, 0xdd, 0x36, 0x6c, 0x02, 0x70, 0x84, 0xd1, 0xa9, 0x6c, 0x72, - 0xda, 0x33, 0x4c, 0x7a, 0xbc, 0x88, 0xc7, 0xe6, 0x3c, 0x2b, 0x76, 0xd9, 0xc8, 0xd3, 0x61, 0x79, - 0xe0, 0x6f, 0xc0, 0x85, 0x23, 0x3f, 0x68, 0x8b, 0xa7, 0x8b, 0x4b, 0x86, 0x3d, 0xc1, 0x91, 0xc2, - 0x53, 0x59, 0x54, 0xa7, 0x68, 0xc7, 0x0f, 0xda, 0xf2, 0xc1, 0xc1, 0xaa, 0x42, 0x17, 0x00, 0xc6, - 0x20, 0x9f, 0x14, 0x96, 0x0c, 0x14, 0x02, 0x2a, 0x3c, 0x8d, 0x8b, 0x19, 0x0e, 0xf9, 0x10, 0x90, - 0x92, 0x48, 0xd7, 0x6f, 0x22, 0x11, 0xd0, 0x08, 0x24, 0xd2, 0xd0, 0x5b, 0xd5, 0xe4, 0x5a, 0x09, - 0x07, 0x6f, 0xba, 0x56, 0x1c, 0x19, 0xe1, 0x5a, 0x09, 0x73, 0x6e, 0x55, 0x61, 0x0c, 0x26, 0x18, - 0x43, 0xdf, 0x8d, 0x6b, 0x63, 0x5f, 0x45, 0x8a, 0x6e, 0x7d, 0x95, 0x73, 0x6d, 0x88, 0x12, 0xd3, - 0xb8, 0xb2, 0x7b, 0xf7, 0x8f, 0x16, 0xb8, 0xa8, 0xe6, 0x56, 0x4d, 0xf6, 0xa6, 0xe1, 0x2c, 0x0d, - 0x71, 0xb9, 0x3a, 0x1c, 0xe9, 0xb2, 0x36, 0x72, 0x75, 0xa8, 0xfe, 0xd9, 0xaa, 0x42, 0x02, 0xa6, - 0x98, 0x16, 0xc5, 0x30, 0xaf, 0x1a, 0x24, 0xa4, 0x70, 0x2e, 0xf3, 0x26, 0x67, 0xae, 0xd8, 0xcb, - 0x19, 0x66, 0xc5, 0x0b, 0xa7, 0x95, 0x23, 0xcd, 0xaf, 0xa9, 0x72, 0x04, 0x34, 0x42, 0xe5, 0x48, - 0x5f, 0x9b, 0x56, 0x8e, 0x30, 0xb2, 0xa6, 0xca, 0xe1, 0xc8, 0x08, 0x95, 0x23, 0x3c, 0xaa, 0x55, - 0x85, 0xdf, 0x80, 0xb9, 0x23, 0x3f, 0xa6, 0xfb, 0x2d, 0x14, 0x04, 0xb8, 0xf3, 0x25, 0x8e, 0x63, - 0xd4, 0xc4, 0x03, 0x3e, 0xc1, 0x10, 0x90, 0xd4, 0x91, 0xee, 0xfe, 0xb4, 0x18, 0xb6, 0x2a, 0x71, - 0xac, 0x90, 0x3b, 0x56, 0x57, 0xe0, 0xce, 0x99, 0xfc, 0x83, 0x1b, 0x95, 0x5f, 0x81, 0x12, 0x8b, - 0x4c, 0x06, 0xcf, 0xda, 0x20, 0x71, 0x66, 0xdc, 0x28, 0xb8, 0xc0, 0x38, 0x91, 0xb4, 0x7c, 0x50, - 0xb5, 0x7c, 0x8f, 0xd8, 0x2d, 0x8a, 0x29, 0xef, 0x79, 0x03, 0x2f, 0x74, 0xd2, 0xe3, 0x49, 0xe2, - 0x85, 0x8c, 0x4f, 0xe5, 0x79, 0x67, 0x79, 0xde, 0x12, 0x4c, 0xbd, 0x2a, 0x7c, 0xce, 0x4a, 0x4d, - 0x2e, 0x37, 0xf4, 0x74, 0x1d, 0x4b, 0xd2, 0x2f, 0x65, 0xd2, 0x33, 0x98, 0x53, 0xc8, 0xbb, 0x04, - 0xcd, 0x6d, 0x9d, 0x0f, 0xff, 0x6f, 0x2d, 0xb0, 0xc8, 0x62, 0x33, 0x86, 0x31, 0xd6, 0x9f, 0x0b, - 0xcd, 0x31, 0x89, 0x86, 0xf5, 0x81, 0x71, 0xa0, 0x87, 0x71, 0x2d, 0xd2, 0x60, 0xc2, 0x62, 0x83, - 0xf9, 0x4f, 0x0b, 0xac, 0x9b, 0xe9, 0xea, 0x11, 0xe9, 0x05, 0xde, 0x57, 0x2f, 0x02, 0x1c, 0xc1, - 0x1f, 0x17, 0xab, 0x53, 0xc2, 0xdf, 0x41, 0xe8, 0x4f, 0xb9, 0xd0, 0x1b, 0x70, 0xbb, 0x48, 0xa8, - 0x43, 0x58, 0x66, 0xe7, 0x8c, 0x7f, 0x70, 0xe5, 0x8f, 0x45, 0xc5, 0x7d, 0x89, 0xa8, 0xdb, 0xc2, - 0x86, 0x8a, 0x93, 0x80, 0xb1, 0x30, 0x38, 0x96, 0x2d, 0x8c, 0x2e, 0x3b, 0x0c, 0x9f, 0x83, 0x59, - 0x06, 0xe9, 0x8e, 0x7b, 0x63, 0x30, 0xbd, 0xd1, 0x6f, 0x6b, 0xd6, 0x47, 0x8d, 0xe0, 0x5c, 0xd2, - 0x75, 0xc3, 0xac, 0xeb, 0x7e, 0x63, 0x01, 0xc8, 0x42, 0x06, 0x4c, 0xf7, 0x95, 0x41, 0x52, 0xb3, - 0xe5, 0xd6, 0xb6, 0x84, 0x16, 0xc2, 0x69, 0x0f, 0x38, 0xed, 0xe7, 0x62, 0xf3, 0x26, 0xce, 0xfb, - 0xcc, 0x25, 0x9d, 0x0e, 0x76, 0x19, 0xfb, 0xab, 0x27, 0x1b, 0xd0, 0xce, 0xc3, 0x9c, 0x33, 0x56, - 0xb9, 0xfc, 0x82, 0xfb, 0x60, 0x9a, 0xe5, 0x4b, 0x2d, 0x56, 0x0c, 0xed, 0x41, 0x81, 0x0a, 0x98, - 0xa8, 0x2b, 0xab, 0x31, 0x29, 0xce, 0xa5, 0x2d, 0x72, 0x69, 0x33, 0x70, 0x4a, 0x37, 0x61, 0xf0, - 0x4f, 0x16, 0x58, 0xd0, 0xd3, 0x25, 0xfb, 0xe4, 0x6a, 0x3e, 0xe3, 0xc0, 0x36, 0xa9, 0x98, 0x79, - 0x95, 0xe2, 0x93, 0x33, 0x02, 0xae, 0x0d, 0xb7, 0x80, 0xf0, 0x1f, 0x16, 0xa8, 0x18, 0xa9, 0xd4, - 0x2d, 0x72, 0xa3, 0x50, 0x98, 0x61, 0x87, 0x14, 0x6b, 0xbc, 0xc9, 0x35, 0x6e, 0x43, 0xa7, 0xc0, - 0xa6, 0x66, 0xb6, 0x47, 0x28, 0xda, 0x1b, 0x6b, 0x4f, 0xb2, 0x73, 0x66, 0xda, 0x5b, 0x8a, 0x19, - 0xdb, 0x5b, 0x1f, 0xce, 0x8e, 0x00, 0x56, 0x13, 0x69, 0x65, 0xc8, 0x86, 0xfa, 0x02, 0xcc, 0x3e, - 0x88, 0x48, 0x97, 0xc8, 0x47, 0x70, 0xd1, 0x53, 0xb5, 0x7d, 0x93, 0x81, 0xdf, 0xf6, 0xe9, 0x63, - 0xc5, 0xd8, 0x53, 0x43, 0x91, 0x0e, 0x12, 0x00, 0x8f, 0x31, 0xf2, 0x86, 0x6d, 0x9e, 0x2c, 0x6e, - 0x2c, 0x4f, 0x3d, 0x24, 0x29, 0x4f, 0xbb, 0xa4, 0xec, 0x0e, 0x31, 0x6d, 0xcf, 0x1f, 0x87, 0xee, - 0x41, 0x2f, 0x70, 0xe1, 0xb4, 0xc6, 0x12, 0xba, 0xe5, 0xc1, 0x03, 0xf6, 0xf1, 0xeb, 0xba, 0xdd, - 0xa8, 0x80, 0x69, 0x50, 0xba, 0x43, 0x69, 0x78, 0x0f, 0xbf, 0x14, 0xef, 0x9f, 0xf8, 0xeb, 0x28, - 0x8c, 0x22, 0x1c, 0x7d, 0xf1, 0x82, 0xca, 0xd7, 0x51, 0x9f, 0xd8, 0x13, 0x8c, 0x29, 0x0a, 0x5d, - 0xe7, 0xcc, 0xf7, 0x5e, 0xed, 0x9e, 0x0f, 0xd1, 0xcb, 0x0e, 0x41, 0xde, 0x13, 0xf6, 0xc0, 0xa7, - 0x00, 0xd0, 0x03, 0xa5, 0x47, 0x41, 0xe7, 0x3d, 0x8c, 0xfb, 0xc7, 0x9c, 0x6f, 0x55, 0xbc, 0x82, - 0x4a, 0x2c, 0x45, 0x2f, 0xd0, 0xad, 0x7b, 0x13, 0x4c, 0x08, 0x96, 0xd1, 0xcd, 0x7b, 0x72, 0x03, - 0x97, 0x0c, 0x3c, 0xa9, 0x7d, 0xef, 0x13, 0x8d, 0x6e, 0xe0, 0x87, 0x11, 0xa5, 0x16, 0xbe, 0x7f, - 0xdd, 0x46, 0x35, 0xf1, 0xc3, 0xae, 0x5b, 0xdf, 0xc6, 0x77, 0xc1, 0x94, 0x60, 0xe9, 0x1b, 0xf9, - 0xe5, 0x21, 0x3e, 0xfa, 0xdd, 0x2c, 0xac, 0xe4, 0xea, 0xdb, 0x78, 0xab, 0x0a, 0xff, 0x6c, 0x81, - 0x25, 0x9d, 0xef, 0xfb, 0xb4, 0xf0, 0xdb, 0x5c, 0xc5, 0x67, 0xf6, 0xe6, 0x10, 0x15, 0x03, 0x26, - 0x3e, 0x06, 0x33, 0x42, 0xcf, 0xfb, 0xdb, 0x78, 0x69, 0x64, 0xec, 0x55, 0x03, 0xbb, 0x6e, 0xe4, - 0xfb, 0x35, 0x34, 0xba, 0x95, 0x1f, 0x56, 0x43, 0xa9, 0x99, 0xef, 0xd7, 0xd0, 0xa8, 0x76, 0x7e, - 0x58, 0x0d, 0xf5, 0x0d, 0x3d, 0x02, 0x93, 0x8f, 0x42, 0x0f, 0x51, 0x9c, 0xbc, 0xc8, 0xd2, 0x46, - 0x85, 0x06, 0x15, 0x35, 0x51, 0xd9, 0xc5, 0xca, 0xea, 0x5b, 0x2d, 0x46, 0x71, 0x02, 0x4a, 0x22, - 0x8f, 0xe1, 0x55, 0xaa, 0x02, 0x14, 0xa5, 0xbf, 0xcc, 0xd3, 0x2f, 0x95, 0x8d, 0xaf, 0x52, 0x19, - 0xcf, 0x5f, 0x2c, 0xb0, 0xf8, 0x38, 0xf2, 0x4d, 0x2f, 0x53, 0x35, 0xd7, 0x6b, 0x8e, 0x31, 0x9a, - 0x9c, 0x4c, 0x94, 0xbd, 0x25, 0xbf, 0x66, 0x28, 0x74, 0xbc, 0xbb, 0xe7, 0x22, 0xc1, 0x4d, 0xc1, - 0x1c, 0x67, 0x1c, 0x18, 0x1b, 0x9b, 0x19, 0x49, 0xef, 0x6a, 0xba, 0xea, 0x6e, 0x3b, 0xd6, 0x2f, - 0xba, 0x32, 0x3a, 0xbe, 0xb5, 0xc0, 0x02, 0xcf, 0x3a, 0x38, 0xed, 0x75, 0x67, 0x63, 0x0c, 0x79, - 0xcb, 0x4b, 0x51, 0xe3, 0xd4, 0x57, 0xcb, 0x05, 0xb6, 0x26, 0xb9, 0x10, 0x7b, 0xbf, 0xff, 0xe8, - 0x75, 0xfd, 0xdf, 0x63, 0xb0, 0x07, 0x26, 0xc5, 0x37, 0xe8, 0x95, 0xfa, 0x83, 0xbb, 0x95, 0xd3, - 0x1d, 0xfb, 0x29, 0x58, 0xff, 0xba, 0x85, 0x2b, 0xc9, 0xc1, 0x1e, 0x6d, 0x91, 0x28, 0xae, 0x6c, - 0x56, 0xf6, 0x49, 0x40, 0x23, 0xbf, 0xd1, 0xa3, 0x84, 0xcd, 0xf7, 0x16, 0xa5, 0x61, 0xbc, 0xeb, - 0x38, 0xc3, 0xbe, 0xb3, 0x2f, 0xcf, 0xb7, 0x70, 0xa7, 0x43, 0x3e, 0x4f, 0x01, 0x16, 0xb7, 0xf3, - 0xd1, 0x4e, 0x6d, 0xab, 0x3c, 0xb5, 0xbd, 0x73, 0xb3, 0xb6, 0x55, 0xdb, 0xaa, 0x6d, 0xef, 0xde, - 0xbc, 0xf1, 0x93, 0xad, 0xaa, 0x65, 0xed, 0xcc, 0xb0, 0x09, 0x24, 0xad, 0xb1, 0xf3, 0x2c, 0x26, - 0xc1, 0x6e, 0xe6, 0xc8, 0x93, 0x9f, 0x83, 0x69, 0xf5, 0xeb, 0x9c, 0xb1, 0x71, 0x6b, 0x60, 0xa0, - 0x82, 0x55, 0x7d, 0xe0, 0x4e, 0x8d, 0x8f, 0x95, 0xc7, 0x99, 0xd8, 0xa7, 0x6d, 0xfc, 0xb2, 0x32, - 0x26, 0xbf, 0x0f, 0x4a, 0xe3, 0xa3, 0x5d, 0xb0, 0x2c, 0x4f, 0x35, 0xc6, 0xd1, 0x29, 0x8e, 0x2a, - 0x1e, 0x71, 0x7b, 0xec, 0x62, 0x09, 0x8b, 0xbe, 0x9c, 0x9c, 0xa8, 0x7e, 0x12, 0x8e, 0x47, 0xdc, - 0x18, 0x2c, 0xb9, 0xa4, 0x5b, 0x53, 0x80, 0xf4, 0xfe, 0xec, 0xc9, 0x8b, 0x5a, 0x0f, 0xfd, 0xc3, - 0x28, 0x74, 0x1f, 0x58, 0x4f, 0xce, 0xcb, 0x5f, 0x58, 0xbc, 0x19, 0xfb, 0xe1, 0xfd, 0x7b, 0x0f, - 0xf6, 0xfe, 0x3e, 0x26, 0x7f, 0xb8, 0xd0, 0x38, 0xc7, 0x37, 0xd6, 0x8d, 0xff, 0x07, 0x00, 0x00, - 0xff, 0xff, 0xa7, 0xf2, 0xbc, 0x09, 0x8b, 0x21, 0x00, 0x00, + // 2197 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0x5d, 0x6f, 0xdb, 0xc8, + 0xd5, 0x7e, 0xe9, 0x7d, 0x9b, 0x8f, 0x91, 0xed, 0xd8, 0xe3, 0x8f, 0xc4, 0xf2, 0x47, 0x64, 0xc6, + 0xf1, 0x66, 0xb5, 0x89, 0x68, 0x3b, 0x2d, 0x82, 0xfa, 0x66, 0x57, 0x76, 0x62, 0x27, 0x1b, 0x6f, + 0x36, 0x75, 0x36, 0x0d, 0x1a, 0xa0, 0x48, 0x47, 0xe4, 0x58, 0x62, 0x24, 0x71, 0x18, 0x72, 0xe4, + 0x34, 0x30, 0x82, 0x05, 0x0a, 0x14, 0x05, 0x5a, 0xa0, 0x58, 0x64, 0x8b, 0x5e, 0xf5, 0x2a, 0x97, + 0xbd, 0x29, 0xd0, 0x9b, 0xde, 0xb4, 0xbf, 0xa2, 0x7f, 0xa1, 0x3f, 0xa4, 0x98, 0x0f, 0x8a, 0x33, + 0xe4, 0x50, 0x4c, 0x9c, 0xe6, 0x4a, 0x36, 0xcf, 0x99, 0xf3, 0x3c, 0x1c, 0x9e, 0x73, 0xe6, 0x39, + 0x94, 0xc0, 0x1c, 0x0a, 0xfd, 0x76, 0x14, 0xba, 0x8e, 0xfc, 0x6c, 0x84, 0x11, 0xa1, 0x04, 0x82, + 0x00, 0x75, 0x51, 0x1f, 0x35, 0x50, 0xe8, 0x57, 0x97, 0xda, 0x84, 0xb4, 0x7b, 0x98, 0x79, 0x38, + 0x28, 0x08, 0x08, 0x45, 0xd4, 0x27, 0x41, 0x2c, 0x3c, 0xab, 0x8b, 0xd2, 0xca, 0xff, 0x6b, 0x0d, + 0x8e, 0x1c, 0xdc, 0x0f, 0xe9, 0x2b, 0x69, 0xbc, 0xce, 0x3f, 0xdc, 0x1b, 0x6d, 0x1c, 0xdc, 0x88, + 0x5f, 0xa2, 0x76, 0x1b, 0x47, 0x0e, 0x09, 0xf9, 0x72, 0x43, 0xa8, 0xcd, 0xb6, 0x4f, 0x3b, 0x83, + 0x56, 0xc3, 0x25, 0x7d, 0xa7, 0x83, 0x23, 0xe2, 0xbb, 0x3d, 0xd4, 0x8a, 0x1d, 0x41, 0xe5, 0x86, + 0x4b, 0xfa, 0x7d, 0x12, 0x08, 0x16, 0xa1, 0x2f, 0x96, 0x6c, 0xfd, 0xed, 0x0b, 0x70, 0xe6, 0x01, + 0xb7, 0xc3, 0x27, 0x00, 0x34, 0x3d, 0x6f, 0x2f, 0xf2, 0x71, 0xe0, 0xc5, 0x70, 0xb9, 0x91, 0xde, + 0x41, 0x23, 0xbd, 0x7e, 0x88, 0x5f, 0x0c, 0x70, 0x4c, 0xab, 0xf3, 0x0d, 0x41, 0xbb, 0x91, 0xd0, + 0x6e, 0xdc, 0x61, 0xb4, 0x6d, 0xf8, 0x9b, 0x7f, 0xff, 0xe7, 0x87, 0xb1, 0x71, 0x1b, 0x38, 0xc7, + 0x5b, 0xce, 0x11, 0x5f, 0x03, 0xbb, 0x60, 0xa2, 0xe9, 0x79, 0xfb, 0x11, 0x19, 0x84, 0x8f, 0x63, + 0x1c, 0xc5, 0xb0, 0x96, 0x89, 0x9d, 0x9a, 0xca, 0xc2, 0xd7, 0x78, 0xf8, 0xaa, 0x7d, 0x89, 0x85, + 0x6f, 0xb3, 0x65, 0xce, 0x09, 0xff, 0x78, 0xe6, 0x7b, 0xaf, 0x1d, 0xe4, 0x79, 0xf0, 0x07, 0x0b, + 0x4c, 0x37, 0x07, 0xb4, 0x83, 0x03, 0xea, 0xbb, 0x88, 0xe2, 0x66, 0x18, 0xf6, 0x30, 0x5c, 0xd3, + 0x10, 0xb3, 0xe6, 0x04, 0x75, 0x46, 0xf5, 0x7a, 0x84, 0xe3, 0xd8, 0x27, 0x81, 0xbd, 0xfb, 0xa6, + 0x39, 0xdd, 0xba, 0x00, 0x26, 0xc0, 0xf9, 0x1d, 0x14, 0xfb, 0x2e, 0x5b, 0x0c, 0xff, 0x8f, 0xd3, + 0xf8, 0xcc, 0x5e, 0x61, 0x34, 0x90, 0xeb, 0x92, 0x41, 0x40, 0x1d, 0xa4, 0x84, 0x75, 0x10, 0x8b, + 0xbb, 0x7d, 0x56, 0xda, 0xe0, 0x9f, 0x2d, 0x00, 0x55, 0xd8, 0xdd, 0x41, 0x4c, 0x49, 0x1f, 0x5e, + 0x2d, 0xa2, 0x25, 0xec, 0x23, 0x79, 0xdd, 0x2e, 0xe4, 0x55, 0xb7, 0x2f, 0x17, 0xf2, 0x72, 0x79, + 0xe0, 0x62, 0x62, 0xb7, 0xf1, 0xb1, 0xef, 0xe2, 0x62, 0x62, 0xc2, 0xfe, 0x11, 0x88, 0x79, 0x3c, + 0x70, 0x4a, 0x2c, 0xfb, 0x1c, 0xef, 0xf4, 0x91, 0xdf, 0x2b, 0x7e, 0x8e, 0xdc, 0xfc, 0x11, 0x9e, + 0x23, 0x66, 0x71, 0x53, 0x56, 0x7f, 0xb1, 0xc0, 0xac, 0x0a, 0xbb, 0x87, 0x5c, 0xdc, 0x22, 0xa4, + 0x0b, 0x3f, 0x2d, 0x22, 0x96, 0x78, 0x8c, 0xe4, 0xb6, 0x57, 0xc8, 0xed, 0xba, 0xbd, 0x5a, 0xc8, + 0xed, 0x48, 0x86, 0x4e, 0xe9, 0xfd, 0xcb, 0x02, 0x97, 0x4d, 0xe0, 0xf7, 0x82, 0x98, 0xa2, 0x80, + 0xee, 0xa3, 0x3e, 0x86, 0x5b, 0x65, 0x4c, 0x15, 0xe7, 0x91, 0xa4, 0x7f, 0x56, 0x48, 0xfa, 0x96, + 0x7d, 0xbd, 0x94, 0xb4, 0x2f, 0x50, 0xda, 0xa8, 0xaf, 0x3c, 0xf4, 0xb7, 0x16, 0x98, 0x57, 0x29, + 0x31, 0x0e, 0xbb, 0x38, 0xa0, 0x38, 0x82, 0x9f, 0x15, 0xd1, 0x4e, 0x7d, 0x46, 0xb2, 0xbd, 0x5b, + 0xc8, 0xb6, 0x61, 0x5f, 0x29, 0x64, 0xcb, 0xe8, 0xb9, 0x3c, 0x78, 0x71, 0xc9, 0xec, 0xf3, 0x4e, + 0x55, 0x5c, 0x32, 0xc2, 0xfe, 0x11, 0x4a, 0x46, 0xb4, 0xc8, 0xe2, 0x92, 0x79, 0x44, 0x31, 0xea, + 0x17, 0x97, 0x0c, 0x37, 0x7f, 0x84, 0x92, 0x89, 0x59, 0xdc, 0x94, 0x55, 0x17, 0x4c, 0xec, 0xa0, + 0xa0, 0xa8, 0xfb, 0x6b, 0xa6, 0x0f, 0xeb, 0xfe, 0x2d, 0x14, 0x40, 0x04, 0xc6, 0x77, 0x7a, 0xc4, + 0xed, 0x26, 0xa7, 0xd8, 0x65, 0x0d, 0x4b, 0xb1, 0x94, 0x41, 0x5d, 0xe2, 0x50, 0xd0, 0x9e, 0x4a, + 0xcf, 0x31, 0xa7, 0xc5, 0xd6, 0xc3, 0x9f, 0x83, 0xca, 0x6e, 0x84, 0xd9, 0x73, 0x65, 0xc8, 0x70, + 0x45, 0x45, 0x50, 0x0c, 0x09, 0xc0, 0xb4, 0x6a, 0xe7, 0x16, 0x7b, 0x96, 0xc7, 0x9e, 0xb4, 0xcf, + 0x0f, 0x6f, 0x63, 0xdb, 0xaa, 0xc3, 0x5f, 0x82, 0x89, 0xdb, 0xb8, 0x87, 0x29, 0x4e, 0xb8, 0x6b, + 0xfb, 0xa4, 0x99, 0xde, 0xf1, 0x10, 0xae, 0xab, 0x87, 0xb0, 0x0b, 0x2a, 0x22, 0x86, 0x81, 0xb6, + 0x62, 0x28, 0x0b, 0xbd, 0xc4, 0x43, 0xcf, 0xd7, 0x67, 0x4d, 0x8f, 0x00, 0xfe, 0xce, 0x02, 0x17, + 0x45, 0xb0, 0x03, 0x8c, 0x3c, 0x1c, 0xb5, 0x08, 0x8a, 0xbc, 0x43, 0xec, 0x92, 0xc8, 0x83, 0xf5, + 0x3c, 0x62, 0xce, 0xa9, 0x0c, 0xfd, 0x1a, 0x47, 0xb7, 0xeb, 0x35, 0x86, 0xde, 0x4b, 0x57, 0x3b, + 0x27, 0xca, 0x3f, 0x9c, 0x09, 0x01, 0x33, 0x02, 0xe3, 0x01, 0xa1, 0xfe, 0x11, 0x4b, 0x4c, 0xa6, + 0x93, 0xe0, 0x7a, 0x9e, 0x84, 0xe6, 0xf0, 0x8e, 0x69, 0x51, 0xe7, 0x69, 0x11, 0x28, 0x2b, 0xe1, + 0x31, 0x98, 0x15, 0xf1, 0x1e, 0x51, 0x12, 0xa1, 0x36, 0xfe, 0xa6, 0xf5, 0x1c, 0xbb, 0x34, 0xd6, + 0x0f, 0x06, 0x93, 0x47, 0x19, 0xe4, 0x32, 0x87, 0xbc, 0x58, 0x85, 0x0c, 0x32, 0x16, 0x4b, 0x1d, + 0x8f, 0x07, 0x62, 0x69, 0x73, 0x17, 0xfc, 0xe8, 0xce, 0x31, 0x0e, 0x28, 0xd4, 0x12, 0x8d, 0x5f, + 0x2a, 0x0c, 0xa9, 0x25, 0x20, 0x66, 0xae, 0x2c, 0xd2, 0x03, 0x00, 0xf6, 0x31, 0x6d, 0xca, 0xb2, + 0x2d, 0x58, 0xab, 0x37, 0x0a, 0xe9, 0x6c, 0xcf, 0xf0, 0x80, 0x13, 0xb0, 0xa2, 0x34, 0x05, 0x78, + 0x00, 0xce, 0xed, 0x63, 0x2a, 0x6a, 0x7e, 0x51, 0xab, 0x02, 0x79, 0xd5, 0x58, 0x22, 0xdc, 0x62, + 0x4f, 0xf1, 0x80, 0x00, 0x9e, 0x63, 0x01, 0x07, 0x31, 0x8e, 0xe0, 0x23, 0x50, 0xb9, 0x8b, 0x51, + 0x8f, 0x76, 0xdc, 0x0e, 0x76, 0xbb, 0x85, 0xf4, 0x4a, 0x6e, 0x19, 0x8e, 0x3b, 0x1d, 0x25, 0xca, + 0x77, 0x60, 0xee, 0x5e, 0x3f, 0x24, 0x11, 0x4d, 0xce, 0xbe, 0xa4, 0xf6, 0xae, 0xa9, 0x94, 0x8c, + 0x2e, 0x65, 0x8f, 0x6d, 0x8d, 0x03, 0xae, 0xd8, 0x33, 0x4a, 0x03, 0xc9, 0x1f, 0xd8, 0x1e, 0x38, + 0xff, 0x15, 0xf1, 0x45, 0x0b, 0x84, 0x4b, 0x2a, 0xe8, 0xf0, 0x72, 0x19, 0xd0, 0x2a, 0x07, 0x5a, + 0xb4, 0x17, 0x8c, 0x4d, 0xf1, 0x39, 0xf1, 0x03, 0xf8, 0x6b, 0x30, 0xc9, 0xc2, 0x7d, 0x4b, 0x06, + 0x51, 0x80, 0xfa, 0x2c, 0x59, 0x56, 0xb3, 0x50, 0xa9, 0xad, 0x0c, 0xef, 0x73, 0x8e, 0x77, 0x55, + 0x1c, 0x9a, 0x74, 0xb8, 0xcc, 0x39, 0x49, 0xff, 0x4e, 0x91, 0x03, 0x30, 0x79, 0xdf, 0x77, 0xbb, + 0x4a, 0xf7, 0xd7, 0x90, 0x75, 0xdb, 0x87, 0xdd, 0x69, 0xd7, 0x77, 0xbb, 0xb0, 0x0d, 0xc0, 0x01, + 0x46, 0xc7, 0xb2, 0xc9, 0x69, 0x33, 0x4c, 0x7a, 0xbd, 0x0c, 0xc7, 0xe6, 0x38, 0x4b, 0x76, 0xd5, + 0x88, 0xd3, 0x63, 0x71, 0xe0, 0xaf, 0xc0, 0xf9, 0x03, 0x3f, 0xe8, 0x8a, 0xe9, 0xe2, 0x92, 0xa1, + 0x26, 0xb8, 0xa5, 0xf4, 0x56, 0xe6, 0xd5, 0x53, 0xb4, 0xe7, 0x07, 0x5d, 0x39, 0x38, 0x58, 0x75, + 0xe8, 0x02, 0xc0, 0x10, 0xe4, 0xa4, 0xb0, 0x60, 0x80, 0x10, 0xa6, 0xd2, 0xdb, 0xb8, 0x98, 0xc3, + 0x90, 0x43, 0x40, 0x0a, 0x22, 0x55, 0xbf, 0x09, 0x44, 0x98, 0x4e, 0x01, 0x22, 0x05, 0xbd, 0x55, + 0x4f, 0xf6, 0x4a, 0x28, 0x78, 0xd3, 0x5e, 0x71, 0xcb, 0x29, 0xf6, 0x4a, 0x88, 0x73, 0xab, 0x0e, + 0x63, 0x30, 0xce, 0x10, 0x86, 0x6a, 0x5c, 0x3b, 0xf6, 0x55, 0x4b, 0xd9, 0xa3, 0xaf, 0x73, 0xac, + 0x35, 0x91, 0x62, 0x1a, 0x56, 0xbe, 0x76, 0x7f, 0x6f, 0x81, 0x8b, 0x6a, 0x6c, 0x55, 0x64, 0xaf, + 0x1b, 0xee, 0xd2, 0xe0, 0x57, 0xc8, 0xc3, 0x91, 0x2a, 0x6b, 0xad, 0x90, 0x87, 0xaa, 0x9f, 0xad, + 0x3a, 0x24, 0x60, 0x92, 0x71, 0x51, 0x04, 0xf3, 0xb2, 0x81, 0x42, 0x6a, 0x2e, 0x44, 0x5e, 0xe7, + 0xc8, 0x35, 0x7b, 0x31, 0x87, 0xac, 0x68, 0xe1, 0x34, 0x73, 0xa4, 0xf8, 0x35, 0x65, 0x8e, 0x30, + 0x9d, 0x22, 0x73, 0xa4, 0xae, 0x4d, 0x33, 0x47, 0x08, 0x59, 0x53, 0xe6, 0x70, 0xcb, 0x29, 0x32, + 0x47, 0x68, 0x54, 0xab, 0x0e, 0xbf, 0x03, 0x33, 0x07, 0x7e, 0x4c, 0x77, 0x3b, 0x28, 0x08, 0x70, + 0xef, 0x6b, 0x1c, 0xc7, 0xa8, 0x8d, 0x33, 0x3a, 0xc1, 0xe0, 0x90, 0xe4, 0x91, 0xae, 0xfe, 0x34, + 0x1f, 0xb6, 0x2a, 0x51, 0xac, 0x90, 0x2b, 0x56, 0x57, 0xd8, 0x9d, 0x13, 0xf9, 0x07, 0x17, 0x2a, + 0xbf, 0x00, 0x15, 0xe6, 0x99, 0x1c, 0x3c, 0x2b, 0x59, 0xe0, 0xdc, 0x71, 0xa3, 0xd8, 0x85, 0x8d, + 0x03, 0x49, 0xc9, 0x07, 0x55, 0xc9, 0xf7, 0x98, 0x3d, 0xa2, 0x98, 0xf2, 0x9e, 0x97, 0x79, 0xa1, + 0x93, 0x5e, 0x4f, 0x02, 0xcf, 0xe5, 0x74, 0x2a, 0x8f, 0x3b, 0xcd, 0xe3, 0x56, 0x60, 0xaa, 0x55, + 0xe1, 0x0b, 0x96, 0x6a, 0x72, 0xb9, 0xa1, 0xa7, 0xeb, 0xb6, 0x24, 0xfc, 0x42, 0x2e, 0x3c, 0x33, + 0x73, 0x08, 0xf9, 0x94, 0xa0, 0xb9, 0xad, 0xf3, 0xc3, 0xff, 0x7b, 0x0b, 0xcc, 0x33, 0xdf, 0x9c, + 0x60, 0x8c, 0xf5, 0xb9, 0xd0, 0xec, 0x93, 0x70, 0x58, 0xcd, 0x1c, 0x07, 0xba, 0x1b, 0xe7, 0x22, + 0x05, 0x26, 0x2c, 0x17, 0x98, 0xff, 0xb0, 0xc0, 0xaa, 0x19, 0xae, 0x19, 0x91, 0x41, 0xe0, 0x7d, + 0xf3, 0x32, 0xc0, 0x11, 0xfc, 0x71, 0x39, 0x3b, 0xc5, 0xfd, 0x3d, 0x88, 0xfe, 0x94, 0x13, 0xbd, + 0x09, 0x37, 0xcb, 0x88, 0x3a, 0x84, 0x45, 0x76, 0x4e, 0xf8, 0x07, 0x67, 0xfe, 0x44, 0x64, 0xdc, + 0xd7, 0x88, 0xba, 0x1d, 0x6c, 0xc8, 0x38, 0x69, 0x30, 0x26, 0x06, 0xb7, 0xe5, 0x13, 0xa3, 0xcf, + 0x2e, 0xc3, 0x17, 0x60, 0x9a, 0x99, 0x74, 0xc5, 0xbd, 0x96, 0x0d, 0x6f, 0xd4, 0xdb, 0x9a, 0xf4, + 0x51, 0x3d, 0x38, 0x96, 0x54, 0xdd, 0x30, 0xaf, 0xba, 0xdf, 0x5a, 0x00, 0x32, 0x97, 0x8c, 0xe8, + 0xbe, 0x9a, 0x05, 0x35, 0x4b, 0x6e, 0xad, 0x24, 0x34, 0x17, 0x0e, 0xbb, 0xc7, 0x61, 0xbf, 0x14, + 0xc5, 0x9b, 0x28, 0xef, 0x13, 0x97, 0xf4, 0x7a, 0xd8, 0x65, 0xe8, 0xaf, 0x9f, 0xae, 0x41, 0xbb, + 0xc8, 0xe6, 0x9c, 0xb0, 0xcc, 0xe5, 0x1b, 0xee, 0x83, 0x0b, 0x2c, 0x5e, 0x2a, 0xb1, 0x62, 0x68, + 0x67, 0x09, 0x2a, 0xc6, 0x84, 0x5d, 0x55, 0xf5, 0x49, 0xed, 0x9c, 0xda, 0x3c, 0xa7, 0x36, 0x05, + 0x27, 0x75, 0x11, 0x06, 0xff, 0x60, 0x81, 0x39, 0x3d, 0x5c, 0x52, 0x27, 0xd7, 0x8a, 0x11, 0x33, + 0x65, 0x52, 0x33, 0xe3, 0x2a, 0xc9, 0x27, 0xcf, 0x08, 0xb8, 0x32, 0x5a, 0x02, 0xc2, 0xbf, 0x5b, + 0xa0, 0x66, 0x84, 0x52, 0x4b, 0xe4, 0x66, 0x29, 0x31, 0x43, 0x85, 0x94, 0x73, 0xbc, 0xc5, 0x39, + 0x6e, 0x42, 0xa7, 0x44, 0xa6, 0xe6, 0xca, 0x23, 0x14, 0xed, 0x8d, 0xb5, 0x27, 0xd9, 0x39, 0x73, + 0xed, 0x2d, 0xb5, 0x19, 0xdb, 0xdb, 0xd0, 0x9c, 0x3f, 0x02, 0x58, 0x4e, 0xa4, 0x99, 0x21, 0x1b, + 0xea, 0x4b, 0x30, 0xfd, 0x30, 0x22, 0x7d, 0x22, 0x47, 0x70, 0xd1, 0x53, 0xb5, 0xba, 0xc9, 0x99, + 0xdf, 0x75, 0xfa, 0x58, 0x32, 0xf6, 0xd4, 0x50, 0x84, 0x83, 0x14, 0x4c, 0xdd, 0xc6, 0x19, 0xdc, + 0x2b, 0xfa, 0xbc, 0xfa, 0x7e, 0xb0, 0x57, 0x38, 0xec, 0xb2, 0x10, 0x0f, 0x39, 0x58, 0x8f, 0x47, + 0x83, 0x04, 0xc0, 0x43, 0x8c, 0xbc, 0x51, 0x25, 0x9b, 0xb7, 0x1b, 0x8b, 0x42, 0x77, 0x49, 0x8a, + 0xc2, 0xae, 0x28, 0x35, 0x29, 0xce, 0xf8, 0xb3, 0x87, 0xa1, 0xbb, 0x37, 0x08, 0x5c, 0x78, 0x41, + 0x43, 0x09, 0xdd, 0x6a, 0xf6, 0x82, 0x7d, 0xf8, 0xa6, 0x69, 0xb7, 0x6a, 0xe0, 0x02, 0xa8, 0xdc, + 0xa5, 0x34, 0xbc, 0x8f, 0x5f, 0x89, 0xb7, 0x5e, 0xfc, 0x25, 0x18, 0x46, 0x11, 0x8e, 0xbe, 0x7a, + 0x49, 0xe5, 0x4b, 0xb0, 0x4f, 0xed, 0x71, 0x86, 0x14, 0x85, 0xae, 0x73, 0xe2, 0x7b, 0xaf, 0xb7, + 0xcf, 0x86, 0xe8, 0x55, 0x8f, 0x20, 0xef, 0x29, 0x1b, 0x33, 0x15, 0x03, 0xf4, 0x40, 0xe5, 0x71, + 0xd0, 0xfb, 0x80, 0x71, 0x21, 0xd9, 0xd7, 0x4b, 0xaa, 0x90, 0x19, 0x04, 0xfa, 0xc0, 0xd0, 0x06, + 0xe3, 0x02, 0xe5, 0xf4, 0x23, 0x43, 0x92, 0x36, 0x0b, 0x06, 0x9c, 0x74, 0x68, 0x18, 0x02, 0x9d, + 0x7e, 0x6c, 0x18, 0x05, 0x94, 0x0e, 0x0e, 0xc3, 0x7d, 0x3b, 0xed, 0xe8, 0x30, 0x6a, 0xdf, 0x86, + 0xc3, 0x43, 0x1f, 0x4c, 0x0a, 0x94, 0xe1, 0xf8, 0xb0, 0x38, 0x42, 0xbd, 0xbf, 0x9f, 0x70, 0x96, + 0x58, 0xc3, 0xe1, 0xc1, 0xaa, 0xc3, 0x3f, 0x5a, 0x60, 0x41, 0xc7, 0xfb, 0x5f, 0x0e, 0x0e, 0x9b, + 0x9c, 0xc5, 0xe7, 0xf6, 0xfa, 0x08, 0x16, 0x99, 0xd1, 0x21, 0x06, 0x53, 0x82, 0xcf, 0x87, 0x0f, + 0x0f, 0x52, 0x3e, 0xd9, 0xcb, 0x06, 0x74, 0x7d, 0x7c, 0x18, 0xe6, 0xd0, 0xe9, 0x07, 0x88, 0x51, + 0x39, 0x94, 0x8e, 0x10, 0xc3, 0x1c, 0x3a, 0xed, 0x10, 0x31, 0x2a, 0x87, 0x86, 0x63, 0x04, 0x02, + 0x13, 0x8f, 0x43, 0x0f, 0x51, 0x9c, 0xbc, 0x3e, 0xd3, 0x0e, 0x28, 0xcd, 0x54, 0xd6, 0x43, 0x65, + 0x17, 0xab, 0xaa, 0xef, 0xd2, 0x18, 0xc4, 0x11, 0xa8, 0x88, 0x38, 0x86, 0x17, 0xb8, 0x8a, 0xa1, + 0x2c, 0xfc, 0x65, 0x1e, 0x7e, 0xa1, 0x6a, 0x7c, 0x81, 0xcb, 0x70, 0xfe, 0x64, 0x81, 0xf9, 0x27, + 0x91, 0x6f, 0x7a, 0x85, 0xab, 0x69, 0x6d, 0xb3, 0x8f, 0x51, 0x5a, 0xe5, 0xbc, 0xec, 0x0d, 0xf9, + 0xe5, 0x46, 0xa9, 0xce, 0xde, 0x3e, 0x13, 0x09, 0x6c, 0x0a, 0x66, 0x38, 0x62, 0xe6, 0xd8, 0x58, + 0xcf, 0x51, 0x7a, 0x5f, 0xa9, 0xd7, 0x74, 0xbb, 0xb1, 0xbe, 0xe9, 0xca, 0xd1, 0xf1, 0xbd, 0x05, + 0xe6, 0x78, 0xd4, 0xac, 0xc6, 0xd0, 0xf5, 0x94, 0xd1, 0xe5, 0x1d, 0xb7, 0xa2, 0xc1, 0xa1, 0xaf, + 0x55, 0x4b, 0xc4, 0x54, 0xb2, 0x11, 0x3b, 0xbf, 0xfd, 0xe4, 0x4d, 0xf3, 0x9f, 0x63, 0x70, 0x00, + 0x26, 0xc4, 0xf7, 0xf6, 0xb5, 0xe6, 0xc3, 0x7b, 0xb5, 0xe3, 0x2d, 0xfb, 0x19, 0x58, 0xfd, 0xb6, + 0x83, 0x6b, 0xc9, 0xc5, 0x01, 0xed, 0x90, 0x28, 0xae, 0xad, 0xd7, 0x76, 0x49, 0x40, 0x23, 0xbf, + 0x35, 0xa0, 0x84, 0xa9, 0x8a, 0x0e, 0xa5, 0x61, 0xbc, 0xed, 0x38, 0xa3, 0x7e, 0x29, 0x50, 0x9d, + 0xed, 0xe0, 0x5e, 0x8f, 0x7c, 0x99, 0x1a, 0x98, 0xdf, 0xd6, 0x27, 0x5b, 0x8d, 0x8d, 0xea, 0xe4, + 0xe6, 0xd6, 0xad, 0xc6, 0x46, 0x63, 0xa3, 0xb1, 0xb9, 0x7d, 0xeb, 0xe6, 0x4f, 0x36, 0xea, 0x96, + 0xb5, 0x35, 0xc5, 0x4e, 0x20, 0x29, 0xc8, 0x9d, 0xe7, 0x31, 0x09, 0xb6, 0x73, 0x57, 0x9e, 0x7e, + 0x01, 0x2e, 0xa8, 0x5f, 0x22, 0x8d, 0x9d, 0xb3, 0x32, 0x07, 0x2a, 0x58, 0xd6, 0x0f, 0xdc, 0xc9, + 0x73, 0x63, 0xd5, 0x73, 0x8c, 0xec, 0xb3, 0x2e, 0x7e, 0x55, 0x1b, 0x93, 0xdf, 0x42, 0xa5, 0xfe, + 0xd1, 0x36, 0x58, 0x94, 0xb7, 0x1a, 0xe3, 0xe8, 0x18, 0x47, 0x35, 0x8f, 0xb8, 0x03, 0xb6, 0x59, + 0x62, 0x30, 0x58, 0x4c, 0x6e, 0x54, 0xbf, 0x09, 0xc7, 0x23, 0x6e, 0x0c, 0x16, 0x5c, 0xd2, 0x6f, + 0x28, 0x86, 0xf4, 0xf9, 0xec, 0xc8, 0x4d, 0x6d, 0x86, 0xfe, 0x7e, 0x14, 0xba, 0x0f, 0xad, 0xa7, + 0x67, 0xe5, 0xef, 0x3a, 0xde, 0x8e, 0xfd, 0xff, 0x83, 0xfb, 0x0f, 0x77, 0xfe, 0x3a, 0x26, 0x7f, + 0x2e, 0xd1, 0x3a, 0xc3, 0x0b, 0xeb, 0xe6, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x20, 0xbe, 0x68, + 0xf2, 0x01, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // NakamaClient is the client API for Nakama service. // @@ -284,6 +286,8 @@ type NakamaClient interface { ListUserGroups(ctx context.Context, in *api.ListUserGroupsRequest, opts ...grpc.CallOption) (*api.UserGroupList, error) // Promote a set of users in a group to the next role up. PromoteGroupUsers(ctx context.Context, in *api.PromoteGroupUsersRequest, opts ...grpc.CallOption) (*empty.Empty, error) + // Demote a set of users in a group to the next role down. + DemoteGroupUsers(ctx context.Context, in *api.DemoteGroupUsersRequest, opts ...grpc.CallOption) (*empty.Empty, error) // Get storage objects. ReadStorageObjects(ctx context.Context, in *api.ReadStorageObjectsRequest, opts ...grpc.CallOption) (*api.StorageObjects, error) // Execute a Lua function on the server. @@ -319,10 +323,10 @@ type NakamaClient interface { } type nakamaClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewNakamaClient(cc *grpc.ClientConn) NakamaClient { +func NewNakamaClient(cc grpc.ClientConnInterface) NakamaClient { return &nakamaClient{cc} } @@ -785,6 +789,15 @@ func (c *nakamaClient) PromoteGroupUsers(ctx context.Context, in *api.PromoteGro return out, nil } +func (c *nakamaClient) DemoteGroupUsers(ctx context.Context, in *api.DemoteGroupUsersRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/nakama.api.Nakama/DemoteGroupUsers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *nakamaClient) ReadStorageObjects(ctx context.Context, in *api.ReadStorageObjectsRequest, opts ...grpc.CallOption) (*api.StorageObjects, error) { out := new(api.StorageObjects) err := c.cc.Invoke(ctx, "/nakama.api.Nakama/ReadStorageObjects", in, out, opts...) @@ -1033,6 +1046,8 @@ type NakamaServer interface { ListUserGroups(context.Context, *api.ListUserGroupsRequest) (*api.UserGroupList, error) // Promote a set of users in a group to the next role up. PromoteGroupUsers(context.Context, *api.PromoteGroupUsersRequest) (*empty.Empty, error) + // Demote a set of users in a group to the next role down. + DemoteGroupUsers(context.Context, *api.DemoteGroupUsersRequest) (*empty.Empty, error) // Get storage objects. ReadStorageObjects(context.Context, *api.ReadStorageObjectsRequest) (*api.StorageObjects, error) // Execute a Lua function on the server. @@ -1224,6 +1239,9 @@ func (*UnimplementedNakamaServer) ListUserGroups(ctx context.Context, req *api.L func (*UnimplementedNakamaServer) PromoteGroupUsers(ctx context.Context, req *api.PromoteGroupUsersRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method PromoteGroupUsers not implemented") } +func (*UnimplementedNakamaServer) DemoteGroupUsers(ctx context.Context, req *api.DemoteGroupUsersRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DemoteGroupUsers not implemented") +} func (*UnimplementedNakamaServer) ReadStorageObjects(ctx context.Context, req *api.ReadStorageObjectsRequest) (*api.StorageObjects, error) { return nil, status.Errorf(codes.Unimplemented, "method ReadStorageObjects not implemented") } @@ -2195,6 +2213,24 @@ func _Nakama_PromoteGroupUsers_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Nakama_DemoteGroupUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(api.DemoteGroupUsersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NakamaServer).DemoteGroupUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nakama.api.Nakama/DemoteGroupUsers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NakamaServer).DemoteGroupUsers(ctx, req.(*api.DemoteGroupUsersRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Nakama_ReadStorageObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(api.ReadStorageObjectsRequest) if err := dec(in); err != nil { @@ -2691,6 +2727,10 @@ var _Nakama_serviceDesc = grpc.ServiceDesc{ MethodName: "PromoteGroupUsers", Handler: _Nakama_PromoteGroupUsers_Handler, }, + { + MethodName: "DemoteGroupUsers", + Handler: _Nakama_DemoteGroupUsers_Handler, + }, { MethodName: "ReadStorageObjects", Handler: _Nakama_ReadStorageObjects_Handler, diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index a349ea77b..9428198e7 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -2542,6 +2542,75 @@ func local_request_Nakama_PromoteGroupUsers_0(ctx context.Context, marshaler run } +var ( + filter_Nakama_DemoteGroupUsers_0 = &utilities.DoubleArray{Encoding: map[string]int{"group_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Nakama_DemoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq api.DemoteGroupUsersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["group_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") + } + + protoReq.GroupId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Nakama_DemoteGroupUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DemoteGroupUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Nakama_DemoteGroupUsers_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq api.DemoteGroupUsersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["group_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_id") + } + + protoReq.GroupId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_id", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Nakama_DemoteGroupUsers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DemoteGroupUsers(ctx, &protoReq) + return msg, metadata, err + +} + func request_Nakama_ReadStorageObjects_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq api.ReadStorageObjectsRequest var metadata runtime.ServerMetadata @@ -4359,6 +4428,26 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Nakama_DemoteGroupUsers_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Nakama_DemoteGroupUsers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -5780,6 +5869,26 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Nakama_DemoteGroupUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Nakama_DemoteGroupUsers_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Nakama_DemoteGroupUsers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Nakama_ReadStorageObjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6228,6 +6337,8 @@ var ( pattern_Nakama_PromoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "promote"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Nakama_DemoteGroupUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v2", "group", "group_id", "demote"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Nakama_ReadStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Nakama_RpcFunc_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "rpc", "id"}, "", runtime.AssumeColonVerbOpt(true))) @@ -6368,6 +6479,8 @@ var ( forward_Nakama_PromoteGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_DemoteGroupUsers_0 = runtime.ForwardResponseMessage + forward_Nakama_ReadStorageObjects_0 = runtime.ForwardResponseMessage forward_Nakama_RpcFunc_0 = runtime.ForwardResponseMessage diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index 296414e8f..dade8b289 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -488,6 +488,11 @@ service Nakama { option (google.api.http).post = "/v2/group/{group_id}/promote"; } + // Demote a set of users in a group to the next role down. + rpc DemoteGroupUsers (api.DemoteGroupUsersRequest) returns (google.protobuf.Empty) { + option (google.api.http).post = "/v2/group/{group_id}/demote"; + } + // Get storage objects. rpc ReadStorageObjects (api.ReadStorageObjectsRequest) returns (api.StorageObjects) { option (google.api.http) = { diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 4519ad45e..ddd0e1c5e 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -30,6 +30,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -47,6 +53,12 @@ "schema": { "$ref": "#/definitions/apiAccount" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -62,6 +74,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -89,6 +107,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -122,6 +146,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -170,6 +200,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -218,6 +254,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -266,6 +308,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -322,6 +370,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -370,6 +424,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -418,6 +478,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -466,6 +532,12 @@ "schema": { "$ref": "#/definitions/apiSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -514,6 +586,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -541,6 +619,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -568,6 +652,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -595,6 +685,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -622,6 +718,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -658,6 +760,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -686,6 +794,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -713,6 +827,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -740,6 +860,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -767,6 +893,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -794,6 +926,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -821,6 +959,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -848,6 +992,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -875,6 +1025,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -902,6 +1058,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -929,6 +1091,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -956,6 +1124,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -983,6 +1157,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1010,6 +1190,12 @@ "schema": { "$ref": "#/definitions/apiChannelMessageList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1059,6 +1245,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1086,6 +1278,12 @@ "schema": { "$ref": "#/definitions/apiFriendList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1126,6 +1324,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1165,6 +1369,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1204,6 +1414,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1243,6 +1459,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1279,6 +1501,12 @@ "schema": { "$ref": "#/definitions/apiGroupList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1318,6 +1546,12 @@ "schema": { "$ref": "#/definitions/apiGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1345,6 +1579,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1369,6 +1609,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1403,6 +1649,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1439,6 +1691,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1465,6 +1723,38 @@ ] } }, + "/v2/group/{group_id}/demote": { + "post": { + "summary": "Demote a set of users in a group to the next role down.", + "operationId": "DemoteGroupUsers", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "group_id", + "description": "The group ID to demote in.", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "Nakama" + ] + } + }, "/v2/group/{group_id}/join": { "post": { "summary": "Immediately join an open group, or request to join a closed one.", @@ -1475,6 +1765,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1501,6 +1797,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1537,6 +1839,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1563,6 +1871,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1599,6 +1913,12 @@ "schema": { "$ref": "#/definitions/apiGroupUserList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1648,6 +1968,12 @@ "schema": { "$ref": "#/definitions/apiLeaderboardRecordList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1706,6 +2032,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1730,6 +2062,12 @@ "schema": { "$ref": "#/definitions/apiLeaderboardRecord" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1765,6 +2103,12 @@ "schema": { "$ref": "#/definitions/apiLeaderboardRecordList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1814,6 +2158,12 @@ "schema": { "$ref": "#/definitions/apiMatchList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1879,6 +2229,12 @@ "schema": { "$ref": "#/definitions/apiNotificationList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1911,6 +2267,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1941,6 +2303,12 @@ "schema": { "$ref": "#/definitions/apiRpc" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1985,6 +2353,12 @@ "schema": { "$ref": "#/definitions/apiRpc" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2026,6 +2400,12 @@ "schema": { "$ref": "#/definitions/apiStorageObjects" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2051,6 +2431,12 @@ "schema": { "$ref": "#/definitions/apiStorageObjectAcks" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2078,6 +2464,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2105,6 +2497,12 @@ "schema": { "$ref": "#/definitions/apiStorageObjectList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2153,6 +2551,12 @@ "schema": { "$ref": "#/definitions/apiStorageObjectList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2201,6 +2605,12 @@ "schema": { "$ref": "#/definitions/apiTournamentList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2267,6 +2677,12 @@ "schema": { "$ref": "#/definitions/apiTournamentRecordList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2325,6 +2741,12 @@ "schema": { "$ref": "#/definitions/apiLeaderboardRecord" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2360,6 +2782,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2386,6 +2814,12 @@ "schema": { "$ref": "#/definitions/apiTournamentRecordList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2435,6 +2869,12 @@ "schema": { "$ref": "#/definitions/apiUsers" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2487,6 +2927,12 @@ "schema": { "$ref": "#/definitions/apiUserGroupList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3823,6 +4269,42 @@ } }, "description": "Write objects to the storage engine." + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } } }, "securityDefinitions": { diff --git a/console/console.pb.go b/console/console.pb.go index f04c0d901..c78a86951 100644 --- a/console/console.pb.go +++ b/console/console.pb.go @@ -1667,11 +1667,11 @@ var fileDescriptor_9289ac5ba895f2a7 = []byte{ // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // ConsoleClient is the client API for Console service. // @@ -1742,10 +1742,10 @@ type ConsoleClient interface { } type consoleClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewConsoleClient(cc *grpc.ClientConn) ConsoleClient { +func NewConsoleClient(cc grpc.ClientConnInterface) ConsoleClient { return &consoleClient{cc} } diff --git a/console/console.swagger.json b/console/console.swagger.json index b94471877..a203e27e2 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -30,6 +30,12 @@ "schema": { "$ref": "#/definitions/nakamaconsoleAccount" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -54,6 +60,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -86,6 +98,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -120,6 +138,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -146,6 +170,12 @@ "schema": { "$ref": "#/definitions/consoleAccountExport" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -172,6 +202,12 @@ "schema": { "$ref": "#/definitions/apiFriendList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -198,6 +234,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -231,6 +273,12 @@ "schema": { "$ref": "#/definitions/apiUserGroupList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -257,6 +305,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -290,6 +344,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -316,6 +376,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -342,6 +408,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -368,6 +440,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -402,6 +480,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -428,6 +512,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -454,6 +544,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -480,6 +576,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -506,6 +608,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -532,6 +640,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -558,6 +672,12 @@ "schema": { "$ref": "#/definitions/consoleWalletLedgerList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -584,6 +704,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -617,6 +743,12 @@ "schema": { "$ref": "#/definitions/consoleConsoleSession" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -649,6 +781,12 @@ "schema": { "$ref": "#/definitions/consoleConfig" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -666,6 +804,12 @@ "schema": { "$ref": "#/definitions/consoleStatusList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -683,6 +827,12 @@ "schema": { "$ref": "#/definitions/consoleStorageList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -707,6 +857,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -724,6 +880,12 @@ "schema": { "$ref": "#/definitions/apiStorageObject" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -762,6 +924,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -807,6 +975,12 @@ "schema": { "$ref": "#/definitions/apiStorageObjectAck" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -855,6 +1029,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -902,6 +1082,12 @@ "schema": { "$ref": "#/definitions/consoleUserList" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -942,6 +1128,12 @@ "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -1838,6 +2030,42 @@ } }, "description": "Update user account information." + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." + } + }, + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } } }, "securityDefinitions": { diff --git a/go.mod b/go.mod index 9924a3b2c..998feb54c 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/gorilla/mux v1.7.4 github.com/gorilla/websocket v1.4.2 github.com/grpc-ecosystem/grpc-gateway v1.13.0 - github.com/heroiclabs/nakama-common v1.6.1 + github.com/heroiclabs/nakama-common v1.7.1 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect github.com/jackc/pgx v3.5.0+incompatible github.com/jmhodges/levigo v1.0.0 // indirect diff --git a/go.sum b/go.sum index dc6314ddb..8133875c8 100644 --- a/go.sum +++ b/go.sum @@ -100,10 +100,8 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/grpc-gateway v1.13.0 h1:sBDQoHXrOlfPobnKw69FIKa1wg9qsLLvvQ/Y19WtFgI= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/heroiclabs/nakama-common v1.6.0 h1:2ZUNI3y8LnEpLEXUXYfERgWS1nm1l0TKPAwnyGMU96U= -github.com/heroiclabs/nakama-common v1.6.0/go.mod h1:nZAXHdeo4SyPlCyf7pU9rCVizxEhBF74gt7teDe/EaQ= -github.com/heroiclabs/nakama-common v1.6.1 h1:A2n8Jsr+wGuK8qQj5enMpu65NigChrcAMZYDLAJMY88= -github.com/heroiclabs/nakama-common v1.6.1/go.mod h1:nZAXHdeo4SyPlCyf7pU9rCVizxEhBF74gt7teDe/EaQ= +github.com/heroiclabs/nakama-common v1.7.1 h1:R+nfFJohkMeGgxyipx+LcHrQIFODcExD13YTx0RjSAE= +github.com/heroiclabs/nakama-common v1.7.1/go.mod h1:nZAXHdeo4SyPlCyf7pU9rCVizxEhBF74gt7teDe/EaQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -158,13 +156,11 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.1 h1:pgz0lCb+F99TrCwoy7d83j5kI//45fBQ34KzZ7t5as0= github.com/rogpeppe/go-internal v1.3.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -185,12 +181,9 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 h1:JNEGSiWg6D3lcBCMCBqN3ELniXujt+0QNHLhNnO0w3s= github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2/go.mod h1:mjqs7N0Q6m5HpR7QfXVBZXZWSqTjQLeTujjA/xUp2uw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -198,7 +191,6 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tecbot/gorocksdb v0.0.0-20190519120508-025c3cf4ffb4 h1:ktZy3TUr3YgNRAufBhDmvfLcRdlOU3CNy6p5haZkfkM= github.com/tecbot/gorocksdb v0.0.0-20190519120508-025c3cf4ffb4/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -224,7 +216,6 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -249,7 +240,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -257,7 +247,6 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -280,7 +269,6 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -290,7 +278,6 @@ google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBr google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c h1:xFOdgVPpeowWAH0MJ5i0XMp+3yWiWamMtN/kx9xThIQ= google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -309,7 +296,6 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0-20190411184413-94d9e492cc53/go.mod h1:l0 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/server/api_group.go b/server/api_group.go index 5e1f8dd19..8ffaeea09 100644 --- a/server/api_group.go +++ b/server/api_group.go @@ -676,6 +676,77 @@ func (s *ApiServer) ListGroupUsers(ctx context.Context, in *api.ListGroupUsersRe return groupUsers, nil } +func (s *ApiServer) DemoteGroupUsers(ctx context.Context, in *api.DemoteGroupUsersRequest) (*empty.Empty, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + // Before hook. + if fn := s.runtime.BeforeDemoteGroupUsers(); fn != nil { + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + if in.GetGroupId() == "" { + return nil, status.Error(codes.InvalidArgument, "Group ID must be set.") + } + + groupID, err := uuid.FromString(in.GetGroupId()) + if err != nil { + return nil, status.Error(codes.InvalidArgument, "Group ID must be a valid ID.") + } + + if len(in.GetUserIds()) == 0 { + return &empty.Empty{}, nil + } + + userIDs := make([]uuid.UUID, 0, len(in.GetUserIds())) + for _, id := range in.GetUserIds() { + uid := uuid.FromStringOrNil(id) + if uid == uuid.Nil { + return nil, status.Error(codes.InvalidArgument, "User ID must be a valid ID.") + } + userIDs = append(userIDs, uid) + } + + err = DemoteGroupUsers(ctx, s.logger, s.db, s.router, userID, groupID, userIDs) + if err != nil { + if err == ErrGroupPermissionDenied { + return nil, status.Error(codes.NotFound, "Group not found or permission denied.") + } else if err == ErrGroupFull { + return nil, status.Error(codes.InvalidArgument, "Group is full.") + } + return nil, status.Error(codes.Internal, "Error while trying to demote users in a group.") + } + + // After hook. + if fn := s.runtime.AfterDemoteGroupUsers(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } + + return &empty.Empty{}, nil +} + func (s *ApiServer) ListUserGroups(ctx context.Context, in *api.ListUserGroupsRequest) (*api.UserGroupList, error) { // Before hook. if fn := s.runtime.BeforeListUserGroups(); fn != nil { diff --git a/server/core_group.go b/server/core_group.go index 8eddaea6a..9aafeb887 100644 --- a/server/core_group.go +++ b/server/core_group.go @@ -1141,7 +1141,7 @@ RETURNING state` if err == sql.ErrNoRows { return ErrGroupUserNotFound } - logger.Debug("Could not retrieve username to kick user from group.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) + logger.Debug("Could not retrieve username to promote user in group.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) return err } @@ -1161,7 +1161,7 @@ RETURNING state` query = `INSERT INTO message (id, code, sender_id, username, stream_mode, stream_subject, stream_descriptor, stream_label, content, create_time, update_time) VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, $10, $10)` if _, err = tx.ExecContext(ctx, query, message.MessageId, message.Code.Value, message.SenderId, message.Username, stream.Mode, stream.Subject, stream.Subcontext, stream.Label, message.Content, time.Unix(message.CreateTime.Seconds, 0).UTC()); err != nil { - logger.Debug("Could insert group promote channel message.", zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) + logger.Debug("Could not insert group promote channel message.", zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) return err } @@ -1169,7 +1169,153 @@ VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, $10, $10)` } return nil }); err != nil { - logger.Error("Error promote users in group.", zap.Error(err)) + logger.Error("Error promoting users in group.", zap.Error(err), zap.String("group_id", groupID.String())) + return err + } + + for _, message := range messages { + router.SendToStream(logger, stream, &rtapi.Envelope{Message: &rtapi.Envelope_ChannelMessage{ChannelMessage: message}}, true) + } + + return nil +} + +func DemoteGroupUsers(ctx context.Context, logger *zap.Logger, db *sql.DB, router MessageRouter, caller uuid.UUID, groupID uuid.UUID, userIDs []uuid.UUID) error { + myState := 0 + if caller != uuid.Nil { + var dbState sql.NullInt64 + query := "SELECT state FROM group_edge WHERE source_id = $1::UUID AND destination_id = $2::UUID" + if err := db.QueryRowContext(ctx, query, groupID, caller).Scan(&dbState); err != nil { + if err == sql.ErrNoRows { + logger.Info("Could not retrieve state as no group relationship exists.", zap.String("group_id", groupID.String()), zap.String("user_id", caller.String())) + return ErrGroupPermissionDenied + } + logger.Error("Could not retrieve state from group_edge.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", caller.String())) + return err + } + + myState = int(dbState.Int64) + if myState > 1 { + logger.Info("Cannot demote users as user does not have correct permissions.", zap.String("group_id", groupID.String()), zap.String("user_id", caller.String()), zap.Int("state", myState)) + return ErrGroupPermissionDenied + } + } + + var groupExists sql.NullBool + query := "SELECT EXISTS (SELECT id FROM groups WHERE id = $1 AND disable_time = '1970-01-01 00:00:00 UTC')" + err := db.QueryRowContext(ctx, query, groupID).Scan(&groupExists) + if err != nil { + logger.Error("Could not look up group when demoting users.", zap.Error(err), zap.String("group_id", groupID.String())) + return err + } + if !groupExists.Bool { + logger.Info("Cannot demote users in a disabled group.", zap.String("group_id", groupID.String())) + return ErrGroupNotFound + } + + // Prepare the messages we'll need to send to the group channel. + stream := PresenceStream{ + Mode: StreamModeGroup, + Subject: groupID, + } + channelID, err := StreamToChannelId(stream) + if err != nil { + logger.Error("Could not create channel ID.", zap.Error(err)) + return err + } + ts := time.Now().Unix() + var messages []*api.ChannelMessage + + tx, err := db.BeginTx(ctx, nil) + if err != nil { + logger.Error("Could not begin database transaction.", zap.Error(err)) + return err + } + + if err := ExecuteInTx(ctx, tx, func() error { + // If the transaction is retried ensure we wipe any messages that may have been prepared by previous attempts. + messages = make([]*api.ChannelMessage, len(userIDs)) + + for _, uid := range userIDs { + if uid == caller { + continue + } + + query := "" + if myState == 0 { + // Ensure we aren't removing the last superadmin when deleting authoritatively. + // Query is for superadmin or if done authoritatively. + query = ` +UPDATE group_edge SET state = state + 1 +WHERE + ( + (source_id = $1::UUID AND destination_id = $2::UUID AND state >= $3 AND state < $4) + OR + (source_id = $2::UUID AND destination_id = $1::UUID AND state >= $3 AND state < $4) + ) +AND + ( + (SELECT COUNT(destination_id) FROM group_edge WHERE source_id = $1::UUID AND destination_id != $2::UUID AND state = 0) > 0 + ) +RETURNING state` + } else { + // Simpler query for everyone but superadmins. + query = ` +UPDATE group_edge SET state = state + 1 +WHERE + ( + (source_id = $1::UUID AND destination_id = $2::UUID AND state >= $3 AND state < $4) + OR + (source_id = $2::UUID AND destination_id = $1::UUID AND state >= $3 AND state < $4) + ) +RETURNING state` + } + + var newState sql.NullInt64 + if err := tx.QueryRowContext(ctx, query, groupID, uid, myState, api.GroupUserList_GroupUser_MEMBER).Scan(&newState); err != nil { + if err == sql.ErrNoRows { + continue + } + logger.Debug("Could not demote user in group.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) + return err + } + + // Look up the username. + var username sql.NullString + query = "SELECT username FROM users WHERE id = $1::UUID" + if err := tx.QueryRowContext(ctx, query, uid).Scan(&username); err != nil { + if err == sql.ErrNoRows { + return ErrGroupUserNotFound + } + logger.Debug("Could not retrieve username to demote user in group.", zap.Error(err), zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) + return err + } + + message := &api.ChannelMessage{ + ChannelId: channelID, + MessageId: uuid.Must(uuid.NewV4()).String(), + Code: &wrappers.Int32Value{Value: ChannelMessageTypeGroupDemote}, + SenderId: uid.String(), + Username: username.String, + Content: "{}", + CreateTime: ×tamp.Timestamp{Seconds: ts}, + UpdateTime: ×tamp.Timestamp{Seconds: ts}, + Persistent: &wrappers.BoolValue{Value: true}, + GroupId: groupID.String(), + } + + query = `INSERT INTO message (id, code, sender_id, username, stream_mode, stream_subject, stream_descriptor, stream_label, content, create_time, update_time) +VALUES ($1, $2, $3, $4, $5, $6::UUID, $7::UUID, $8, $9, $10, $10)` + if _, err = tx.ExecContext(ctx, query, message.MessageId, message.Code.Value, message.SenderId, message.Username, stream.Mode, stream.Subject, stream.Subcontext, stream.Label, message.Content, time.Unix(message.CreateTime.Seconds, 0).UTC()); err != nil { + logger.Debug("Could not insert group demote channel message.", zap.String("group_id", groupID.String()), zap.String("user_id", uid.String())) + return err + } + + messages = append(messages, message) + } + return nil + }); err != nil { + logger.Error("Error demoting users in group.", zap.Error(err), zap.String("group_id", groupID.String())) return err } diff --git a/server/pipeline_channel.go b/server/pipeline_channel.go index 9d2291143..9cb96484c 100644 --- a/server/pipeline_channel.go +++ b/server/pipeline_channel.go @@ -44,6 +44,7 @@ const ( ChannelMessageTypeGroupKick ChannelMessageTypeGroupPromote ChannelMessageTypeGroupBan + ChannelMessageTypeGroupDemote ) var ErrChannelMessageUpdateNotFound = errors.New("channel message not found") diff --git a/server/runtime.go b/server/runtime.go index ce7a9a437..e0ba70478 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -99,6 +99,8 @@ type ( RuntimeAfterKickGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.KickGroupUsersRequest) error RuntimeBeforePromoteGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.PromoteGroupUsersRequest) (*api.PromoteGroupUsersRequest, error, codes.Code) RuntimeAfterPromoteGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.PromoteGroupUsersRequest) error + RuntimeBeforeDemoteGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) (*api.DemoteGroupUsersRequest, error, codes.Code) + RuntimeAfterDemoteGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) error RuntimeBeforeListGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListGroupUsersRequest) (*api.ListGroupUsersRequest, error, codes.Code) RuntimeAfterListGroupUsersFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.GroupUserList, in *api.ListGroupUsersRequest) error RuntimeBeforeListUserGroupsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListUserGroupsRequest) (*api.ListUserGroupsRequest, error, codes.Code) @@ -284,6 +286,7 @@ type RuntimeBeforeReqFunctions struct { beforeBanGroupUsersFunction RuntimeBeforeBanGroupUsersFunction beforeKickGroupUsersFunction RuntimeBeforeKickGroupUsersFunction beforePromoteGroupUsersFunction RuntimeBeforePromoteGroupUsersFunction + beforeDemoteGroupUsersFunction RuntimeBeforeDemoteGroupUsersFunction beforeListGroupUsersFunction RuntimeBeforeListGroupUsersFunction beforeListUserGroupsFunction RuntimeBeforeListUserGroupsFunction beforeListGroupsFunction RuntimeBeforeListGroupsFunction @@ -352,6 +355,7 @@ type RuntimeAfterReqFunctions struct { afterBanGroupUsersFunction RuntimeAfterBanGroupUsersFunction afterKickGroupUsersFunction RuntimeAfterKickGroupUsersFunction afterPromoteGroupUsersFunction RuntimeAfterPromoteGroupUsersFunction + afterDemoteGroupUsersFunction RuntimeAfterDemoteGroupUsersFunction afterListGroupUsersFunction RuntimeAfterListGroupUsersFunction afterListUserGroupsFunction RuntimeAfterListUserGroupsFunction afterListGroupsFunction RuntimeAfterListGroupsFunction @@ -617,6 +621,9 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * if allBeforeReqFunctions.beforePromoteGroupUsersFunction != nil { startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "promotegroupusers")) } + if allBeforeReqFunctions.beforeDemoteGroupUsersFunction != nil { + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "demotegroupusers")) + } if allBeforeReqFunctions.beforeListGroupUsersFunction != nil { startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "listgroupusers")) } @@ -838,6 +845,10 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * allBeforeReqFunctions.beforePromoteGroupUsersFunction = goBeforeReqFunctions.beforePromoteGroupUsersFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "promotegroupusers")) } + if goBeforeReqFunctions.beforeDemoteGroupUsersFunction != nil { + allBeforeReqFunctions.beforeDemoteGroupUsersFunction = goBeforeReqFunctions.beforeDemoteGroupUsersFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "demotegroupusers")) + } if goBeforeReqFunctions.beforeListGroupUsersFunction != nil { allBeforeReqFunctions.beforeListGroupUsersFunction = goBeforeReqFunctions.beforeListGroupUsersFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "listgroupusers")) @@ -1074,6 +1085,9 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * if allAfterReqFunctions.afterPromoteGroupUsersFunction != nil { startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "promotegroupusers")) } + if allAfterReqFunctions.afterDemoteGroupUsersFunction != nil { + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "demotegroupusers")) + } if allAfterReqFunctions.afterListGroupUsersFunction != nil { startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "listgroupusers")) } @@ -1295,6 +1309,10 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * allAfterReqFunctions.afterPromoteGroupUsersFunction = goAfterReqFunctions.afterPromoteGroupUsersFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "promotegroupusers")) } + if goAfterReqFunctions.afterDemoteGroupUsersFunction != nil { + allAfterReqFunctions.afterDemoteGroupUsersFunction = goAfterReqFunctions.afterDemoteGroupUsersFunction + startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "demotegroupusers")) + } if goAfterReqFunctions.afterListGroupUsersFunction != nil { allAfterReqFunctions.afterListGroupUsersFunction = goAfterReqFunctions.afterListGroupUsersFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "listgroupusers")) @@ -1737,6 +1755,14 @@ func (r *Runtime) AfterPromoteGroupUsers() RuntimeAfterPromoteGroupUsersFunction return r.afterReqFunctions.afterPromoteGroupUsersFunction } +func (r *Runtime) BeforeDemoteGroupUsers() RuntimeBeforeDemoteGroupUsersFunction { + return r.beforeReqFunctions.beforeDemoteGroupUsersFunction +} + +func (r *Runtime) AfterDemoteGroupUsers() RuntimeAfterDemoteGroupUsersFunction { + return r.afterReqFunctions.afterDemoteGroupUsersFunction +} + func (r *Runtime) BeforeListGroupUsers() RuntimeBeforeListGroupUsersFunction { return r.beforeReqFunctions.beforeListGroupUsersFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index aa4b13c09..593348b04 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -844,6 +844,34 @@ func (ri *RuntimeGoInitializer) RegisterAfterPromoteGroupUsers(fn func(ctx conte return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeDemoteGroupUsers(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.DemoteGroupUsersRequest) (*api.DemoteGroupUsersRequest, error)) error { + ri.beforeReq.beforeDemoteGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) (*api.DemoteGroupUsersRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.env, RuntimeExecutionModeBefore, nil, expiry, userID, username, vars, "", clientIP, clientPort) + result, fnErr := fn(ctx, ri.logger, ri.db, ri.nk, in) + if fnErr != nil { + if runtimeErr, ok := fnErr.(*runtime.Error); ok { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterDemoteGroupUsers(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.DemoteGroupUsersRequest) error) error { + ri.afterReq.afterDemoteGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.env, RuntimeExecutionModeAfter, nil, expiry, userID, username, vars, "", clientIP, clientPort) + return fn(ctx, ri.logger, ri.db, ri.nk, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeListGroupUsers(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ListGroupUsersRequest) (*api.ListGroupUsersRequest, error)) error { ri.beforeReq.beforeListGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListGroupUsersRequest) (*api.ListGroupUsersRequest, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.env, RuntimeExecutionModeBefore, nil, expiry, userID, username, vars, "", clientIP, clientPort) diff --git a/server/runtime_go_logger.go b/server/runtime_go_logger.go index 84170647e..3b8fcd07d 100644 --- a/server/runtime_go_logger.go +++ b/server/runtime_go_logger.go @@ -24,10 +24,12 @@ import ( type RuntimeGoLogger struct { logger *zap.Logger + fields map[string]interface{} } func NewRuntimeGoLogger(logger *zap.Logger) nkruntime.Logger { return &RuntimeGoLogger{ + fields: make(map[string]interface{}), logger: logger.With(zap.String("runtime", "go")), } } @@ -72,65 +74,30 @@ func (l *RuntimeGoLogger) Error(format string, v ...interface{}) { } } -func (l *RuntimeGoLogger) Print(v ...interface{}) { - if l.logger.Core().Enabled(zap.InfoLevel) { - msg := fmt.Sprint(v...) - l.logger.Info(msg) - } -} - -func (l *RuntimeGoLogger) Println(v ...interface{}) { - if l.logger.Core().Enabled(zap.InfoLevel) { - msg := fmt.Sprintln(v...) - l.logger.Info(msg) - } +func (l *RuntimeGoLogger) WithField(key string, v interface{}) nkruntime.Logger { + return l.WithFields(map[string]interface{}{key: v}) } -func (l *RuntimeGoLogger) Printf(format string, v ...interface{}) { - if l.logger.Core().Enabled(zap.InfoLevel) { - msg := fmt.Sprintf(format, v...) - l.logger.Info(msg) +func (l *RuntimeGoLogger) WithFields(fields map[string]interface{}) nkruntime.Logger { + f := make([]zap.Field, 0, len(fields)+len(l.fields)) + newFields := make(map[string]interface{}, len(fields)+len(l.fields)) + for k, v := range l.fields { + newFields[k] = v } -} - -func (l *RuntimeGoLogger) Fatal(v ...interface{}) { - if l.logger.Core().Enabled(zap.FatalLevel) { - msg := fmt.Sprint(v...) - l.logger.Fatal(msg, l.getFileLine()) + for k, v := range fields { + if k == "runtime" { + continue + } + newFields[k] = v + f = append(f, zap.Any(k, v)) } -} -func (l *RuntimeGoLogger) Fatalln(v ...interface{}) { - if l.logger.Core().Enabled(zap.FatalLevel) { - msg := fmt.Sprintln(v...) - l.logger.Fatal(msg, l.getFileLine()) - } -} - -func (l *RuntimeGoLogger) Fatalf(format string, v ...interface{}) { - if l.logger.Core().Enabled(zap.FatalLevel) { - msg := fmt.Sprintf(format, v...) - l.logger.Fatal(msg, l.getFileLine()) - } -} - -func (l *RuntimeGoLogger) Panic(v ...interface{}) { - if l.logger.Core().Enabled(zap.PanicLevel) { - msg := fmt.Sprint(v...) - l.logger.Panic(msg, l.getFileLine()) - } -} - -func (l *RuntimeGoLogger) Panicln(v ...interface{}) { - if l.logger.Core().Enabled(zap.PanicLevel) { - msg := fmt.Sprintln(v...) - l.logger.Panic(msg, l.getFileLine()) + return &RuntimeGoLogger{ + logger: l.logger.With(f...), + fields: newFields, } } -func (l *RuntimeGoLogger) Panicf(format string, v ...interface{}) { - if l.logger.Core().Enabled(zap.PanicLevel) { - msg := fmt.Sprintf(format, v...) - l.logger.Panic(msg, l.getFileLine()) - } +func (l *RuntimeGoLogger) Fields() map[string]interface{} { + return l.fields } diff --git a/server/runtime_go_logger_test.go b/server/runtime_go_logger_test.go new file mode 100644 index 000000000..ee47d6f39 --- /dev/null +++ b/server/runtime_go_logger_test.go @@ -0,0 +1,135 @@ +package server + +import ( + "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" + "testing" +) + +func TestGoLoggerInfo(t *testing.T) { + observer, logs := observer.New(zap.InfoLevel) + + obs := zap.New(observer) + logger := NewRuntimeGoLogger(obs) + + logger.Info("%s log", "info") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Level, zap.InfoLevel) + assert.Equal(t, actualLog.Message, "info log") + assert.Contains(t, actualLog.Context, + zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}, + ) +} + +func TestGoLoggerWarn(t *testing.T) { + observer, logs := observer.New(zap.WarnLevel) + + obs := zap.New(observer) + logger := NewRuntimeGoLogger(obs) + + logger.Warn("%s log", "warn") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Level, zap.WarnLevel) + assert.Equal(t, actualLog.Message, "warn log") + assert.Contains(t, actualLog.Context, zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}) +} + +func TestGoLoggerError(t *testing.T) { + observer, logs := observer.New(zap.ErrorLevel) + + obs := zap.New(observer) + logger := NewRuntimeGoLogger(obs) + + logger.Error("%s log", "error") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Level, zap.ErrorLevel) + assert.Equal(t, actualLog.Message, "error log") + assert.Contains(t, actualLog.Context, zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}) +} + +func TestGoLoggerDebug(t *testing.T) { + observer, logs := observer.New(zap.DebugLevel) + + obs := zap.New(observer) + logger := NewRuntimeGoLogger(obs) + + logger.Debug("%s log", "debug") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Level, zap.DebugLevel) + assert.Equal(t, actualLog.Message, "debug log") + assert.Contains(t, actualLog.Context, zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}) +} + +func TestGoLoggerWithField(t *testing.T) { + observer, logs := observer.New(zap.InfoLevel) + + obs := zap.New(observer) + k := "key" + v := "value" + logger := NewRuntimeGoLogger(obs).WithField(k, v) + + logger.Info("log with field") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Level, zap.InfoLevel) + assert.Contains(t, actualLog.Context, zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}) + assert.Contains(t, actualLog.Context, zap.Field{Key: k, String: v, Type: zapcore.StringType}) +} + +func TestGoLoggerWithFields(t *testing.T) { + observer, logs := observer.New(zap.InfoLevel) + + obs := zap.New(observer) + fields := map[string]interface{}{ + "key1": "value1", + "key2": 2, + "runtime": "foo", // Overwriting runtime should yield no effect + } + + logger := NewRuntimeGoLogger(obs).WithFields(fields) + logger.Info("log message") + + assert.Equal(t, 1, logs.Len()) + actualLog := logs.All()[0] + assert.Equal(t, actualLog.Message, "log message") + assert.Contains(t, actualLog.Context, zap.Field{Key: "runtime", String: "go", Type: zapcore.StringType}) + assert.Contains(t, actualLog.Context, zap.Field{Key: "key1", String: "value1", Type: zapcore.StringType}) + assert.Contains(t, actualLog.Context, zap.Field{Key: "key2", Integer: 2, Type: zapcore.Int64Type}) +} + +func TestGoLoggerFields(t *testing.T) { + observer, _ := observer.New(zap.InfoLevel) + + obs := zap.New(observer) + fields := map[string]interface{}{ + "key2": "value2", + "key3": 3, + "runtime": "foo", // Should not be added to fields + } + + logger1 := NewRuntimeGoLogger(obs).WithField("key1", "value1") + + assert.Equal(t, "value1", logger1.Fields()["key1"]) + _, contains := logger1.Fields()["runtime"] + assert.False(t, contains) + + logger2 := logger1.WithFields(fields) + + assert.Equal(t, "value1", logger2.Fields()["key1"]) + assert.Equal(t, "value2", logger2.Fields()["key2"]) + assert.Equal(t, 3, logger2.Fields()["key3"]) + _, contains = logger2.Fields()["runtime"] + assert.False(t, contains) +} + diff --git a/server/runtime_lua.go b/server/runtime_lua.go index 315205662..5e0e19246 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -391,6 +391,14 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb } return result.(*api.PromoteGroupUsersRequest), nil, 0 } + case "demotegroupusers": + beforeReqFunctions.beforeDemoteGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) (*api.DemoteGroupUsersRequest, error, codes.Code) { + result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.DemoteGroupUsersRequest), nil, 0 + } case "listgroupusers": beforeReqFunctions.beforeListGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListGroupUsersRequest) (*api.ListGroupUsersRequest, error, codes.Code) { result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -817,6 +825,10 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb afterReqFunctions.afterPromoteGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.PromoteGroupUsersRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, nil, in) } + case "demotegroupusers": + afterReqFunctions.afterDemoteGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.DemoteGroupUsersRequest) error { + return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, nil, in) + } case "listgroupusers": afterReqFunctions.afterListGroupUsersFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.GroupUserList, in *api.ListGroupUsersRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 987cbbeee..ae1553e8e 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -127,7 +127,7 @@ func (x UserGroupList_UserGroup_State) String() string { } func (UserGroupList_UserGroup_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{80, 0, 0} + return fileDescriptor_1b40cafcd4234784, []int{81, 0, 0} } // A user with additional account details. Always the current user. @@ -4255,6 +4255,56 @@ func (m *PromoteGroupUsersRequest) GetUserIds() []string { return nil } +// Demote a set of users in a group to the next role down. +type DemoteGroupUsersRequest struct { + // The group ID to demote in. + GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + // The users to demote. + UserIds []string `protobuf:"bytes,2,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DemoteGroupUsersRequest) Reset() { *m = DemoteGroupUsersRequest{} } +func (m *DemoteGroupUsersRequest) String() string { return proto.CompactTextString(m) } +func (*DemoteGroupUsersRequest) ProtoMessage() {} +func (*DemoteGroupUsersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_1b40cafcd4234784, []int{65} +} + +func (m *DemoteGroupUsersRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DemoteGroupUsersRequest.Unmarshal(m, b) +} +func (m *DemoteGroupUsersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DemoteGroupUsersRequest.Marshal(b, m, deterministic) +} +func (m *DemoteGroupUsersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DemoteGroupUsersRequest.Merge(m, src) +} +func (m *DemoteGroupUsersRequest) XXX_Size() int { + return xxx_messageInfo_DemoteGroupUsersRequest.Size(m) +} +func (m *DemoteGroupUsersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DemoteGroupUsersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DemoteGroupUsersRequest proto.InternalMessageInfo + +func (m *DemoteGroupUsersRequest) GetGroupId() string { + if m != nil { + return m.GroupId + } + return "" +} + +func (m *DemoteGroupUsersRequest) GetUserIds() []string { + if m != nil { + return m.UserIds + } + return nil +} + // Storage objects to get. type ReadStorageObjectId struct { // The collection which stores the object. @@ -4272,7 +4322,7 @@ func (m *ReadStorageObjectId) Reset() { *m = ReadStorageObjectId{} } func (m *ReadStorageObjectId) String() string { return proto.CompactTextString(m) } func (*ReadStorageObjectId) ProtoMessage() {} func (*ReadStorageObjectId) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{65} + return fileDescriptor_1b40cafcd4234784, []int{66} } func (m *ReadStorageObjectId) XXX_Unmarshal(b []byte) error { @@ -4327,7 +4377,7 @@ func (m *ReadStorageObjectsRequest) Reset() { *m = ReadStorageObjectsReq func (m *ReadStorageObjectsRequest) String() string { return proto.CompactTextString(m) } func (*ReadStorageObjectsRequest) ProtoMessage() {} func (*ReadStorageObjectsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{66} + return fileDescriptor_1b40cafcd4234784, []int{67} } func (m *ReadStorageObjectsRequest) XXX_Unmarshal(b []byte) error { @@ -4372,7 +4422,7 @@ func (m *Rpc) Reset() { *m = Rpc{} } func (m *Rpc) String() string { return proto.CompactTextString(m) } func (*Rpc) ProtoMessage() {} func (*Rpc) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{67} + return fileDescriptor_1b40cafcd4234784, []int{68} } func (m *Rpc) XXX_Unmarshal(b []byte) error { @@ -4429,7 +4479,7 @@ func (m *Session) Reset() { *m = Session{} } func (m *Session) String() string { return proto.CompactTextString(m) } func (*Session) ProtoMessage() {} func (*Session) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{68} + return fileDescriptor_1b40cafcd4234784, []int{69} } func (m *Session) XXX_Unmarshal(b []byte) error { @@ -4493,7 +4543,7 @@ func (m *StorageObject) Reset() { *m = StorageObject{} } func (m *StorageObject) String() string { return proto.CompactTextString(m) } func (*StorageObject) ProtoMessage() {} func (*StorageObject) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{69} + return fileDescriptor_1b40cafcd4234784, []int{70} } func (m *StorageObject) XXX_Unmarshal(b []byte) error { @@ -4596,7 +4646,7 @@ func (m *StorageObjectAck) Reset() { *m = StorageObjectAck{} } func (m *StorageObjectAck) String() string { return proto.CompactTextString(m) } func (*StorageObjectAck) ProtoMessage() {} func (*StorageObjectAck) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{70} + return fileDescriptor_1b40cafcd4234784, []int{71} } func (m *StorageObjectAck) XXX_Unmarshal(b []byte) error { @@ -4658,7 +4708,7 @@ func (m *StorageObjectAcks) Reset() { *m = StorageObjectAcks{} } func (m *StorageObjectAcks) String() string { return proto.CompactTextString(m) } func (*StorageObjectAcks) ProtoMessage() {} func (*StorageObjectAcks) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{71} + return fileDescriptor_1b40cafcd4234784, []int{72} } func (m *StorageObjectAcks) XXX_Unmarshal(b []byte) error { @@ -4699,7 +4749,7 @@ func (m *StorageObjects) Reset() { *m = StorageObjects{} } func (m *StorageObjects) String() string { return proto.CompactTextString(m) } func (*StorageObjects) ProtoMessage() {} func (*StorageObjects) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{72} + return fileDescriptor_1b40cafcd4234784, []int{73} } func (m *StorageObjects) XXX_Unmarshal(b []byte) error { @@ -4742,7 +4792,7 @@ func (m *StorageObjectList) Reset() { *m = StorageObjectList{} } func (m *StorageObjectList) String() string { return proto.CompactTextString(m) } func (*StorageObjectList) ProtoMessage() {} func (*StorageObjectList) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{73} + return fileDescriptor_1b40cafcd4234784, []int{74} } func (m *StorageObjectList) XXX_Unmarshal(b []byte) error { @@ -4822,7 +4872,7 @@ func (m *Tournament) Reset() { *m = Tournament{} } func (m *Tournament) String() string { return proto.CompactTextString(m) } func (*Tournament) ProtoMessage() {} func (*Tournament) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{74} + return fileDescriptor_1b40cafcd4234784, []int{75} } func (m *Tournament) XXX_Unmarshal(b []byte) error { @@ -4977,7 +5027,7 @@ func (m *TournamentList) Reset() { *m = TournamentList{} } func (m *TournamentList) String() string { return proto.CompactTextString(m) } func (*TournamentList) ProtoMessage() {} func (*TournamentList) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{75} + return fileDescriptor_1b40cafcd4234784, []int{76} } func (m *TournamentList) XXX_Unmarshal(b []byte) error { @@ -5031,7 +5081,7 @@ func (m *TournamentRecordList) Reset() { *m = TournamentRecordList{} } func (m *TournamentRecordList) String() string { return proto.CompactTextString(m) } func (*TournamentRecordList) ProtoMessage() {} func (*TournamentRecordList) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{76} + return fileDescriptor_1b40cafcd4234784, []int{77} } func (m *TournamentRecordList) XXX_Unmarshal(b []byte) error { @@ -5103,7 +5153,7 @@ func (m *UpdateAccountRequest) Reset() { *m = UpdateAccountRequest{} } func (m *UpdateAccountRequest) String() string { return proto.CompactTextString(m) } func (*UpdateAccountRequest) ProtoMessage() {} func (*UpdateAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{77} + return fileDescriptor_1b40cafcd4234784, []int{78} } func (m *UpdateAccountRequest) XXX_Unmarshal(b []byte) error { @@ -5189,7 +5239,7 @@ func (m *UpdateGroupRequest) Reset() { *m = UpdateGroupRequest{} } func (m *UpdateGroupRequest) String() string { return proto.CompactTextString(m) } func (*UpdateGroupRequest) ProtoMessage() {} func (*UpdateGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{78} + return fileDescriptor_1b40cafcd4234784, []int{79} } func (m *UpdateGroupRequest) XXX_Unmarshal(b []byte) error { @@ -5299,7 +5349,7 @@ func (m *User) Reset() { *m = User{} } func (m *User) String() string { return proto.CompactTextString(m) } func (*User) ProtoMessage() {} func (*User) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{79} + return fileDescriptor_1b40cafcd4234784, []int{80} } func (m *User) XXX_Unmarshal(b []byte) error { @@ -5461,7 +5511,7 @@ func (m *UserGroupList) Reset() { *m = UserGroupList{} } func (m *UserGroupList) String() string { return proto.CompactTextString(m) } func (*UserGroupList) ProtoMessage() {} func (*UserGroupList) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{80} + return fileDescriptor_1b40cafcd4234784, []int{81} } func (m *UserGroupList) XXX_Unmarshal(b []byte) error { @@ -5511,7 +5561,7 @@ func (m *UserGroupList_UserGroup) Reset() { *m = UserGroupList_UserGroup func (m *UserGroupList_UserGroup) String() string { return proto.CompactTextString(m) } func (*UserGroupList_UserGroup) ProtoMessage() {} func (*UserGroupList_UserGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{80, 0} + return fileDescriptor_1b40cafcd4234784, []int{81, 0} } func (m *UserGroupList_UserGroup) XXX_Unmarshal(b []byte) error { @@ -5559,7 +5609,7 @@ func (m *Users) Reset() { *m = Users{} } func (m *Users) String() string { return proto.CompactTextString(m) } func (*Users) ProtoMessage() {} func (*Users) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{81} + return fileDescriptor_1b40cafcd4234784, []int{82} } func (m *Users) XXX_Unmarshal(b []byte) error { @@ -5602,7 +5652,7 @@ func (m *WriteLeaderboardRecordRequest) Reset() { *m = WriteLeaderboardR func (m *WriteLeaderboardRecordRequest) String() string { return proto.CompactTextString(m) } func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{82} + return fileDescriptor_1b40cafcd4234784, []int{83} } func (m *WriteLeaderboardRecordRequest) XXX_Unmarshal(b []byte) error { @@ -5658,7 +5708,7 @@ func (m *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { } func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{82, 0} + return fileDescriptor_1b40cafcd4234784, []int{83, 0} } func (m *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) XXX_Unmarshal(b []byte) error { @@ -5723,7 +5773,7 @@ func (m *WriteStorageObject) Reset() { *m = WriteStorageObject{} } func (m *WriteStorageObject) String() string { return proto.CompactTextString(m) } func (*WriteStorageObject) ProtoMessage() {} func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{83} + return fileDescriptor_1b40cafcd4234784, []int{84} } func (m *WriteStorageObject) XXX_Unmarshal(b []byte) error { @@ -5799,7 +5849,7 @@ func (m *WriteStorageObjectsRequest) Reset() { *m = WriteStorageObjectsR func (m *WriteStorageObjectsRequest) String() string { return proto.CompactTextString(m) } func (*WriteStorageObjectsRequest) ProtoMessage() {} func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{84} + return fileDescriptor_1b40cafcd4234784, []int{85} } func (m *WriteStorageObjectsRequest) XXX_Unmarshal(b []byte) error { @@ -5842,7 +5892,7 @@ func (m *WriteTournamentRecordRequest) Reset() { *m = WriteTournamentRec func (m *WriteTournamentRecordRequest) String() string { return proto.CompactTextString(m) } func (*WriteTournamentRecordRequest) ProtoMessage() {} func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{85} + return fileDescriptor_1b40cafcd4234784, []int{86} } func (m *WriteTournamentRecordRequest) XXX_Unmarshal(b []byte) error { @@ -5898,7 +5948,7 @@ func (m *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { } func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return fileDescriptor_1b40cafcd4234784, []int{85, 0} + return fileDescriptor_1b40cafcd4234784, []int{86, 0} } func (m *WriteTournamentRecordRequest_TournamentRecordWrite) XXX_Unmarshal(b []byte) error { @@ -6020,6 +6070,7 @@ func init() { proto.RegisterType((*Notification)(nil), "nakama.api.Notification") proto.RegisterType((*NotificationList)(nil), "nakama.api.NotificationList") proto.RegisterType((*PromoteGroupUsersRequest)(nil), "nakama.api.PromoteGroupUsersRequest") + proto.RegisterType((*DemoteGroupUsersRequest)(nil), "nakama.api.DemoteGroupUsersRequest") proto.RegisterType((*ReadStorageObjectId)(nil), "nakama.api.ReadStorageObjectId") proto.RegisterType((*ReadStorageObjectsRequest)(nil), "nakama.api.ReadStorageObjectsRequest") proto.RegisterType((*Rpc)(nil), "nakama.api.Rpc") @@ -6049,239 +6100,240 @@ func init() { func init() { proto.RegisterFile("api/api.proto", fileDescriptor_1b40cafcd4234784) } var fileDescriptor_1b40cafcd4234784 = []byte{ - // 3741 bytes of a gzipped FileDescriptorProto + // 3749 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3b, 0x4b, 0x8c, 0x1c, 0xc7, - 0x75, 0xea, 0xf9, 0xcf, 0x9b, 0x9d, 0xdd, 0xd9, 0xe2, 0x27, 0xb3, 0x43, 0x2e, 0x3f, 0x4d, 0x49, + 0x75, 0xea, 0xf9, 0xcf, 0x9b, 0x9d, 0xdd, 0xd9, 0xe2, 0x47, 0xb3, 0x43, 0x2e, 0x3f, 0x4d, 0x49, 0xa4, 0x20, 0x65, 0x29, 0x2d, 0x25, 0x91, 0x12, 0x23, 0x8a, 0xfb, 0x19, 0x12, 0x23, 0x92, 0x4b, 0xa6, 0x97, 0x64, 0x82, 0xe4, 0x30, 0xaa, 0xed, 0xae, 0x5d, 0x76, 0x76, 0xa6, 0xbb, 0xd5, 0xdd, - 0xb3, 0x1f, 0x21, 0x01, 0x82, 0x20, 0x40, 0x72, 0x0a, 0x92, 0x00, 0x49, 0x10, 0x18, 0xb0, 0x0d, + 0xb3, 0x1f, 0x21, 0x01, 0x82, 0x20, 0x40, 0x72, 0x0a, 0x92, 0x00, 0x49, 0x10, 0x04, 0x48, 0x0c, 0x1f, 0x0c, 0xd9, 0x06, 0x0c, 0xfb, 0xe0, 0x8b, 0xe1, 0xbb, 0xec, 0xab, 0x61, 0x19, 0xbe, 0xd9, 0x86, 0x01, 0x01, 0x3e, 0xfb, 0xe8, 0x8b, 0x51, 0xaf, 0xaa, 0xbf, 0x33, 0xb3, 0x3b, 0xb3, 0x3b, 0x94, 0x04, 0x5f, 0x16, 0x53, 0xaf, 0xde, 0xab, 0x7e, 0xef, 0xd5, 0xab, 0xf7, 0xa9, 0x57, 0x0b, 0x55, 0xea, 0x98, 0x57, 0xa9, 0x63, 0x2e, 0x38, 0xae, 0xed, 0xdb, 0x04, 0x2c, 0xba, 0x4d, 0xbb, 0x74, 0x81, 0x3a, 0x66, 0xe3, 0xfc, 0x96, 0x6d, 0x6f, 0x75, 0xd8, 0x55, 0x9c, 0xd9, 0xe8, 0x6d, 0x5e, 0xf5, 0xcd, 0x2e, 0xf3, 0x7c, 0xda, 0x75, 0x04, 0x72, 0xe3, 0x5c, 0x1a, 0x61, 0xd7, 0xa5, - 0x8e, 0xc3, 0x5c, 0x4f, 0xcc, 0xab, 0xdf, 0xcb, 0x40, 0x71, 0x49, 0xd7, 0xed, 0x9e, 0xe5, 0x93, - 0x17, 0x21, 0xd7, 0xf3, 0x98, 0x5b, 0x57, 0x2e, 0x28, 0x57, 0x2a, 0x8b, 0xb5, 0x85, 0xe8, 0x3b, + 0x8e, 0xc3, 0x5c, 0x4f, 0xcc, 0xab, 0xdf, 0xcd, 0x40, 0x71, 0x49, 0xd7, 0xed, 0x9e, 0xe5, 0x93, + 0x97, 0x20, 0xd7, 0xf3, 0x98, 0x5b, 0x57, 0x2e, 0x28, 0x57, 0x2a, 0x8b, 0xb5, 0x85, 0xe8, 0x3b, 0x0b, 0x4f, 0x3c, 0xe6, 0x6a, 0x38, 0x4b, 0x4e, 0x43, 0x61, 0x97, 0x76, 0x3a, 0xcc, 0xaf, 0x67, 0x2e, 0x28, 0x57, 0xca, 0x9a, 0x1c, 0x91, 0x93, 0x90, 0x67, 0x5d, 0x6a, 0x76, 0xea, 0x59, 0x04, 0x8b, 0x01, 0xb9, 0x06, 0x45, 0x83, 0xed, 0x98, 0x3a, 0xf3, 0xea, 0xb9, 0x0b, 0xd9, 0x2b, 0x95, 0xc5, 0xb9, 0xf8, 0xb2, 0xf2, 0xcb, 0xab, 0x88, 0xa1, 0x05, 0x98, 0xe4, 0x0c, 0x94, 0xf5, 0x9e, 0xe7, 0xdb, 0xdd, 0xb6, 0x69, 0xd4, 0xf3, 0xb8, 0x5c, 0x49, 0x00, 0x5a, 0x06, 0xb9, 0x09, 0x95, 0x1d, 0xe6, 0x9a, 0x9b, 0xfb, 0x6d, 0x2e, 0x6b, 0xbd, 0x80, 0xcc, 0x36, 0x16, 0x84, 0x9c, 0x0b, - 0x81, 0x9c, 0x0b, 0x8f, 0x03, 0x45, 0x68, 0x20, 0xd0, 0x39, 0x80, 0xbc, 0x07, 0x53, 0x86, 0xe9, - 0xd1, 0x8d, 0x0e, 0x13, 0xd4, 0xc5, 0x43, 0xa9, 0x2b, 0x12, 0x9f, 0x43, 0xd4, 0xff, 0x51, 0x60, + 0x81, 0x9c, 0x0b, 0x8f, 0x03, 0x45, 0x68, 0x20, 0xd0, 0x39, 0x80, 0xbc, 0x0f, 0x53, 0x86, 0xe9, + 0xd1, 0x8d, 0x0e, 0x13, 0xd4, 0xc5, 0x43, 0xa9, 0x2b, 0x12, 0x9f, 0x43, 0xd4, 0xff, 0x54, 0x60, 0x4a, 0xf2, 0xbc, 0xe4, 0x38, 0x1d, 0xc6, 0x85, 0xf6, 0xed, 0x6d, 0x66, 0xa1, 0xce, 0xca, 0x9a, - 0x18, 0x90, 0xb7, 0x21, 0xb7, 0x43, 0x5d, 0xaf, 0x9e, 0x41, 0x89, 0xd5, 0x01, 0x12, 0x23, 0xf5, + 0x18, 0x90, 0x77, 0x20, 0xb7, 0x43, 0x5d, 0xaf, 0x9e, 0x41, 0x89, 0xd5, 0x01, 0x12, 0x23, 0xf5, 0xc2, 0x53, 0xea, 0x7a, 0x4d, 0xcb, 0x77, 0xf7, 0x35, 0xc4, 0x6f, 0x5c, 0x87, 0x72, 0x08, 0x22, 0x35, 0xc8, 0x6e, 0xb3, 0x7d, 0xb9, 0x30, 0xff, 0xc9, 0x3f, 0xb6, 0x43, 0x3b, 0x3d, 0x26, 0x15, - 0x2f, 0x06, 0xef, 0x66, 0x6e, 0x28, 0xea, 0x7f, 0x29, 0x50, 0x95, 0x2b, 0xaf, 0xa0, 0x9e, 0xc8, + 0x2f, 0x06, 0xef, 0x65, 0x6e, 0x28, 0xea, 0xbf, 0x2b, 0x50, 0x95, 0x2b, 0xaf, 0xa0, 0x9e, 0xc8, 0x34, 0x64, 0x4c, 0x43, 0x12, 0x67, 0x4c, 0x83, 0x5c, 0x4f, 0xb0, 0x74, 0x69, 0x00, 0x4b, 0x82, - 0xf0, 0xb9, 0xf0, 0x24, 0xf6, 0xf7, 0x08, 0x3c, 0x09, 0xc2, 0xc9, 0xf1, 0xf4, 0xc3, 0x68, 0xff, + 0xf0, 0xb9, 0xf0, 0x24, 0xf6, 0xf7, 0x08, 0x3c, 0x09, 0xc2, 0xc9, 0xf1, 0xf4, 0x83, 0x68, 0xff, 0x9a, 0x68, 0x9e, 0xa1, 0xd1, 0x2a, 0x71, 0xa3, 0x6d, 0x40, 0xc9, 0xa1, 0x9e, 0xb7, 0x6b, 0xbb, - 0x86, 0x5c, 0x23, 0x1c, 0x87, 0x7b, 0x9b, 0x1d, 0xba, 0xb7, 0xb8, 0xf2, 0xe4, 0x78, 0xfe, 0x9a, - 0x02, 0x33, 0x72, 0xe5, 0x3b, 0x54, 0x67, 0x1b, 0xb6, 0xbd, 0x3d, 0xc4, 0xec, 0xde, 0x49, 0xe8, - 0xf3, 0xa5, 0x01, 0xac, 0x05, 0x0b, 0x4c, 0x8e, 0xbb, 0x9f, 0x29, 0xd0, 0x48, 0x2d, 0xde, 0xb2, - 0x3c, 0x9f, 0x5a, 0xfe, 0x5d, 0xda, 0x65, 0xe4, 0x35, 0x20, 0x9e, 0xb9, 0x65, 0x31, 0xa3, 0xed, - 0x74, 0xe8, 0x3e, 0x73, 0xdb, 0xa6, 0xb5, 0x69, 0xcb, 0x95, 0x6b, 0x62, 0xe6, 0x11, 0x4e, 0xb4, - 0xac, 0x4d, 0x9b, 0xac, 0x26, 0x04, 0x78, 0xfd, 0x00, 0x01, 0x62, 0xdf, 0x98, 0x9c, 0x2c, 0x3f, - 0xcd, 0xc0, 0xac, 0xfc, 0x0e, 0x5f, 0x78, 0x85, 0x59, 0x3e, 0x73, 0xb9, 0x33, 0x0a, 0x78, 0x0f, - 0x8c, 0xb7, 0x24, 0x00, 0x2d, 0x83, 0x4f, 0x6e, 0xf4, 0x2c, 0xa3, 0xc3, 0xf8, 0xa4, 0x34, 0x15, - 0x01, 0x68, 0x19, 0xe4, 0x55, 0x98, 0x0d, 0xdd, 0x71, 0xdb, 0x63, 0xba, 0x6d, 0x19, 0x1e, 0x7a, - 0xc7, 0xac, 0x56, 0x0b, 0x27, 0xd6, 0x05, 0x9c, 0x10, 0xc8, 0x79, 0xb4, 0xe3, 0xd7, 0x73, 0xb8, - 0x08, 0xfe, 0x26, 0x67, 0xa1, 0xcc, 0x75, 0x44, 0xfd, 0x9e, 0xcb, 0xa4, 0x1f, 0x8c, 0x00, 0xe4, - 0x45, 0x98, 0x76, 0x7a, 0x1b, 0x1d, 0x53, 0x6f, 0x6f, 0xb3, 0xfd, 0x76, 0xcf, 0xed, 0xa0, 0x2f, - 0x2c, 0x6b, 0x53, 0x02, 0x7a, 0x8f, 0xed, 0x3f, 0x71, 0x3b, 0xe4, 0xa6, 0xd4, 0x69, 0x11, 0x75, - 0x7a, 0x79, 0x80, 0x4e, 0x23, 0x59, 0x27, 0xa7, 0xca, 0xff, 0x8b, 0x0e, 0xff, 0x5d, 0x74, 0xad, - 0x43, 0x4c, 0xf6, 0x70, 0x17, 0x20, 0xc8, 0x27, 0xc7, 0x59, 0xcc, 0x85, 0xaf, 0xfb, 0x8c, 0x76, - 0x8f, 0xec, 0xc2, 0x91, 0x7a, 0x72, 0x7c, 0xad, 0xc0, 0xec, 0x92, 0x61, 0xdc, 0x71, 0x4d, 0x66, - 0x19, 0x9e, 0xc6, 0x3e, 0xea, 0x31, 0xcf, 0xe7, 0x0b, 0x98, 0x86, 0x57, 0x57, 0x2e, 0x64, 0xf9, - 0x02, 0xa6, 0xe1, 0x71, 0x93, 0xe0, 0x51, 0xd8, 0xa2, 0x5d, 0x26, 0x98, 0x2b, 0x6b, 0x11, 0x40, - 0xbd, 0x0f, 0x27, 0x97, 0x0c, 0xe3, 0xae, 0x6b, 0xf7, 0x1c, 0x1e, 0xb1, 0xc3, 0x75, 0xe6, 0xa0, - 0xb4, 0xc5, 0x81, 0x91, 0x09, 0x17, 0x71, 0xdc, 0x32, 0xf8, 0x14, 0xa7, 0x6f, 0xf3, 0xef, 0x88, - 0xf5, 0x8a, 0x7c, 0xdc, 0x32, 0x3c, 0xf5, 0xeb, 0x0a, 0xd4, 0x97, 0x7a, 0xfe, 0x33, 0x66, 0xf9, - 0xa6, 0x4e, 0x7d, 0x86, 0x41, 0x2b, 0x58, 0x72, 0x11, 0x8a, 0x54, 0x28, 0x42, 0xe6, 0x0b, 0xf5, - 0x61, 0x61, 0x4e, 0x0b, 0x10, 0xc9, 0x22, 0x14, 0x74, 0x97, 0x51, 0x5f, 0x88, 0x3f, 0x28, 0xee, - 0x2e, 0xdb, 0x76, 0xe7, 0x29, 0xd7, 0x89, 0x26, 0x31, 0xb9, 0x2f, 0x0e, 0xe4, 0x93, 0x99, 0x45, - 0x38, 0x56, 0xbf, 0xa9, 0xc0, 0x5c, 0x9c, 0x41, 0x11, 0xc2, 0x02, 0x0e, 0xaf, 0xa5, 0x39, 0x9c, - 0x1b, 0x1a, 0xf5, 0xbe, 0x38, 0x16, 0x65, 0xaa, 0x33, 0x0e, 0x8b, 0x41, 0x76, 0xf4, 0xbc, 0x58, - 0x4c, 0x6f, 0x33, 0xc6, 0xaf, 0xb1, 0xb6, 0x59, 0x50, 0x3c, 0x37, 0x06, 0x7f, 0xa1, 0xc0, 0x99, - 0x38, 0x83, 0x41, 0x10, 0x08, 0x78, 0x7c, 0x2b, 0xcd, 0xe3, 0x99, 0x03, 0x22, 0xc7, 0x73, 0x63, - 0x93, 0x2c, 0x40, 0xce, 0xdb, 0xb7, 0x74, 0xf4, 0xe0, 0x07, 0xaf, 0x86, 0x78, 0xea, 0x8f, 0x15, - 0x78, 0x79, 0x90, 0x58, 0xb1, 0xd8, 0x16, 0x48, 0x78, 0x3b, 0x2d, 0xe1, 0xcb, 0xa3, 0xc5, 0xc6, - 0xe7, 0xb7, 0x27, 0x9f, 0x28, 0x30, 0x1f, 0x67, 0x3e, 0x0a, 0x22, 0x01, 0xcf, 0xd7, 0xd3, 0x3c, - 0xcf, 0x1f, 0x18, 0x7b, 0xbe, 0xb8, 0x23, 0x28, 0x22, 0xca, 0x58, 0x47, 0x50, 0x92, 0x7c, 0x61, - 0x47, 0x10, 0x63, 0xcb, 0x58, 0x47, 0x50, 0x50, 0x3c, 0x37, 0x06, 0xef, 0xc3, 0xc9, 0x65, 0x6a, - 0x4d, 0x2a, 0xb0, 0x34, 0xe1, 0xc4, 0x72, 0xc7, 0xd6, 0xb7, 0x8f, 0x19, 0xed, 0xfe, 0x39, 0x07, - 0xd3, 0x2b, 0xcf, 0xa8, 0x65, 0xb1, 0xce, 0x03, 0xe6, 0x79, 0x74, 0x8b, 0x91, 0x79, 0x00, 0x5d, - 0x40, 0x22, 0x8e, 0xca, 0x12, 0xd2, 0x32, 0xf8, 0x74, 0x57, 0x60, 0x46, 0xf9, 0x5a, 0x59, 0x42, - 0x5a, 0x06, 0xb9, 0x0a, 0x39, 0xdd, 0x36, 0x84, 0xf4, 0xdc, 0x8b, 0xa4, 0x75, 0xd6, 0xb2, 0xfc, - 0x6b, 0x8b, 0xf2, 0x08, 0x73, 0x44, 0x9e, 0xfe, 0x79, 0xcc, 0x32, 0x44, 0x6e, 0x28, 0x32, 0xb7, - 0x92, 0x00, 0xb4, 0x8c, 0x84, 0x3e, 0xf3, 0x29, 0x5f, 0x51, 0x87, 0xa2, 0x6e, 0x5b, 0x3e, 0xb3, - 0x7c, 0x99, 0xb4, 0x05, 0x43, 0x5e, 0xde, 0x8a, 0xfd, 0x18, 0xb5, 0x40, 0x05, 0x81, 0x8e, 0xe5, - 0xed, 0x4d, 0xa8, 0xf4, 0x1c, 0x23, 0x24, 0x2e, 0x1d, 0x4e, 0x2c, 0xd0, 0x91, 0xf8, 0x5d, 0x00, - 0x87, 0xb9, 0x9e, 0xe9, 0x21, 0x5b, 0xe5, 0x43, 0xed, 0x26, 0x86, 0xcd, 0x15, 0xe1, 0xda, 0x76, - 0xb7, 0x8d, 0xc2, 0x82, 0x10, 0x96, 0x03, 0xd6, 0xb8, 0xb0, 0x71, 0x23, 0xa9, 0x24, 0x8d, 0xe4, - 0x1c, 0x54, 0xa4, 0x91, 0xb4, 0x6d, 0x8b, 0xd5, 0xa7, 0xc4, 0x8e, 0x08, 0x3b, 0x79, 0x68, 0xb1, - 0xf8, 0xbc, 0xbf, 0x6b, 0xd7, 0xab, 0xf1, 0xf9, 0xc7, 0xbb, 0xb6, 0xfa, 0x1f, 0x0a, 0x90, 0xa4, - 0x09, 0xdc, 0x37, 0x3d, 0x9f, 0xbc, 0x0d, 0x25, 0xb9, 0xab, 0xc2, 0x9c, 0xb8, 0x20, 0xb1, 0x33, - 0x93, 0xa4, 0xd0, 0x42, 0x5c, 0x72, 0x1e, 0x2a, 0x16, 0xdb, 0xf3, 0xdb, 0x7a, 0xcf, 0xf5, 0x6c, - 0x57, 0x1a, 0x08, 0x70, 0xd0, 0x0a, 0x42, 0x38, 0x82, 0xe3, 0xb2, 0x9d, 0x00, 0x41, 0x1c, 0x13, - 0xe0, 0x20, 0x81, 0xa0, 0xfe, 0x88, 0x33, 0x84, 0x1b, 0x82, 0x87, 0x25, 0x30, 0x6d, 0x02, 0x39, - 0x54, 0x8d, 0xb0, 0x48, 0xfc, 0x4d, 0x2e, 0x40, 0xc5, 0x60, 0x9e, 0xee, 0x9a, 0x8e, 0x6f, 0xda, - 0x96, 0xfc, 0x58, 0x1c, 0xc4, 0x15, 0xd7, 0xa1, 0xd6, 0x56, 0xdb, 0xa7, 0x5b, 0xf2, 0x53, 0x45, - 0x3e, 0x7e, 0x4c, 0xb7, 0xb8, 0x25, 0xd3, 0x1d, 0xea, 0x53, 0x17, 0x13, 0x7f, 0x61, 0x7a, 0x65, - 0x01, 0xe1, 0x59, 0x3f, 0x81, 0x9c, 0xed, 0x30, 0x0b, 0xed, 0xae, 0xa4, 0xe1, 0x6f, 0xbe, 0x47, - 0x5d, 0xba, 0xd7, 0x16, 0x9e, 0x84, 0x5b, 0x5d, 0x5e, 0x2b, 0x75, 0xe9, 0xde, 0x0a, 0x1f, 0xab, - 0x77, 0xe0, 0xe4, 0x2a, 0xeb, 0x30, 0x9f, 0x1d, 0xf3, 0x4c, 0x5e, 0x05, 0x22, 0xd6, 0x49, 0x88, - 0x3f, 0xdc, 0x4d, 0xa8, 0x77, 0xe1, 0x9c, 0x20, 0xb8, 0xcf, 0xa8, 0xc1, 0xdc, 0x0d, 0x9b, 0xba, - 0x86, 0xc6, 0x74, 0x9b, 0xff, 0x15, 0xc4, 0x2f, 0xc1, 0x74, 0x27, 0x9a, 0x8b, 0x96, 0xa8, 0xc6, - 0xa0, 0x2d, 0x43, 0x5d, 0x80, 0x86, 0x58, 0x68, 0xcd, 0xf6, 0xcd, 0x4d, 0xee, 0x46, 0x4d, 0xdb, - 0x1a, 0x2e, 0x87, 0xaa, 0xc3, 0x29, 0x81, 0xbf, 0xee, 0xdb, 0x2e, 0xdd, 0x62, 0x0f, 0x37, 0xfe, - 0x81, 0xe9, 0x3e, 0xda, 0x24, 0xe8, 0x76, 0xa7, 0xc3, 0x74, 0xdc, 0x16, 0xf1, 0xad, 0x18, 0x24, - 0xc8, 0xea, 0x33, 0x51, 0x56, 0x5f, 0x87, 0xe2, 0x0e, 0x3f, 0x0b, 0xb6, 0x15, 0x6c, 0x93, 0x1c, - 0xaa, 0x6d, 0x38, 0x33, 0xe0, 0x23, 0x5e, 0x14, 0xd7, 0xc1, 0x46, 0x48, 0x3b, 0x60, 0xae, 0xb2, - 0x78, 0x31, 0x6e, 0xa9, 0x03, 0x39, 0xd4, 0xca, 0xb6, 0xfc, 0xe5, 0xa9, 0x7f, 0x50, 0x20, 0xdf, - 0xdc, 0xe1, 0x47, 0x70, 0x90, 0x89, 0x2d, 0x01, 0x38, 0xae, 0xed, 0x30, 0xd7, 0x37, 0x59, 0x50, - 0xcb, 0x24, 0xd6, 0x47, 0xd2, 0x85, 0x47, 0x21, 0x8e, 0x28, 0x65, 0x62, 0x44, 0xe4, 0x06, 0x94, - 0xc3, 0x5a, 0x55, 0x3a, 0xc6, 0x83, 0x1c, 0x4a, 0x84, 0xcc, 0xfd, 0x1f, 0xdb, 0xf3, 0xb9, 0x61, - 0x08, 0x03, 0x2d, 0x69, 0xe1, 0xb8, 0xf1, 0x1e, 0xcc, 0xa4, 0x3e, 0x3a, 0x56, 0xb1, 0xf4, 0xb9, - 0x02, 0x05, 0x61, 0xa8, 0x23, 0x5e, 0x5a, 0xbe, 0x01, 0x79, 0xcf, 0x8f, 0xc2, 0xe1, 0x81, 0xae, - 0x5d, 0x60, 0xa6, 0x7d, 0x69, 0x76, 0x1c, 0x5f, 0xaa, 0xde, 0x81, 0xfc, 0x3a, 0xae, 0x02, 0x50, - 0xb8, 0xa3, 0xb5, 0x9a, 0x6b, 0xab, 0xb5, 0x17, 0xc8, 0x0c, 0x54, 0x5a, 0x6b, 0x4f, 0x5b, 0x8f, - 0x9b, 0xed, 0xf5, 0xe6, 0xda, 0xe3, 0x9a, 0x42, 0x4e, 0xc0, 0x8c, 0x04, 0x68, 0xcd, 0x95, 0x66, - 0xeb, 0x69, 0x73, 0xb5, 0x96, 0x21, 0x15, 0x28, 0x2e, 0xdf, 0x7f, 0xb8, 0x72, 0xaf, 0xb9, 0x5a, - 0xcb, 0xaa, 0x1a, 0x80, 0x90, 0x13, 0xdd, 0xda, 0x6b, 0x50, 0xdc, 0x14, 0xc7, 0x53, 0xda, 0x0a, - 0x89, 0x8b, 0x2b, 0x10, 0xb5, 0x00, 0x85, 0x9c, 0x86, 0x42, 0xc2, 0x8f, 0xc9, 0x91, 0x6a, 0xc0, - 0xcc, 0x5d, 0xe6, 0x27, 0xc2, 0xf8, 0x98, 0xa7, 0x9c, 0x5c, 0x84, 0xa9, 0x4d, 0x99, 0x6d, 0xa2, - 0xe5, 0x66, 0x11, 0xa1, 0x12, 0xc0, 0xb8, 0x61, 0x7e, 0x92, 0x85, 0x3c, 0xfa, 0x80, 0xbe, 0x6b, - 0x3f, 0x1e, 0xa3, 0xb9, 0x87, 0xb4, 0xdd, 0x58, 0x10, 0x96, 0x90, 0x96, 0x11, 0xda, 0x71, 0x76, - 0xb8, 0xab, 0xcc, 0x1d, 0xec, 0x2a, 0xf3, 0x49, 0x57, 0xd9, 0xe0, 0xc1, 0xc0, 0xa7, 0x06, 0xf5, - 0xa9, 0x0c, 0xb6, 0xe1, 0x38, 0xe5, 0x46, 0x8b, 0x69, 0x37, 0xba, 0x20, 0xdd, 0x68, 0xe9, 0xf0, - 0x94, 0x1e, 0x5d, 0xec, 0x3c, 0x00, 0x33, 0xb6, 0x98, 0xf4, 0xb1, 0x65, 0xf4, 0xb1, 0x65, 0x0e, - 0x41, 0x27, 0x9b, 0xf4, 0xc0, 0x90, 0xf4, 0xc0, 0xe9, 0xc0, 0x5f, 0x39, 0x4e, 0xe0, 0x9f, 0x1a, - 0xcb, 0x58, 0xd7, 0xa0, 0x8c, 0x3b, 0x85, 0x36, 0xf6, 0x0a, 0x14, 0xd0, 0x35, 0x07, 0x26, 0x36, - 0x1b, 0x37, 0x31, 0xe1, 0xd4, 0x25, 0xc2, 0x50, 0x03, 0xfb, 0xdf, 0x0c, 0x54, 0xc3, 0x54, 0x11, - 0x17, 0x5d, 0x85, 0x8a, 0xf0, 0xff, 0xdc, 0x84, 0x82, 0x95, 0x2f, 0xf5, 0xad, 0x1c, 0xe0, 0x47, - 0x23, 0x0d, 0xb6, 0xc2, 0x9c, 0x73, 0xd8, 0xf7, 0x1a, 0xdf, 0x56, 0xa4, 0x00, 0x1c, 0xed, 0xb9, - 0x39, 0x04, 0xf5, 0x76, 0x70, 0xa6, 0xa7, 0x01, 0xd6, 0x9f, 0x3c, 0x6a, 0x6a, 0x4b, 0xab, 0x0f, - 0x5a, 0x6b, 0xb5, 0x17, 0x48, 0x19, 0xf2, 0xe2, 0xa7, 0xc2, 0x8f, 0xfb, 0x83, 0xe6, 0x83, 0xe5, - 0xa6, 0x56, 0xcb, 0x90, 0x1a, 0x4c, 0x7d, 0xf0, 0xb0, 0xb5, 0xd6, 0xd6, 0x9a, 0x7f, 0xfd, 0xa4, - 0xb9, 0xfe, 0xb8, 0x96, 0x55, 0xff, 0x4d, 0x81, 0xb3, 0xad, 0xae, 0x63, 0xbb, 0x61, 0xad, 0x96, - 0x8a, 0xb6, 0x47, 0xac, 0x64, 0x5f, 0x87, 0xbc, 0xcb, 0x3c, 0xd9, 0x91, 0x39, 0xd8, 0x4e, 0x05, - 0xa2, 0xfa, 0x97, 0x50, 0xfb, 0xc0, 0x36, 0xad, 0x51, 0x83, 0xf4, 0x5f, 0xc1, 0x29, 0x8e, 0xfe, - 0xd8, 0xee, 0xa1, 0x03, 0xb0, 0xfc, 0x80, 0xe6, 0x12, 0x54, 0xfd, 0x10, 0x18, 0x11, 0x4e, 0x45, - 0xc0, 0x96, 0xa1, 0x3e, 0x80, 0x53, 0xf7, 0x4c, 0x7d, 0x7b, 0x52, 0xd5, 0xc3, 0xef, 0xb3, 0x30, - 0xdb, 0x97, 0x2c, 0x8c, 0x98, 0x25, 0xf0, 0x75, 0xed, 0x5d, 0x8b, 0xc5, 0x5c, 0x4f, 0x11, 0xc7, - 0x2d, 0x83, 0xdc, 0x48, 0xd5, 0x3f, 0x95, 0xc5, 0xb3, 0x7d, 0x8a, 0x5c, 0xf7, 0x5d, 0xd3, 0xda, - 0x12, 0xaa, 0x8c, 0xb2, 0xf9, 0x93, 0x90, 0xf7, 0x74, 0xdb, 0x65, 0xe8, 0x98, 0xb2, 0x9a, 0x18, - 0x70, 0xbf, 0xe3, 0xf5, 0x36, 0xc4, 0x44, 0x1e, 0x27, 0xc2, 0x31, 0xf7, 0x04, 0x56, 0xaf, 0xdb, - 0x16, 0x93, 0x32, 0x17, 0xb3, 0x7a, 0xdd, 0xf5, 0x80, 0x30, 0x74, 0x58, 0xc5, 0x94, 0xc3, 0x4a, - 0x79, 0x89, 0xd2, 0x71, 0xbc, 0x44, 0x79, 0xac, 0xf2, 0xe0, 0x26, 0x54, 0xd8, 0x9e, 0x63, 0xba, - 0xb2, 0xef, 0x06, 0x87, 0x13, 0x0b, 0x74, 0x24, 0x26, 0x90, 0x73, 0xa9, 0xb5, 0x8d, 0x5e, 0x2d, - 0xab, 0xe1, 0x6f, 0xa2, 0x42, 0x95, 0x7b, 0xc3, 0x48, 0x0f, 0xdc, 0x6b, 0x55, 0xb5, 0x4a, 0x97, - 0xee, 0xad, 0x49, 0x55, 0xa8, 0xbf, 0x54, 0xe0, 0x54, 0xdf, 0x5e, 0xa3, 0x4b, 0xb9, 0x0e, 0x45, - 0x17, 0x47, 0x81, 0x3b, 0x49, 0x5c, 0x2f, 0xf4, 0x27, 0x93, 0x01, 0x36, 0x59, 0x86, 0xaa, 0xb0, - 0x80, 0x80, 0x3c, 0x33, 0x0a, 0xf9, 0x14, 0xd2, 0x68, 0x72, 0x8d, 0x54, 0x9d, 0x90, 0x3d, 0xac, - 0x4e, 0xc8, 0xf5, 0xd5, 0x09, 0x0b, 0x68, 0xc3, 0x3b, 0x23, 0xa7, 0xc9, 0xff, 0x08, 0x27, 0xee, - 0x9b, 0xd6, 0xf6, 0x84, 0xae, 0xbe, 0xc6, 0xbd, 0xaa, 0xfa, 0x89, 0x02, 0x0d, 0xae, 0xf5, 0x64, - 0xe1, 0x14, 0x9e, 0xe3, 0x43, 0xaa, 0xee, 0x37, 0x20, 0xdf, 0x31, 0xbb, 0xa6, 0x3f, 0x92, 0xaf, - 0x45, 0x4c, 0xf2, 0x26, 0x14, 0x37, 0x6d, 0x77, 0x97, 0xba, 0xc6, 0xd0, 0xc4, 0x2b, 0xe2, 0x31, - 0x40, 0x8d, 0x05, 0x88, 0x5c, 0x22, 0x20, 0xfd, 0xb7, 0x02, 0x84, 0xb3, 0x9f, 0xf2, 0xb6, 0x21, - 0x5f, 0xca, 0xc8, 0x7c, 0x1d, 0x21, 0x8f, 0x8c, 0x98, 0xca, 0x26, 0x98, 0x72, 0x61, 0x96, 0xf3, - 0x84, 0x06, 0xe0, 0x1d, 0x54, 0x27, 0x0e, 0x09, 0x7b, 0x11, 0xfb, 0xd9, 0x51, 0xd9, 0x57, 0x7f, - 0xc0, 0x8f, 0x53, 0xf0, 0xd1, 0x51, 0x5d, 0xf1, 0x11, 0xb6, 0x2f, 0x54, 0x53, 0xf6, 0x08, 0x6a, - 0x4a, 0xee, 0xdd, 0x67, 0x0a, 0x5c, 0xe1, 0x2c, 0xf7, 0x1d, 0x49, 0x6f, 0xc9, 0xb5, 0x7b, 0x96, - 0xf1, 0x50, 0x9c, 0xcb, 0x71, 0x4a, 0x45, 0xb2, 0x98, 0x94, 0xa8, 0xdf, 0xcd, 0x3f, 0xe9, 0x17, - 0x29, 0x1e, 0x38, 0xb2, 0xc9, 0xc0, 0x71, 0x0d, 0x0a, 0xc2, 0xd5, 0xc9, 0xf3, 0x34, 0x50, 0xdc, - 0xb7, 0xdf, 0x94, 0xb7, 0x6d, 0x02, 0x55, 0xfd, 0x9d, 0x02, 0xf3, 0x83, 0xe5, 0x1a, 0x53, 0x98, - 0x33, 0x50, 0x0e, 0x18, 0x0b, 0x42, 0x65, 0x49, 0x72, 0xe6, 0x1d, 0xc1, 0x46, 0x86, 0x6d, 0x44, - 0x4c, 0xca, 0xfc, 0xe8, 0x52, 0xfe, 0x36, 0x23, 0x4e, 0xde, 0x03, 0xea, 0xeb, 0xcf, 0xd8, 0x71, - 0x4e, 0xde, 0x6d, 0xa8, 0xd2, 0x9e, 0xff, 0xcc, 0x76, 0x4d, 0x9f, 0xfa, 0xe6, 0xce, 0x28, 0x17, - 0x9b, 0x49, 0x02, 0xdc, 0x75, 0xba, 0xc1, 0x3a, 0x23, 0x05, 0x77, 0x81, 0x8a, 0x17, 0x49, 0xa6, - 0xd5, 0xf6, 0xcc, 0x8f, 0xd9, 0x41, 0x9b, 0x1b, 0xf0, 0x5a, 0xec, 0x9a, 0xd6, 0xba, 0xf9, 0x31, - 0x43, 0x3a, 0xba, 0x27, 0xe8, 0xf2, 0xa3, 0xd0, 0xd1, 0x3d, 0xa4, 0x5b, 0x84, 0xfc, 0x47, 0x3d, - 0xe6, 0xee, 0xcb, 0x67, 0x2d, 0x87, 0xf0, 0x88, 0xa8, 0xea, 0x1e, 0xd4, 0xb9, 0x8a, 0x07, 0x5e, - 0x7b, 0x1c, 0x41, 0xd1, 0xaf, 0x40, 0x4d, 0xa7, 0xfa, 0x33, 0x86, 0x8f, 0x64, 0x12, 0x8e, 0x67, - 0x26, 0x84, 0xcb, 0x20, 0xf6, 0x0d, 0x05, 0xe6, 0xf8, 0xa7, 0x07, 0x5f, 0x6e, 0xfc, 0x05, 0x14, - 0x65, 0x0a, 0x27, 0x0d, 0xb7, 0x20, 0x32, 0xb8, 0xd4, 0x05, 0x4b, 0xa6, 0xef, 0x82, 0x65, 0x72, - 0x46, 0xab, 0xfe, 0x5c, 0x81, 0xcb, 0x9c, 0xc3, 0x78, 0xe6, 0x3a, 0xcc, 0x79, 0x8c, 0x92, 0xcb, - 0x7e, 0x25, 0x5c, 0xc7, 0x6f, 0x14, 0x38, 0x3b, 0x50, 0xa8, 0xb1, 0x24, 0xf9, 0x4a, 0xfb, 0x8d, - 0x5f, 0x67, 0xe0, 0x74, 0x52, 0xc4, 0x50, 0xb8, 0x15, 0x98, 0xd6, 0xa9, 0xcf, 0xb6, 0x6c, 0x77, - 0xbf, 0xed, 0xf9, 0xd4, 0x0d, 0x6c, 0xfb, 0xe0, 0xad, 0xa8, 0x06, 0x34, 0xeb, 0x9c, 0x84, 0xbc, - 0x0f, 0x53, 0xe1, 0x22, 0xcc, 0x32, 0x46, 0xda, 0xcd, 0x4a, 0x40, 0xd1, 0xb4, 0x0c, 0x72, 0x13, - 0x00, 0x3f, 0x1e, 0xbf, 0x1c, 0x3a, 0x98, 0xbc, 0x8c, 0xf8, 0x98, 0x0d, 0x5f, 0x87, 0x12, 0xb3, - 0x0c, 0x41, 0x9a, 0x1b, 0x81, 0xb4, 0xc8, 0x2c, 0x03, 0x09, 0xc3, 0x6d, 0x29, 0x1c, 0x61, 0x5b, - 0x4a, 0x89, 0x93, 0xf1, 0x7d, 0x99, 0x0a, 0xf0, 0x2c, 0x20, 0x99, 0x83, 0x0c, 0x3d, 0xb7, 0x5f, - 0x6e, 0x22, 0xf0, 0x9f, 0x0a, 0xe4, 0x31, 0x8c, 0xf0, 0xf3, 0xd4, 0xe5, 0x3f, 0x62, 0xb9, 0x0a, - 0x8e, 0x5b, 0x06, 0x79, 0x71, 0x50, 0x94, 0x28, 0x4d, 0x22, 0x12, 0x10, 0xc8, 0x85, 0x51, 0x20, - 0xaf, 0xe1, 0x6f, 0xf5, 0x06, 0x94, 0x91, 0x23, 0x2c, 0x48, 0x5e, 0x05, 0xc1, 0x05, 0x1b, 0x78, - 0x73, 0x82, 0x78, 0x5a, 0x80, 0xc1, 0x8f, 0xf0, 0x54, 0xdc, 0x61, 0xf7, 0x5d, 0x92, 0xd5, 0xa1, - 0xe8, 0xf5, 0xd0, 0x9f, 0x06, 0x65, 0xaa, 0x1c, 0xc6, 0x5b, 0x47, 0xd9, 0x64, 0xeb, 0x88, 0xc8, - 0xf6, 0x95, 0x64, 0xb1, 0xbf, 0x43, 0x95, 0x4f, 0x75, 0xa8, 0x52, 0xc5, 0x64, 0x61, 0xac, 0x62, - 0xf2, 0x5c, 0xa2, 0x5d, 0x54, 0x44, 0x3d, 0xc7, 0x20, 0xea, 0x3f, 0x41, 0x2d, 0x2e, 0x21, 0xea, - 0xe8, 0x16, 0x54, 0xad, 0x78, 0x98, 0x92, 0x9a, 0x4a, 0x34, 0x34, 0xe3, 0x44, 0x5a, 0x12, 0x7d, - 0x9c, 0xd8, 0xf4, 0x08, 0xea, 0x8f, 0x5c, 0xbb, 0x6b, 0xcb, 0x4e, 0xc4, 0x04, 0xee, 0x1d, 0x3e, - 0x84, 0x13, 0x1a, 0xa3, 0xc6, 0xf1, 0xdb, 0x05, 0xb1, 0x03, 0x96, 0x8d, 0x1f, 0x30, 0xf5, 0xef, - 0x61, 0xae, 0xef, 0x0b, 0x21, 0xd3, 0xb7, 0x06, 0xf4, 0x0a, 0xce, 0xc7, 0x15, 0x37, 0x80, 0xb9, - 0x78, 0xa7, 0xe0, 0x03, 0xc8, 0x6a, 0x8e, 0x3e, 0xc8, 0xd0, 0x1c, 0xba, 0xdf, 0xb1, 0x69, 0x78, - 0x1f, 0x22, 0x87, 0x5c, 0x15, 0xcf, 0x7c, 0xdf, 0x69, 0x73, 0xee, 0xa5, 0xa5, 0xf1, 0xf1, 0x3d, - 0xb6, 0xaf, 0xbe, 0x03, 0xc5, 0x75, 0xe6, 0x79, 0x5c, 0x3c, 0x6e, 0x8e, 0x68, 0x14, 0x62, 0xd1, - 0x92, 0x16, 0x0c, 0xa3, 0x87, 0x55, 0x99, 0xd8, 0xc3, 0x2a, 0xf5, 0x57, 0x19, 0xa8, 0x26, 0xb8, - 0x9c, 0xa0, 0x02, 0xa3, 0x8e, 0x41, 0x2e, 0xd6, 0x31, 0x88, 0xb7, 0x67, 0xf2, 0x89, 0xf6, 0x0c, - 0xb9, 0x0c, 0x33, 0x0e, 0x73, 0xbb, 0x26, 0x8a, 0xd2, 0x76, 0x19, 0x35, 0xe4, 0x65, 0xcc, 0x74, - 0x04, 0xe6, 0x6a, 0xe5, 0x86, 0x17, 0x43, 0xdc, 0x75, 0x4d, 0x5f, 0xb4, 0x66, 0xf3, 0x5a, 0x6c, - 0x81, 0xbf, 0xe1, 0xe0, 0x2f, 0xef, 0x86, 0x46, 0xdd, 0x85, 0x5a, 0x42, 0xb3, 0x4b, 0xfa, 0xf6, - 0x24, 0x9b, 0x59, 0x71, 0xb5, 0xe7, 0x12, 0x76, 0xdb, 0x84, 0xd9, 0xf4, 0x87, 0x3d, 0xf2, 0x3a, - 0xe4, 0xa8, 0xbe, 0x1d, 0x58, 0xea, 0xd9, 0xb8, 0xa5, 0xa6, 0x91, 0x35, 0xc4, 0x54, 0x9b, 0x30, - 0x9d, 0x34, 0x7d, 0x72, 0x0d, 0x8a, 0xc2, 0x80, 0x83, 0x65, 0xe6, 0x86, 0x2e, 0xa3, 0x05, 0x98, - 0xea, 0x87, 0x29, 0x6e, 0xd0, 0xf3, 0x1c, 0x65, 0xa5, 0xa1, 0x17, 0xdc, 0x9f, 0xe6, 0x00, 0xa2, - 0xcc, 0xa4, 0xef, 0x48, 0x71, 0xc3, 0x37, 0xfd, 0x4e, 0xd8, 0xb7, 0xc2, 0x41, 0xba, 0x87, 0x91, - 0xed, 0xef, 0x61, 0x34, 0xa0, 0x14, 0xa4, 0x18, 0xa8, 0xe0, 0xaa, 0x16, 0x8e, 0xc9, 0x3c, 0x80, - 0x67, 0xbb, 0x7e, 0xdb, 0x76, 0x0d, 0xe6, 0xa2, 0x19, 0x57, 0xb5, 0x32, 0x87, 0x3c, 0xe4, 0x80, - 0x30, 0x3a, 0x15, 0x70, 0x02, 0x7f, 0x8b, 0x30, 0x29, 0x6b, 0x90, 0x22, 0xc2, 0xc3, 0x32, 0xa3, - 0xef, 0xea, 0xad, 0xd4, 0x77, 0xf5, 0x86, 0x8f, 0xf0, 0xa9, 0xd5, 0xc6, 0xc7, 0x39, 0x68, 0x88, - 0x25, 0xce, 0x8e, 0xd5, 0xc4, 0x47, 0xb1, 0xf3, 0x00, 0x3c, 0x83, 0xa1, 0x3a, 0x06, 0x59, 0x10, - 0xec, 0x30, 0xcb, 0x58, 0x42, 0x00, 0x9f, 0xc6, 0xfb, 0x31, 0x71, 0x2b, 0x5d, 0x11, 0xd3, 0x1c, - 0xa2, 0x71, 0x40, 0xe2, 0x82, 0x73, 0xea, 0xe0, 0x0b, 0xce, 0xea, 0x58, 0xc7, 0xe7, 0x9d, 0x44, - 0x56, 0x36, 0x7d, 0x78, 0xb7, 0x32, 0xca, 0xc9, 0xde, 0x8a, 0xe5, 0x64, 0x33, 0x87, 0x12, 0x86, - 0x19, 0x59, 0x03, 0x4a, 0x46, 0xcf, 0xc5, 0xf0, 0x54, 0xaf, 0x89, 0x3d, 0x0b, 0xc6, 0xe4, 0x22, - 0x4c, 0x09, 0x6e, 0xa4, 0x9a, 0x66, 0x85, 0x92, 0x11, 0x26, 0x14, 0xa5, 0x6e, 0xc0, 0x74, 0x64, - 0x48, 0x68, 0xa8, 0x37, 0xa0, 0x12, 0xa5, 0xe9, 0x81, 0xb1, 0x9e, 0x8e, 0x1b, 0x6b, 0x2c, 0xed, - 0x8f, 0xa3, 0x0e, 0xb5, 0xd6, 0xcf, 0x14, 0x38, 0x99, 0x2e, 0x15, 0xfe, 0x1c, 0xae, 0x50, 0xff, - 0x98, 0x81, 0x93, 0x4f, 0xd0, 0xfb, 0xc9, 0x7b, 0xce, 0x20, 0x52, 0xc6, 0x2f, 0xf2, 0x95, 0xb1, - 0x2e, 0xf2, 0xdf, 0xc7, 0x7f, 0x0f, 0x71, 0x3a, 0x74, 0x5f, 0xbc, 0x64, 0xc9, 0x8c, 0x40, 0x5d, - 0x91, 0x14, 0xf8, 0xd4, 0xe5, 0x66, 0xa2, 0x9f, 0x38, 0x4a, 0x7a, 0x19, 0xeb, 0x36, 0x5e, 0x8f, - 0xf5, 0x30, 0x73, 0x23, 0x90, 0x86, 0x1d, 0xce, 0x1b, 0x50, 0xea, 0xd8, 0x22, 0x47, 0x92, 0x45, - 0xd6, 0x21, 0x02, 0x07, 0xd8, 0x9c, 0x92, 0x5b, 0xfc, 0xc7, 0xb6, 0xc5, 0x46, 0xba, 0x72, 0x08, - 0xb1, 0xd5, 0x4f, 0x33, 0x40, 0x84, 0xf6, 0x47, 0xbc, 0xc2, 0xe6, 0x01, 0x61, 0x64, 0xa5, 0x8a, - 0x9b, 0xcf, 0x5b, 0xfd, 0x2e, 0xf3, 0xf0, 0xdd, 0x88, 0x39, 0xd4, 0x23, 0x2b, 0x34, 0xb9, 0x8d, - 0xf9, 0xf1, 0xb6, 0x31, 0x68, 0x1a, 0x17, 0x46, 0x6b, 0x1a, 0xab, 0x9f, 0xe7, 0x20, 0x87, 0x9d, - 0xcb, 0x74, 0x1c, 0x89, 0x3f, 0x20, 0xcb, 0xa4, 0x1e, 0x90, 0x5d, 0x4c, 0x59, 0x6a, 0x10, 0x4e, - 0x62, 0xb6, 0x78, 0xc8, 0x13, 0xa1, 0x83, 0x3b, 0xe6, 0xa1, 0x3d, 0xc9, 0x8e, 0x79, 0x68, 0x31, - 0x8d, 0x98, 0xc5, 0xc8, 0xe6, 0x54, 0x30, 0x4e, 0xf8, 0xf5, 0x52, 0xca, 0xaf, 0x9f, 0x87, 0x4a, - 0xec, 0xc9, 0x00, 0x06, 0x94, 0xb2, 0x06, 0xd1, 0x8b, 0x01, 0x1e, 0x6f, 0x84, 0xa6, 0xf8, 0xb4, - 0x7c, 0x42, 0x26, 0x00, 0x2d, 0x83, 0x5c, 0x82, 0xea, 0x16, 0xed, 0x32, 0x1d, 0xa3, 0x51, 0xf4, - 0x8e, 0x6c, 0x2a, 0x02, 0x8a, 0xdc, 0xdd, 0xf3, 0x19, 0xc5, 0xff, 0x1a, 0x9b, 0x92, 0x45, 0x13, - 0x1f, 0xb7, 0xb0, 0x33, 0x60, 0x5b, 0x1d, 0xd3, 0x12, 0x01, 0xa5, 0xa4, 0xc9, 0x51, 0xaa, 0x61, - 0x3f, 0x9d, 0x6e, 0xd8, 0xa7, 0x82, 0xd1, 0xcc, 0x71, 0x72, 0xb9, 0xda, 0x58, 0xdd, 0xb6, 0xeb, - 0x50, 0x8f, 0xd4, 0x25, 0x1e, 0xf4, 0xb6, 0xb9, 0xb0, 0x5c, 0xb6, 0x59, 0x94, 0xed, 0xd4, 0x66, - 0xff, 0x7b, 0x5f, 0xa1, 0x04, 0xea, 0x38, 0x42, 0x8b, 0x44, 0x28, 0x01, 0xc7, 0x2d, 0x43, 0xfd, - 0xff, 0x0c, 0x54, 0xc3, 0x72, 0x3f, 0xe8, 0xcb, 0x63, 0x46, 0x97, 0xe8, 0xf8, 0x5f, 0x4a, 0xb7, - 0xcc, 0x43, 0xfc, 0x68, 0xa4, 0x41, 0x2f, 0xbc, 0x37, 0x18, 0xda, 0x97, 0xff, 0x8e, 0x02, 0xe5, - 0x90, 0x82, 0x5c, 0x86, 0x3c, 0x7e, 0x46, 0xba, 0xe4, 0x01, 0xef, 0x0a, 0xc4, 0xfc, 0x97, 0xd3, - 0x9a, 0xbf, 0x0a, 0x79, 0xf1, 0xc8, 0xe0, 0x65, 0xc8, 0xc7, 0x1f, 0x29, 0xf4, 0xbf, 0x1f, 0x10, - 0xd3, 0xea, 0xbf, 0x67, 0x60, 0x1e, 0x13, 0xfe, 0x63, 0xbe, 0x5b, 0x23, 0x7f, 0x0b, 0x05, 0x11, - 0x46, 0xa5, 0xbc, 0xb7, 0xe3, 0x5f, 0x3c, 0xf0, 0x0b, 0xfd, 0x31, 0x16, 0xd1, 0x35, 0xb9, 0x5e, - 0x63, 0x13, 0x4e, 0x0f, 0xc6, 0x88, 0x1a, 0xd6, 0xca, 0xb0, 0x86, 0x75, 0x26, 0xd5, 0xb0, 0x8e, - 0x1f, 0xed, 0x6c, 0xf2, 0x68, 0xab, 0xff, 0x9a, 0x01, 0x82, 0xeb, 0x1e, 0xb7, 0xae, 0x0b, 0xcb, - 0xb7, 0xec, 0x90, 0xf2, 0x2d, 0x97, 0x2c, 0x48, 0x56, 0xfb, 0xcb, 0xb7, 0x11, 0x2e, 0xdb, 0xd3, - 0xb5, 0xdd, 0x9d, 0x01, 0xb5, 0xdd, 0x08, 0xf7, 0x6b, 0xe9, 0xc2, 0x4f, 0x7d, 0x0a, 0x8d, 0x7e, - 0x2d, 0x78, 0x51, 0x52, 0x92, 0x2a, 0x40, 0xce, 0xf5, 0xed, 0xf3, 0x90, 0x7a, 0xe6, 0x5f, 0x32, - 0x70, 0x16, 0xe7, 0xd3, 0x49, 0xdc, 0x58, 0xd7, 0xbd, 0x4f, 0x53, 0x66, 0x76, 0xab, 0xef, 0xf3, - 0x43, 0x96, 0x5f, 0x48, 0xc3, 0x93, 0x46, 0xc6, 0xe0, 0xd4, 0x40, 0x84, 0xc9, 0xda, 0xd8, 0xf2, - 0x7b, 0x30, 0xa7, 0xdb, 0xdd, 0x85, 0x67, 0xcc, 0xb5, 0x4d, 0xbd, 0x43, 0x37, 0xbc, 0x18, 0xfb, - 0xcb, 0xe5, 0x35, 0xfc, 0xbd, 0xe4, 0x98, 0x8f, 0x94, 0xbf, 0xcb, 0x52, 0xc7, 0xfc, 0x56, 0x26, - 0xb7, 0x76, 0xef, 0xd1, 0xf2, 0x77, 0x33, 0x05, 0x31, 0xb3, 0x51, 0xc0, 0x1d, 0xbc, 0xf6, 0xa7, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x4d, 0x4a, 0x7f, 0x4b, 0x3d, 0x00, 0x00, + 0x86, 0x5c, 0x23, 0x1c, 0x87, 0x7b, 0x9b, 0x1d, 0xba, 0xb7, 0xb8, 0xf2, 0xe4, 0x78, 0xfe, 0x5f, + 0x05, 0x66, 0xe4, 0xca, 0x77, 0xa8, 0xce, 0x36, 0x6c, 0x7b, 0x7b, 0x88, 0xd9, 0xbd, 0x9b, 0xd0, + 0xe7, 0xcb, 0x03, 0x58, 0x0b, 0x16, 0x98, 0x1c, 0x77, 0x3f, 0x55, 0xa0, 0x91, 0x5a, 0xbc, 0x65, + 0x79, 0x3e, 0xb5, 0xfc, 0xbb, 0xb4, 0xcb, 0xc8, 0xeb, 0x40, 0x3c, 0x73, 0xcb, 0x62, 0x46, 0xdb, + 0xe9, 0xd0, 0x7d, 0xe6, 0xb6, 0x4d, 0x6b, 0xd3, 0x96, 0x2b, 0xd7, 0xc4, 0xcc, 0x23, 0x9c, 0x68, + 0x59, 0x9b, 0x36, 0x59, 0x4d, 0x08, 0xf0, 0xc6, 0x01, 0x02, 0xc4, 0xbe, 0x31, 0x39, 0x59, 0x7e, + 0x92, 0x81, 0x59, 0xf9, 0x1d, 0xbe, 0xf0, 0x0a, 0xb3, 0x7c, 0xe6, 0x72, 0x67, 0x14, 0xf0, 0x1e, + 0x18, 0x6f, 0x49, 0x00, 0x5a, 0x06, 0x9f, 0xdc, 0xe8, 0x59, 0x46, 0x87, 0xf1, 0x49, 0x69, 0x2a, + 0x02, 0xd0, 0x32, 0xc8, 0x6b, 0x30, 0x1b, 0xba, 0xe3, 0xb6, 0xc7, 0x74, 0xdb, 0x32, 0x3c, 0xf4, + 0x8e, 0x59, 0xad, 0x16, 0x4e, 0xac, 0x0b, 0x38, 0x21, 0x90, 0xf3, 0x68, 0xc7, 0xaf, 0xe7, 0x70, + 0x11, 0xfc, 0x4d, 0xce, 0x42, 0x99, 0xeb, 0x88, 0xfa, 0x3d, 0x97, 0x49, 0x3f, 0x18, 0x01, 0xc8, + 0x4b, 0x30, 0xed, 0xf4, 0x36, 0x3a, 0xa6, 0xde, 0xde, 0x66, 0xfb, 0xed, 0x9e, 0xdb, 0x41, 0x5f, + 0x58, 0xd6, 0xa6, 0x04, 0xf4, 0x1e, 0xdb, 0x7f, 0xe2, 0x76, 0xc8, 0x4d, 0xa9, 0xd3, 0x22, 0xea, + 0xf4, 0xf2, 0x00, 0x9d, 0x46, 0xb2, 0x4e, 0x4e, 0x95, 0xff, 0x1d, 0x1d, 0xfe, 0xbb, 0xe8, 0x5a, + 0x87, 0x98, 0xec, 0xe1, 0x2e, 0x40, 0x90, 0x4f, 0x8e, 0xb3, 0x98, 0x0b, 0x5f, 0xf7, 0x19, 0xed, + 0x1e, 0xd9, 0x85, 0x23, 0xf5, 0xe4, 0xf8, 0x5a, 0x81, 0xd9, 0x25, 0xc3, 0xb8, 0xe3, 0x9a, 0xcc, + 0x32, 0x3c, 0x8d, 0x7d, 0xdc, 0x63, 0x9e, 0xcf, 0x17, 0x30, 0x0d, 0xaf, 0xae, 0x5c, 0xc8, 0xf2, + 0x05, 0x4c, 0xc3, 0xe3, 0x26, 0xc1, 0xa3, 0xb0, 0x45, 0xbb, 0x4c, 0x30, 0x57, 0xd6, 0x22, 0x80, + 0x7a, 0x1f, 0x4e, 0x2e, 0x19, 0xc6, 0x5d, 0xd7, 0xee, 0x39, 0x3c, 0x62, 0x87, 0xeb, 0xcc, 0x41, + 0x69, 0x8b, 0x03, 0x23, 0x13, 0x2e, 0xe2, 0xb8, 0x65, 0xf0, 0x29, 0x4e, 0xdf, 0xe6, 0xdf, 0x11, + 0xeb, 0x15, 0xf9, 0xb8, 0x65, 0x78, 0xea, 0xff, 0x29, 0x50, 0x5f, 0xea, 0xf9, 0xcf, 0x98, 0xe5, + 0x9b, 0x3a, 0xf5, 0x19, 0x06, 0xad, 0x60, 0xc9, 0x45, 0x28, 0x52, 0xa1, 0x08, 0x99, 0x2f, 0xd4, + 0x87, 0x85, 0x39, 0x2d, 0x40, 0x24, 0x8b, 0x50, 0xd0, 0x5d, 0x46, 0x7d, 0x21, 0xfe, 0xa0, 0xb8, + 0xbb, 0x6c, 0xdb, 0x9d, 0xa7, 0x5c, 0x27, 0x9a, 0xc4, 0xe4, 0xbe, 0x38, 0x90, 0x4f, 0x66, 0x16, + 0xe1, 0x58, 0xfd, 0x86, 0x02, 0x73, 0x71, 0x06, 0x45, 0x08, 0x0b, 0x38, 0xbc, 0x96, 0xe6, 0x70, + 0x6e, 0x68, 0xd4, 0xfb, 0xf2, 0x58, 0x94, 0xa9, 0xce, 0x38, 0x2c, 0x06, 0xd9, 0xd1, 0xf3, 0x62, + 0x31, 0xbd, 0xcd, 0x18, 0xbf, 0xc6, 0xda, 0x66, 0x41, 0xf1, 0xdc, 0x18, 0xfc, 0xb9, 0x02, 0x67, + 0xe2, 0x0c, 0x06, 0x41, 0x20, 0xe0, 0xf1, 0xed, 0x34, 0x8f, 0x67, 0x0e, 0x88, 0x1c, 0xcf, 0x8d, + 0x4d, 0xb2, 0x00, 0x39, 0x6f, 0xdf, 0xd2, 0xd1, 0x83, 0x1f, 0xbc, 0x1a, 0xe2, 0xa9, 0x3f, 0x52, + 0xe0, 0x95, 0x41, 0x62, 0xc5, 0x62, 0x5b, 0x20, 0xe1, 0xed, 0xb4, 0x84, 0xaf, 0x8c, 0x16, 0x1b, + 0x9f, 0xdf, 0x9e, 0x7c, 0xaa, 0xc0, 0x7c, 0x9c, 0xf9, 0x28, 0x88, 0x04, 0x3c, 0x5f, 0x4f, 0xf3, + 0x3c, 0x7f, 0x60, 0xec, 0xf9, 0xf2, 0x8e, 0xa0, 0x88, 0x28, 0x63, 0x1d, 0x41, 0x49, 0xf2, 0xa5, + 0x1d, 0x41, 0x8c, 0x2d, 0x63, 0x1d, 0x41, 0x41, 0xf1, 0xdc, 0x18, 0xbc, 0x0f, 0x27, 0x97, 0xa9, + 0x35, 0xa9, 0xc0, 0xd2, 0x84, 0x13, 0xcb, 0x1d, 0x5b, 0xdf, 0x3e, 0x66, 0xb4, 0xfb, 0x87, 0x1c, + 0x4c, 0xaf, 0x3c, 0xa3, 0x96, 0xc5, 0x3a, 0x0f, 0x98, 0xe7, 0xd1, 0x2d, 0x46, 0xe6, 0x01, 0x74, + 0x01, 0x89, 0x38, 0x2a, 0x4b, 0x48, 0xcb, 0xe0, 0xd3, 0x5d, 0x81, 0x19, 0xe5, 0x6b, 0x65, 0x09, + 0x69, 0x19, 0xe4, 0x2a, 0xe4, 0x74, 0xdb, 0x10, 0xd2, 0x73, 0x2f, 0x92, 0xd6, 0x59, 0xcb, 0xf2, + 0xaf, 0x2d, 0xca, 0x23, 0xcc, 0x11, 0x79, 0xfa, 0xe7, 0x31, 0xcb, 0x10, 0xb9, 0xa1, 0xc8, 0xdc, + 0x4a, 0x02, 0xd0, 0x32, 0x12, 0xfa, 0xcc, 0xa7, 0x7c, 0x45, 0x1d, 0x8a, 0xba, 0x6d, 0xf9, 0xcc, + 0xf2, 0x65, 0xd2, 0x16, 0x0c, 0x79, 0x79, 0x2b, 0xf6, 0x63, 0xd4, 0x02, 0x15, 0x04, 0x3a, 0x96, + 0xb7, 0x37, 0xa1, 0xd2, 0x73, 0x8c, 0x90, 0xb8, 0x74, 0x38, 0xb1, 0x40, 0x47, 0xe2, 0xf7, 0x00, + 0x1c, 0xe6, 0x7a, 0xa6, 0x87, 0x6c, 0x95, 0x0f, 0xb5, 0x9b, 0x18, 0x36, 0x57, 0x84, 0x6b, 0xdb, + 0xdd, 0x36, 0x0a, 0x0b, 0x42, 0x58, 0x0e, 0x58, 0xe3, 0xc2, 0xc6, 0x8d, 0xa4, 0x92, 0x34, 0x92, + 0x73, 0x50, 0x91, 0x46, 0xd2, 0xb6, 0x2d, 0x56, 0x9f, 0x12, 0x3b, 0x22, 0xec, 0xe4, 0xa1, 0xc5, + 0xe2, 0xf3, 0xfe, 0xae, 0x5d, 0xaf, 0xc6, 0xe7, 0x1f, 0xef, 0xda, 0xea, 0xbf, 0x2a, 0x40, 0x92, + 0x26, 0x70, 0xdf, 0xf4, 0x7c, 0xf2, 0x0e, 0x94, 0xe4, 0xae, 0x0a, 0x73, 0xe2, 0x82, 0xc4, 0xce, + 0x4c, 0x92, 0x42, 0x0b, 0x71, 0xc9, 0x79, 0xa8, 0x58, 0x6c, 0xcf, 0x6f, 0xeb, 0x3d, 0xd7, 0xb3, + 0x5d, 0x69, 0x20, 0xc0, 0x41, 0x2b, 0x08, 0xe1, 0x08, 0x8e, 0xcb, 0x76, 0x02, 0x04, 0x71, 0x4c, + 0x80, 0x83, 0x04, 0x82, 0xfa, 0x43, 0xce, 0x10, 0x6e, 0x08, 0x1e, 0x96, 0xc0, 0xb4, 0x09, 0xe4, + 0x50, 0x35, 0xc2, 0x22, 0xf1, 0x37, 0xb9, 0x00, 0x15, 0x83, 0x79, 0xba, 0x6b, 0x3a, 0xbe, 0x69, + 0x5b, 0xf2, 0x63, 0x71, 0x10, 0x57, 0x5c, 0x87, 0x5a, 0x5b, 0x6d, 0x9f, 0x6e, 0xc9, 0x4f, 0x15, + 0xf9, 0xf8, 0x31, 0xdd, 0xe2, 0x96, 0x4c, 0x77, 0xa8, 0x4f, 0x5d, 0x4c, 0xfc, 0x85, 0xe9, 0x95, + 0x05, 0x84, 0x67, 0xfd, 0x04, 0x72, 0xb6, 0xc3, 0x2c, 0xb4, 0xbb, 0x92, 0x86, 0xbf, 0xf9, 0x1e, + 0x75, 0xe9, 0x5e, 0x5b, 0x78, 0x12, 0x6e, 0x75, 0x79, 0xad, 0xd4, 0xa5, 0x7b, 0x2b, 0x7c, 0xac, + 0xde, 0x81, 0x93, 0xab, 0xac, 0xc3, 0x7c, 0x76, 0xcc, 0x33, 0x79, 0x15, 0x88, 0x58, 0x27, 0x21, + 0xfe, 0x70, 0x37, 0xa1, 0xde, 0x85, 0x73, 0x82, 0xe0, 0x3e, 0xa3, 0x06, 0x73, 0x37, 0x6c, 0xea, + 0x1a, 0x1a, 0xd3, 0x6d, 0xfe, 0x57, 0x10, 0xbf, 0x0c, 0xd3, 0x9d, 0x68, 0x2e, 0x5a, 0xa2, 0x1a, + 0x83, 0xb6, 0x0c, 0x75, 0x01, 0x1a, 0x62, 0xa1, 0x35, 0xdb, 0x37, 0x37, 0xb9, 0x1b, 0x35, 0x6d, + 0x6b, 0xb8, 0x1c, 0xaa, 0x0e, 0xa7, 0x04, 0xfe, 0xba, 0x6f, 0xbb, 0x74, 0x8b, 0x3d, 0xdc, 0xf8, + 0x5b, 0xa6, 0xfb, 0x68, 0x93, 0xa0, 0xdb, 0x9d, 0x0e, 0xd3, 0x71, 0x5b, 0xc4, 0xb7, 0x62, 0x90, + 0x20, 0xab, 0xcf, 0x44, 0x59, 0x7d, 0x1d, 0x8a, 0x3b, 0xfc, 0x2c, 0xd8, 0x56, 0xb0, 0x4d, 0x72, + 0xa8, 0xb6, 0xe1, 0xcc, 0x80, 0x8f, 0x78, 0x51, 0x5c, 0x07, 0x1b, 0x21, 0xed, 0x80, 0xb9, 0xca, + 0xe2, 0xc5, 0xb8, 0xa5, 0x0e, 0xe4, 0x50, 0x2b, 0xdb, 0xf2, 0x97, 0xa7, 0xfe, 0x5e, 0x81, 0x7c, + 0x73, 0x87, 0x1f, 0xc1, 0x41, 0x26, 0xb6, 0x04, 0xe0, 0xb8, 0xb6, 0xc3, 0x5c, 0xdf, 0x64, 0x41, + 0x2d, 0x93, 0x58, 0x1f, 0x49, 0x17, 0x1e, 0x85, 0x38, 0xa2, 0x94, 0x89, 0x11, 0x91, 0x1b, 0x50, + 0x0e, 0x6b, 0x55, 0xe9, 0x18, 0x0f, 0x72, 0x28, 0x11, 0x32, 0xf7, 0x7f, 0x6c, 0xcf, 0xe7, 0x86, + 0x21, 0x0c, 0xb4, 0xa4, 0x85, 0xe3, 0xc6, 0xfb, 0x30, 0x93, 0xfa, 0xe8, 0x58, 0xc5, 0xd2, 0x17, + 0x0a, 0x14, 0x84, 0xa1, 0x8e, 0x78, 0x69, 0xf9, 0x26, 0xe4, 0x3d, 0x3f, 0x0a, 0x87, 0x07, 0xba, + 0x76, 0x81, 0x99, 0xf6, 0xa5, 0xd9, 0x71, 0x7c, 0xa9, 0x7a, 0x07, 0xf2, 0xeb, 0xb8, 0x0a, 0x40, + 0xe1, 0x8e, 0xd6, 0x6a, 0xae, 0xad, 0xd6, 0x5e, 0x20, 0x33, 0x50, 0x69, 0xad, 0x3d, 0x6d, 0x3d, + 0x6e, 0xb6, 0xd7, 0x9b, 0x6b, 0x8f, 0x6b, 0x0a, 0x39, 0x01, 0x33, 0x12, 0xa0, 0x35, 0x57, 0x9a, + 0xad, 0xa7, 0xcd, 0xd5, 0x5a, 0x86, 0x54, 0xa0, 0xb8, 0x7c, 0xff, 0xe1, 0xca, 0xbd, 0xe6, 0x6a, + 0x2d, 0xab, 0x6a, 0x00, 0x42, 0x4e, 0x74, 0x6b, 0xaf, 0x43, 0x71, 0x53, 0x1c, 0x4f, 0x69, 0x2b, + 0x24, 0x2e, 0xae, 0x40, 0xd4, 0x02, 0x14, 0x72, 0x1a, 0x0a, 0x09, 0x3f, 0x26, 0x47, 0xaa, 0x01, + 0x33, 0x77, 0x99, 0x9f, 0x08, 0xe3, 0x63, 0x9e, 0x72, 0x72, 0x11, 0xa6, 0x36, 0x65, 0xb6, 0x89, + 0x96, 0x9b, 0x45, 0x84, 0x4a, 0x00, 0xe3, 0x86, 0xf9, 0x69, 0x16, 0xf2, 0xe8, 0x03, 0xfa, 0xae, + 0xfd, 0x78, 0x8c, 0xe6, 0x1e, 0xd2, 0x76, 0x63, 0x41, 0x58, 0x42, 0x5a, 0x46, 0x68, 0xc7, 0xd9, + 0xe1, 0xae, 0x32, 0x77, 0xb0, 0xab, 0xcc, 0x27, 0x5d, 0x65, 0x83, 0x07, 0x03, 0x9f, 0x1a, 0xd4, + 0xa7, 0x32, 0xd8, 0x86, 0xe3, 0x94, 0x1b, 0x2d, 0xa6, 0xdd, 0xe8, 0x82, 0x74, 0xa3, 0xa5, 0xc3, + 0x53, 0x7a, 0x74, 0xb1, 0xf3, 0x00, 0xcc, 0xd8, 0x62, 0xd2, 0xc7, 0x96, 0xd1, 0xc7, 0x96, 0x39, + 0x04, 0x9d, 0x6c, 0xd2, 0x03, 0x43, 0xd2, 0x03, 0xa7, 0x03, 0x7f, 0xe5, 0x38, 0x81, 0x7f, 0x6a, + 0x2c, 0x63, 0x5d, 0x83, 0x32, 0xee, 0x14, 0xda, 0xd8, 0xab, 0x50, 0x40, 0xd7, 0x1c, 0x98, 0xd8, + 0x6c, 0xdc, 0xc4, 0x84, 0x53, 0x97, 0x08, 0x43, 0x0d, 0xec, 0xbf, 0x32, 0x50, 0x0d, 0x53, 0x45, + 0x5c, 0x74, 0x15, 0x2a, 0xc2, 0xff, 0x73, 0x13, 0x0a, 0x56, 0xbe, 0xd4, 0xb7, 0x72, 0x80, 0x1f, + 0x8d, 0x34, 0xd8, 0x0a, 0x73, 0xce, 0x61, 0xdf, 0x6b, 0x7c, 0x4b, 0x91, 0x02, 0x70, 0xb4, 0xe7, + 0xe6, 0x10, 0xd4, 0xdb, 0xc1, 0x99, 0x9e, 0x06, 0x58, 0x7f, 0xf2, 0xa8, 0xa9, 0x2d, 0xad, 0x3e, + 0x68, 0xad, 0xd5, 0x5e, 0x20, 0x65, 0xc8, 0x8b, 0x9f, 0x0a, 0x3f, 0xee, 0x0f, 0x9a, 0x0f, 0x96, + 0x9b, 0x5a, 0x2d, 0x43, 0x6a, 0x30, 0xf5, 0xe1, 0xc3, 0xd6, 0x5a, 0x5b, 0x6b, 0xfe, 0xc5, 0x93, + 0xe6, 0xfa, 0xe3, 0x5a, 0x56, 0xfd, 0x67, 0x05, 0xce, 0xb6, 0xba, 0x8e, 0xed, 0x86, 0xb5, 0x5a, + 0x2a, 0xda, 0x1e, 0xb1, 0x92, 0x7d, 0x03, 0xf2, 0x2e, 0xf3, 0x64, 0x47, 0xe6, 0x60, 0x3b, 0x15, + 0x88, 0xea, 0x9f, 0x41, 0xed, 0x43, 0xdb, 0xb4, 0x46, 0x0d, 0xd2, 0x7f, 0x0e, 0xa7, 0x38, 0xfa, + 0x63, 0xbb, 0x87, 0x0e, 0xc0, 0xf2, 0x03, 0x9a, 0x4b, 0x50, 0xf5, 0x43, 0x60, 0x44, 0x38, 0x15, + 0x01, 0x5b, 0x86, 0xfa, 0x00, 0x4e, 0xdd, 0x33, 0xf5, 0xed, 0x49, 0x55, 0x0f, 0xbf, 0xcb, 0xc2, + 0x6c, 0x5f, 0xb2, 0x30, 0x62, 0x96, 0xc0, 0xd7, 0xb5, 0x77, 0x2d, 0x16, 0x73, 0x3d, 0x45, 0x1c, + 0xb7, 0x0c, 0x72, 0x23, 0x55, 0xff, 0x54, 0x16, 0xcf, 0xf6, 0x29, 0x72, 0xdd, 0x77, 0x4d, 0x6b, + 0x4b, 0xa8, 0x32, 0xca, 0xe6, 0x4f, 0x42, 0xde, 0xd3, 0x6d, 0x97, 0xa1, 0x63, 0xca, 0x6a, 0x62, + 0xc0, 0xfd, 0x8e, 0xd7, 0xdb, 0x10, 0x13, 0x79, 0x9c, 0x08, 0xc7, 0xdc, 0x13, 0x58, 0xbd, 0x6e, + 0x5b, 0x4c, 0xca, 0x5c, 0xcc, 0xea, 0x75, 0xd7, 0x03, 0xc2, 0xd0, 0x61, 0x15, 0x53, 0x0e, 0x2b, + 0xe5, 0x25, 0x4a, 0xc7, 0xf1, 0x12, 0xe5, 0xb1, 0xca, 0x83, 0x9b, 0x50, 0x61, 0x7b, 0x8e, 0xe9, + 0xca, 0xbe, 0x1b, 0x1c, 0x4e, 0x2c, 0xd0, 0x91, 0x98, 0x40, 0xce, 0xa5, 0xd6, 0x36, 0x7a, 0xb5, + 0xac, 0x86, 0xbf, 0x89, 0x0a, 0x55, 0xee, 0x0d, 0x23, 0x3d, 0x70, 0xaf, 0x55, 0xd5, 0x2a, 0x5d, + 0xba, 0xb7, 0x26, 0x55, 0xa1, 0xfe, 0x42, 0x81, 0x53, 0x7d, 0x7b, 0x8d, 0x2e, 0xe5, 0x3a, 0x14, + 0x5d, 0x1c, 0x05, 0xee, 0x24, 0x71, 0xbd, 0xd0, 0x9f, 0x4c, 0x06, 0xd8, 0x64, 0x19, 0xaa, 0xc2, + 0x02, 0x02, 0xf2, 0xcc, 0x28, 0xe4, 0x53, 0x48, 0xa3, 0xc9, 0x35, 0x52, 0x75, 0x42, 0xf6, 0xb0, + 0x3a, 0x21, 0xd7, 0x57, 0x27, 0x2c, 0xa0, 0x0d, 0xef, 0x8c, 0x9c, 0x26, 0xff, 0x1d, 0x9c, 0xb8, + 0x6f, 0x5a, 0xdb, 0x13, 0xba, 0xfa, 0x1a, 0xf7, 0xaa, 0xea, 0xc7, 0x0a, 0x34, 0xb8, 0xd6, 0x93, + 0x85, 0x53, 0x78, 0x8e, 0x0f, 0xa9, 0xba, 0xdf, 0x84, 0x7c, 0xc7, 0xec, 0x9a, 0xfe, 0x48, 0xbe, + 0x16, 0x31, 0xc9, 0x5b, 0x50, 0xdc, 0xb4, 0xdd, 0x5d, 0xea, 0x1a, 0x43, 0x13, 0xaf, 0x88, 0xc7, + 0x00, 0x35, 0x16, 0x20, 0x72, 0x89, 0x80, 0xf4, 0x1f, 0x0a, 0x10, 0xce, 0x7e, 0xca, 0xdb, 0x86, + 0x7c, 0x29, 0x23, 0xf3, 0x75, 0x84, 0x3c, 0x32, 0x62, 0x2a, 0x9b, 0x60, 0xca, 0x85, 0x59, 0xce, + 0x13, 0x1a, 0x80, 0x77, 0x50, 0x9d, 0x38, 0x24, 0xec, 0x45, 0xec, 0x67, 0x47, 0x65, 0x5f, 0xfd, + 0x3e, 0x3f, 0x4e, 0xc1, 0x47, 0x47, 0x75, 0xc5, 0x47, 0xd8, 0xbe, 0x50, 0x4d, 0xd9, 0x23, 0xa8, + 0x29, 0xb9, 0x77, 0x9f, 0x2b, 0x70, 0x85, 0xb3, 0xdc, 0x77, 0x24, 0xbd, 0x25, 0xd7, 0xee, 0x59, + 0xc6, 0x43, 0x71, 0x2e, 0xc7, 0x29, 0x15, 0xc9, 0x62, 0x52, 0xa2, 0x7e, 0x37, 0xff, 0xa4, 0x5f, + 0xa4, 0x78, 0xe0, 0xc8, 0x26, 0x03, 0xc7, 0x35, 0x28, 0x08, 0x57, 0x27, 0xcf, 0xd3, 0x40, 0x71, + 0xdf, 0x79, 0x4b, 0xde, 0xb6, 0x09, 0x54, 0xf5, 0xb7, 0x0a, 0xcc, 0x0f, 0x96, 0x6b, 0x4c, 0x61, + 0xce, 0x40, 0x39, 0x60, 0x2c, 0x08, 0x95, 0x25, 0xc9, 0x99, 0x77, 0x04, 0x1b, 0x19, 0xb6, 0x11, + 0x31, 0x29, 0xf3, 0xa3, 0x4b, 0xf9, 0x9b, 0x8c, 0x38, 0x79, 0x0f, 0xa8, 0xaf, 0x3f, 0x63, 0xc7, + 0x39, 0x79, 0xb7, 0xa1, 0x4a, 0x7b, 0xfe, 0x33, 0xdb, 0x35, 0x7d, 0xea, 0x9b, 0x3b, 0xa3, 0x5c, + 0x6c, 0x26, 0x09, 0x70, 0xd7, 0xe9, 0x06, 0xeb, 0x8c, 0x14, 0xdc, 0x05, 0x2a, 0x5e, 0x24, 0x99, + 0x56, 0xdb, 0x33, 0x3f, 0x61, 0x07, 0x6d, 0x6e, 0xc0, 0x6b, 0xb1, 0x6b, 0x5a, 0xeb, 0xe6, 0x27, + 0x0c, 0xe9, 0xe8, 0x9e, 0xa0, 0xcb, 0x8f, 0x42, 0x47, 0xf7, 0x90, 0x6e, 0x11, 0xf2, 0x1f, 0xf7, + 0x98, 0xbb, 0x2f, 0x9f, 0xb5, 0x1c, 0xc2, 0x23, 0xa2, 0xaa, 0x7b, 0x50, 0xe7, 0x2a, 0x1e, 0x78, + 0xed, 0x71, 0x04, 0x45, 0xbf, 0x0a, 0x35, 0x9d, 0xea, 0xcf, 0x18, 0x3e, 0x92, 0x49, 0x38, 0x9e, + 0x99, 0x10, 0x2e, 0x83, 0xd8, 0xff, 0x2b, 0x30, 0xc7, 0x3f, 0x3d, 0xf8, 0x72, 0xe3, 0x45, 0x28, + 0xca, 0x14, 0x4e, 0x1a, 0x6e, 0x41, 0x64, 0x70, 0xa9, 0x0b, 0x96, 0x4c, 0xdf, 0x05, 0xcb, 0xe4, + 0x8c, 0x56, 0xfd, 0x99, 0x02, 0x97, 0x39, 0x87, 0xf1, 0xcc, 0x75, 0x98, 0xf3, 0x18, 0x25, 0x97, + 0xfd, 0x5a, 0xb8, 0x8e, 0x5f, 0x2b, 0x70, 0x76, 0xa0, 0x50, 0x63, 0x49, 0xf2, 0xb5, 0xf6, 0x1b, + 0xbf, 0xca, 0xc0, 0xe9, 0xa4, 0x88, 0xa1, 0x70, 0x2b, 0x30, 0xad, 0x53, 0x9f, 0x6d, 0xd9, 0xee, + 0x7e, 0xdb, 0xf3, 0xa9, 0x1b, 0xd8, 0xf6, 0xc1, 0x5b, 0x51, 0x0d, 0x68, 0xd6, 0x39, 0x09, 0xf9, + 0x00, 0xa6, 0xc2, 0x45, 0x98, 0x65, 0x8c, 0xb4, 0x9b, 0x95, 0x80, 0xa2, 0x69, 0x19, 0xe4, 0x26, + 0x00, 0x7e, 0x3c, 0x7e, 0x39, 0x74, 0x30, 0x79, 0x19, 0xf1, 0x31, 0x1b, 0xbe, 0x0e, 0x25, 0x66, + 0x19, 0x82, 0x34, 0x37, 0x02, 0x69, 0x91, 0x59, 0x06, 0x12, 0x86, 0xdb, 0x52, 0x38, 0xc2, 0xb6, + 0x94, 0x12, 0x27, 0xe3, 0x7b, 0x32, 0x15, 0xe0, 0x59, 0x40, 0x32, 0x07, 0x19, 0x7a, 0x6e, 0xbf, + 0xda, 0x44, 0xe0, 0xdf, 0x14, 0xc8, 0x63, 0x18, 0xe1, 0xe7, 0xa9, 0xcb, 0x7f, 0xc4, 0x72, 0x15, + 0x1c, 0xb7, 0x0c, 0xf2, 0xd2, 0xa0, 0x28, 0x51, 0x9a, 0x44, 0x24, 0x20, 0x90, 0x0b, 0xa3, 0x40, + 0x5e, 0xc3, 0xdf, 0xea, 0x0d, 0x28, 0x23, 0x47, 0x58, 0x90, 0xbc, 0x06, 0x82, 0x0b, 0x36, 0xf0, + 0xe6, 0x04, 0xf1, 0xb4, 0x00, 0x83, 0x1f, 0xe1, 0xa9, 0xb8, 0xc3, 0xee, 0xbb, 0x24, 0xab, 0x43, + 0xd1, 0xeb, 0xa1, 0x3f, 0x0d, 0xca, 0x54, 0x39, 0x8c, 0xb7, 0x8e, 0xb2, 0xc9, 0xd6, 0x11, 0x91, + 0xed, 0x2b, 0xc9, 0x62, 0x7f, 0x87, 0x2a, 0x9f, 0xea, 0x50, 0xa5, 0x8a, 0xc9, 0xc2, 0x58, 0xc5, + 0xe4, 0xb9, 0x44, 0xbb, 0xa8, 0x88, 0x7a, 0x8e, 0x41, 0xd4, 0xbf, 0x87, 0x5a, 0x5c, 0x42, 0xd4, + 0xd1, 0x2d, 0xa8, 0x5a, 0xf1, 0x30, 0x25, 0x35, 0x95, 0x68, 0x68, 0xc6, 0x89, 0xb4, 0x24, 0xfa, + 0x38, 0xb1, 0xe9, 0x11, 0xd4, 0x1f, 0xb9, 0x76, 0xd7, 0x96, 0x9d, 0x88, 0x09, 0xdc, 0x3b, 0x3c, + 0x84, 0x17, 0x57, 0xd9, 0x24, 0x17, 0xfc, 0x08, 0x4e, 0x68, 0x8c, 0x1a, 0xc7, 0xef, 0x3f, 0xc4, + 0x4e, 0x6c, 0x36, 0x7e, 0x62, 0xd5, 0xbf, 0x81, 0xb9, 0xbe, 0x2f, 0x84, 0x4c, 0xdf, 0x1a, 0xd0, + 0x7c, 0x38, 0x1f, 0xdf, 0x89, 0x01, 0xcc, 0xc5, 0x5b, 0x0f, 0x1f, 0x42, 0x56, 0x73, 0xf4, 0x41, + 0x96, 0xeb, 0xd0, 0xfd, 0x8e, 0x4d, 0xc3, 0x0b, 0x16, 0x39, 0xe4, 0xaa, 0x78, 0xe6, 0xfb, 0x4e, + 0x9b, 0x73, 0x2f, 0x4d, 0x97, 0x8f, 0xef, 0xb1, 0x7d, 0xf5, 0x5d, 0x28, 0xae, 0x33, 0xcf, 0xe3, + 0xe2, 0x71, 0xfb, 0x46, 0x2b, 0x13, 0x8b, 0x96, 0xb4, 0x60, 0x18, 0xbd, 0xd4, 0xca, 0xc4, 0x5e, + 0x6a, 0xa9, 0xbf, 0xcc, 0x40, 0x35, 0xc1, 0xe5, 0x04, 0x15, 0x18, 0xb5, 0x20, 0x72, 0xb1, 0x16, + 0x44, 0xbc, 0xdf, 0x93, 0x4f, 0xf4, 0x7b, 0xc8, 0x65, 0x98, 0x71, 0x98, 0xdb, 0x35, 0x51, 0x94, + 0xb6, 0xcb, 0xa8, 0x21, 0x6f, 0x77, 0xa6, 0x23, 0x30, 0x57, 0x2b, 0xb7, 0xe4, 0x18, 0xe2, 0xae, + 0x6b, 0xfa, 0xa2, 0xd7, 0x9b, 0xd7, 0x62, 0x0b, 0xfc, 0x25, 0x07, 0x7f, 0x75, 0x57, 0x3e, 0xea, + 0x2e, 0xd4, 0x12, 0x9a, 0x5d, 0xd2, 0xb7, 0x27, 0xd9, 0x1d, 0x8b, 0xab, 0x3d, 0x97, 0xb0, 0xdb, + 0x26, 0xcc, 0xa6, 0x3f, 0xec, 0x91, 0x37, 0x20, 0x47, 0xf5, 0xed, 0xc0, 0x52, 0xcf, 0xc6, 0x2d, + 0x35, 0x8d, 0xac, 0x21, 0xa6, 0xda, 0x84, 0xe9, 0xa4, 0xe9, 0x93, 0x6b, 0x50, 0x14, 0x06, 0x1c, + 0x2c, 0x33, 0x37, 0x74, 0x19, 0x2d, 0xc0, 0x54, 0x3f, 0x4a, 0x71, 0x83, 0xae, 0xec, 0x28, 0x2b, + 0x0d, 0xbd, 0x31, 0xff, 0x2c, 0x07, 0x10, 0xa5, 0x3a, 0x7d, 0x47, 0x8a, 0x1b, 0xbe, 0xe9, 0x77, + 0xc2, 0x46, 0x18, 0x0e, 0xd2, 0x4d, 0x91, 0x6c, 0x7f, 0x53, 0xa4, 0x01, 0xa5, 0x20, 0x67, 0x41, + 0x05, 0x57, 0xb5, 0x70, 0x4c, 0xe6, 0x01, 0x3c, 0xdb, 0xf5, 0xdb, 0xb6, 0x6b, 0x30, 0x17, 0xcd, + 0xb8, 0xaa, 0x95, 0x39, 0xe4, 0x21, 0x07, 0x84, 0xe1, 0xae, 0x80, 0x13, 0xf8, 0x5b, 0xc4, 0x5d, + 0x59, 0xd4, 0x14, 0x11, 0x1e, 0xd6, 0x2d, 0x7d, 0x77, 0x79, 0xa5, 0xbe, 0xbb, 0x3c, 0x7c, 0xd5, + 0x4f, 0xad, 0x36, 0xbe, 0xf6, 0x41, 0x43, 0x2c, 0x71, 0x76, 0xac, 0x26, 0xbe, 0xb2, 0x9d, 0x07, + 0xe0, 0x29, 0x11, 0xd5, 0x31, 0x6a, 0x83, 0x60, 0x87, 0x59, 0xc6, 0x12, 0x02, 0xf8, 0x34, 0x5e, + 0xb8, 0x89, 0x6b, 0xee, 0x8a, 0x98, 0xe6, 0x10, 0x8d, 0x03, 0x12, 0x37, 0xa6, 0x53, 0x07, 0xdf, + 0x98, 0x56, 0xc7, 0x3a, 0x3e, 0xef, 0x26, 0xd2, 0xbc, 0xe9, 0xc3, 0xdb, 0x9f, 0x51, 0x92, 0xf7, + 0x76, 0x2c, 0xc9, 0x9b, 0x39, 0x94, 0x30, 0x4c, 0xf1, 0x1a, 0x50, 0x32, 0x7a, 0x2e, 0xc6, 0xbb, + 0x7a, 0x4d, 0xec, 0x59, 0x30, 0x26, 0x17, 0x61, 0x4a, 0x70, 0x23, 0xd5, 0x34, 0x2b, 0x94, 0x8c, + 0x30, 0xa1, 0x28, 0x75, 0x03, 0xa6, 0x23, 0x43, 0x42, 0x43, 0xbd, 0x01, 0x95, 0x28, 0xef, 0x0f, + 0x8c, 0xf5, 0x74, 0xdc, 0x58, 0x63, 0x75, 0x44, 0x1c, 0x75, 0xa8, 0xb5, 0x7e, 0xae, 0xc0, 0xc9, + 0x74, 0xed, 0xf1, 0xa7, 0x70, 0x27, 0xfb, 0x87, 0x0c, 0x9c, 0x7c, 0x82, 0xde, 0x4f, 0x5e, 0x9c, + 0x06, 0x91, 0x32, 0xde, 0x19, 0x50, 0xc6, 0xea, 0x0c, 0x7c, 0x80, 0xff, 0x6f, 0xe2, 0x74, 0xe8, + 0xbe, 0x78, 0x1a, 0x93, 0x19, 0x81, 0xba, 0x22, 0x29, 0xf0, 0xed, 0xcc, 0xcd, 0x44, 0x83, 0x72, + 0x94, 0x7c, 0x35, 0xd6, 0xbe, 0xbc, 0x1e, 0x6b, 0x8a, 0xe6, 0x46, 0x20, 0x0d, 0x5b, 0xa6, 0x37, + 0xa0, 0xd4, 0xb1, 0x45, 0xd2, 0x25, 0xab, 0xb6, 0x43, 0x04, 0x0e, 0xb0, 0x39, 0x25, 0xb7, 0xf8, + 0x4f, 0x6c, 0x8b, 0x8d, 0x74, 0x87, 0x11, 0x62, 0xab, 0x9f, 0x65, 0x80, 0x08, 0xed, 0x8f, 0x78, + 0x27, 0xce, 0x03, 0xc2, 0xc8, 0x4a, 0x15, 0x57, 0xa9, 0xb7, 0xfa, 0x5d, 0xe6, 0xe1, 0xbb, 0x11, + 0x73, 0xa8, 0x47, 0x56, 0x68, 0x72, 0x1b, 0xf3, 0xe3, 0x6d, 0x63, 0xd0, 0x85, 0x2e, 0x8c, 0xd6, + 0x85, 0x56, 0xbf, 0xc8, 0x41, 0x0e, 0x5b, 0xa1, 0xe9, 0x38, 0x12, 0x7f, 0x91, 0x96, 0x49, 0xbd, + 0x48, 0xbb, 0x98, 0xb2, 0xd4, 0x20, 0x9c, 0xc4, 0x6c, 0xf1, 0x90, 0x37, 0x47, 0x07, 0xb7, 0xe0, + 0x43, 0x7b, 0x92, 0x2d, 0xf8, 0xd0, 0x62, 0x1a, 0x31, 0x8b, 0x91, 0xdd, 0xae, 0x60, 0x9c, 0xf0, + 0xeb, 0xa5, 0x94, 0x5f, 0x3f, 0x0f, 0x95, 0xd8, 0x1b, 0x04, 0x0c, 0x28, 0x65, 0x0d, 0xa2, 0x27, + 0x08, 0x3c, 0xde, 0x08, 0x4d, 0xf1, 0x69, 0xf9, 0x26, 0x4d, 0x00, 0x5a, 0x06, 0xb9, 0x04, 0xd5, + 0x2d, 0xda, 0x65, 0x3a, 0x46, 0xa3, 0xe8, 0x61, 0xda, 0x54, 0x04, 0x14, 0xb9, 0xbb, 0xe7, 0x33, + 0x8a, 0xff, 0x86, 0x36, 0x25, 0xab, 0x30, 0x3e, 0x6e, 0x61, 0xab, 0xc1, 0xb6, 0x3a, 0xa6, 0x25, + 0x02, 0x4a, 0x49, 0x93, 0xa3, 0xd4, 0x0b, 0x80, 0xe9, 0xf4, 0x0b, 0x80, 0x54, 0x30, 0x9a, 0x39, + 0x4e, 0x2e, 0x57, 0x1b, 0xab, 0x7d, 0x77, 0x1d, 0xea, 0x91, 0xba, 0xc4, 0x0b, 0xe1, 0x36, 0x17, + 0x96, 0xcb, 0x36, 0x8b, 0xb2, 0x9d, 0xda, 0xec, 0x7f, 0x40, 0x2c, 0x94, 0x40, 0x1d, 0x47, 0x68, + 0x91, 0x08, 0x25, 0xe0, 0xb8, 0x65, 0xa8, 0xff, 0x93, 0x81, 0x6a, 0x78, 0x7f, 0x10, 0x34, 0xfa, + 0x31, 0xa3, 0x4b, 0x3c, 0x21, 0xb8, 0x94, 0xee, 0xc1, 0x87, 0xf8, 0xd1, 0x48, 0x83, 0x5e, 0x78, + 0x11, 0x31, 0xb4, 0xd1, 0xff, 0x6d, 0x05, 0xca, 0x21, 0x05, 0xb9, 0x0c, 0x79, 0xfc, 0x8c, 0x74, + 0xc9, 0x03, 0x1e, 0x2a, 0x88, 0xf9, 0xaf, 0xa6, 0xd7, 0x7f, 0x15, 0xf2, 0xe2, 0xd5, 0xc2, 0x2b, + 0x90, 0x8f, 0xbf, 0x7a, 0xe8, 0x7f, 0x90, 0x20, 0xa6, 0xd5, 0x7f, 0xc9, 0xc0, 0x3c, 0x26, 0xfc, + 0xc7, 0x7c, 0x08, 0x47, 0xfe, 0x0a, 0x0a, 0x22, 0x8c, 0x4a, 0x79, 0x6f, 0xc7, 0xbf, 0x78, 0xe0, + 0x17, 0xfa, 0x63, 0x2c, 0xa2, 0x6b, 0x72, 0xbd, 0xc6, 0x26, 0x9c, 0x1e, 0x8c, 0x11, 0x75, 0xc0, + 0x95, 0x61, 0x1d, 0xf0, 0x4c, 0xaa, 0x03, 0x1e, 0x3f, 0xda, 0xd9, 0xe4, 0xd1, 0x56, 0xff, 0x29, + 0x03, 0x04, 0xd7, 0x3d, 0x6e, 0x5d, 0x17, 0x96, 0x6f, 0xd9, 0x21, 0xe5, 0x5b, 0x2e, 0x59, 0x90, + 0xac, 0xf6, 0x97, 0x6f, 0x23, 0xdc, 0xde, 0xa7, 0x6b, 0xbb, 0x3b, 0x03, 0x6a, 0xbb, 0x11, 0x2e, + 0xec, 0xd2, 0x85, 0x9f, 0xfa, 0x14, 0x1a, 0xfd, 0x5a, 0xf0, 0xa2, 0xa4, 0x24, 0x55, 0x80, 0x9c, + 0xeb, 0xdb, 0xe7, 0x21, 0xf5, 0xcc, 0x3f, 0x66, 0xe0, 0x2c, 0xce, 0xa7, 0x93, 0xb8, 0xb1, 0xee, + 0x8f, 0x9f, 0xa6, 0xcc, 0xec, 0x56, 0xdf, 0xe7, 0x87, 0x2c, 0xbf, 0x90, 0x86, 0x27, 0x8d, 0x8c, + 0xc1, 0xa9, 0x81, 0x08, 0x93, 0xb5, 0xb1, 0xe5, 0xf7, 0x61, 0x4e, 0xb7, 0xbb, 0x0b, 0xcf, 0x98, + 0x6b, 0x9b, 0x7a, 0x87, 0x6e, 0x78, 0x31, 0xf6, 0x97, 0xcb, 0x6b, 0xf8, 0x7b, 0xc9, 0x31, 0x1f, + 0x29, 0x7f, 0x9d, 0xa5, 0x8e, 0xf9, 0xcd, 0x4c, 0x6e, 0xed, 0xde, 0xa3, 0xe5, 0xef, 0x64, 0x0a, + 0x62, 0x66, 0xa3, 0x80, 0x3b, 0x78, 0xed, 0x8f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xe9, 0xa3, + 0x90, 0x9c, 0x3d, 0x00, 0x00, } diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index ade16d59f..93c939720 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -768,6 +768,14 @@ message PromoteGroupUsersRequest { repeated string user_ids = 2; } +// Demote a set of users in a group to the next role down. +message DemoteGroupUsersRequest { + // The group ID to demote in. + string group_id = 1; + // The users to demote. + repeated string user_ids = 2; +} + // Storage objects to get. message ReadStorageObjectId { // The collection which stores the object. diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index b7f059109..80184594f 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -207,58 +207,21 @@ type Logger interface { Log a message with optional arguments at ERROR level. Arguments are handled in the manner of fmt.Printf. */ Error(format string, v ...interface{}) - - // *log.Logger compatibility functions below here. - - /* - Log a message at info level. Arguments are handled in the manner of fmt.Print. Provided for compatibility with log.Logger. - */ - Print(v ...interface{}) - /* - Log a message at info level. Arguments are handled in the manner of fmt.Println. Provided for compatibility with log.Logger. - */ - Println(v ...interface{}) - /* - Log a message at info level. Arguments are handled in the manner of fmt.Printf. Provided for compatibility with log.Logger. - */ - Printf(format string, v ...interface{}) - /* - Log a message at fatal level and stop the server with a non-0 exit code. Arguments are handled in the manner of fmt.Print. - - Provided for compatibility with log.Logger. - */ - Fatal(v ...interface{}) /* - Log a message at fatal level and stop the server with a non-0 exit code. Arguments are handled in the manner of fmt.Println. - - Provided for compatibility with log.Logger. + Return a logger with the specified field set so that they are included in subsequent logging calls. */ - Fatalln(v ...interface{}) + WithField(key string, v interface{}) Logger /* - Log a message at fatal level and stop the server with a non-0 exit code. Arguments are handled in the manner of fmt.Printf. - - Provided for compatibility with log.Logger. + Return a logger with the specified fields set so that they are included in subsequent logging calls. */ - Fatalf(format string, v ...interface{}) + WithFields(fields map[string]interface{}) Logger /* - Log a message at fatal level and panic the server. Arguments are handled in the manner of fmt.Print. - - Provided for compatibility with log.Logger. + Returns the fields set in this logger. */ - Panic(v ...interface{}) - /* - Log a message at fatal level and panic the server. Arguments are handled in the manner of fmt.Println. + Fields() map[string]interface{} +} - Provided for compatibility with log.Logger. - */ - Panicln(v ...interface{}) - /* - Log a message at fatal level and panic the server. Arguments are handled in the manner of fmt.Printf. - Provided for compatibility with log.Logger. - */ - Panicf(format string, v ...interface{}) -} /* Initializer is used to register various callback functions with the server. @@ -467,6 +430,12 @@ type Initializer interface { // RegisterAfterPromoteGroupUsers can be used to perform additional logic after user is promoted. RegisterAfterPromoteGroupUsers(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.PromoteGroupUsersRequest) error) error + // RegisterBeforeDemoteGroupUsers can be used to perform additional logic before user is demoted. + RegisterBeforeDemoteGroupUsers(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.DemoteGroupUsersRequest) (*api.DemoteGroupUsersRequest, error)) error + + // RegisterAfterDemoteGroupUsers can be used to perform additional logic after user is demoted. + RegisterAfterDemoteGroupUsers(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.DemoteGroupUsersRequest) error) error + // RegisterBeforeListGroupUsers can be used to perform additional logic before users in a group is listed. RegisterBeforeListGroupUsers(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ListGroupUsersRequest) (*api.ListGroupUsersRequest, error)) error diff --git a/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go b/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go new file mode 100644 index 000000000..a4ea7ec36 --- /dev/null +++ b/vendor/go.uber.org/zap/zaptest/observer/logged_entry.go @@ -0,0 +1,39 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package observer + +import "go.uber.org/zap/zapcore" + +// An LoggedEntry is an encoding-agnostic representation of a log message. +// Field availability is context dependant. +type LoggedEntry struct { + zapcore.Entry + Context []zapcore.Field +} + +// ContextMap returns a map for all fields in Context. +func (e LoggedEntry) ContextMap() map[string]interface{} { + encoder := zapcore.NewMapObjectEncoder() + for _, f := range e.Context { + f.AddTo(encoder) + } + return encoder.Fields +} diff --git a/vendor/go.uber.org/zap/zaptest/observer/observer.go b/vendor/go.uber.org/zap/zaptest/observer/observer.go new file mode 100644 index 000000000..78f5be45d --- /dev/null +++ b/vendor/go.uber.org/zap/zaptest/observer/observer.go @@ -0,0 +1,167 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package observer provides a zapcore.Core that keeps an in-memory, +// encoding-agnostic repesentation of log entries. It's useful for +// applications that want to unit test their log output without tying their +// tests to a particular output encoding. +package observer // import "go.uber.org/zap/zaptest/observer" + +import ( + "strings" + "sync" + "time" + + "go.uber.org/zap/zapcore" +) + +// ObservedLogs is a concurrency-safe, ordered collection of observed logs. +type ObservedLogs struct { + mu sync.RWMutex + logs []LoggedEntry +} + +// Len returns the number of items in the collection. +func (o *ObservedLogs) Len() int { + o.mu.RLock() + n := len(o.logs) + o.mu.RUnlock() + return n +} + +// All returns a copy of all the observed logs. +func (o *ObservedLogs) All() []LoggedEntry { + o.mu.RLock() + ret := make([]LoggedEntry, len(o.logs)) + for i := range o.logs { + ret[i] = o.logs[i] + } + o.mu.RUnlock() + return ret +} + +// TakeAll returns a copy of all the observed logs, and truncates the observed +// slice. +func (o *ObservedLogs) TakeAll() []LoggedEntry { + o.mu.Lock() + ret := o.logs + o.logs = nil + o.mu.Unlock() + return ret +} + +// AllUntimed returns a copy of all the observed logs, but overwrites the +// observed timestamps with time.Time's zero value. This is useful when making +// assertions in tests. +func (o *ObservedLogs) AllUntimed() []LoggedEntry { + ret := o.All() + for i := range ret { + ret[i].Time = time.Time{} + } + return ret +} + +// FilterMessage filters entries to those that have the specified message. +func (o *ObservedLogs) FilterMessage(msg string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return e.Message == msg + }) +} + +// FilterMessageSnippet filters entries to those that have a message containing the specified snippet. +func (o *ObservedLogs) FilterMessageSnippet(snippet string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + return strings.Contains(e.Message, snippet) + }) +} + +// FilterField filters entries to those that have the specified field. +func (o *ObservedLogs) FilterField(field zapcore.Field) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + for _, ctxField := range e.Context { + if ctxField.Equals(field) { + return true + } + } + return false + }) +} + +func (o *ObservedLogs) filter(match func(LoggedEntry) bool) *ObservedLogs { + o.mu.RLock() + defer o.mu.RUnlock() + + var filtered []LoggedEntry + for _, entry := range o.logs { + if match(entry) { + filtered = append(filtered, entry) + } + } + return &ObservedLogs{logs: filtered} +} + +func (o *ObservedLogs) add(log LoggedEntry) { + o.mu.Lock() + o.logs = append(o.logs, log) + o.mu.Unlock() +} + +// New creates a new Core that buffers logs in memory (without any encoding). +// It's particularly useful in tests. +func New(enab zapcore.LevelEnabler) (zapcore.Core, *ObservedLogs) { + ol := &ObservedLogs{} + return &contextObserver{ + LevelEnabler: enab, + logs: ol, + }, ol +} + +type contextObserver struct { + zapcore.LevelEnabler + logs *ObservedLogs + context []zapcore.Field +} + +func (co *contextObserver) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if co.Enabled(ent.Level) { + return ce.AddCore(ent, co) + } + return ce +} + +func (co *contextObserver) With(fields []zapcore.Field) zapcore.Core { + return &contextObserver{ + LevelEnabler: co.LevelEnabler, + logs: co.logs, + context: append(co.context[:len(co.context):len(co.context)], fields...), + } +} + +func (co *contextObserver) Write(ent zapcore.Entry, fields []zapcore.Field) error { + all := make([]zapcore.Field, 0, len(fields)+len(co.context)) + all = append(all, co.context...) + all = append(all, fields...) + co.logs.add(LoggedEntry{ent, all}) + return nil +} + +func (co *contextObserver) Sync() error { + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index e27d4d0bc..7e92bd513 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -95,7 +95,7 @@ github.com/grpc-ecosystem/grpc-gateway/internal github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options github.com/grpc-ecosystem/grpc-gateway/runtime github.com/grpc-ecosystem/grpc-gateway/utilities -# github.com/heroiclabs/nakama-common v1.6.1 +# github.com/heroiclabs/nakama-common v1.7.1 github.com/heroiclabs/nakama-common/api github.com/heroiclabs/nakama-common/rtapi github.com/heroiclabs/nakama-common/runtime @@ -161,6 +161,7 @@ go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/zapcore +go.uber.org/zap/zaptest/observer # golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish -- GitLab