diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index aee6ac75c752d4730ee3300309ff0a5e7fcb2ea5..42e1786ca9b24350fe863cf60dbdc1424f9b9122 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 a349ea77bc8739cc0f8c09e9bb9c0fc6cbc5310d..9428198e70f2ae03b7e2daa4467cc308c4b1b1fe 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 296414e8f1a9ae9422640cc3740a698065476763..dade8b2892ae24bc41a26180ce0ba41567385888 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 4519ad45ebd7b86fb79795758e616c7f0a64e6bb..ddd0e1c5eca0c096817eb56698587c79233ad7ff 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 f04c0d9016ad42fc14a54435529b6888b5b9060a..c78a869511cf722781d191507e5f4d00e09b855f 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 b94471877cccb12a0b20a068b9e013521bef166b..a203e27e24220ed5b96c20a20d931c748f9513be 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 9924a3b2c63a8fb347886b07411f6ba260ad8f18..998feb54c7716b1008e06900242bd10050764512 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 dc6314ddb0ebcce08bd0d1486091da1ab8b93a17..8133875c81fa0a61fe0c5913b7a10354d0a50ce0 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 5e1f8dd19bfba1b67ab1424195d03ed96993bf29..8ffaeea09cd7dd32bc2b4042761ed0576a578356 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 8eddaea6ad35bb324025ce479fb6d03fe195c77b..9aafeb8872e243312dceee2adea5afe9127560f9 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 9d229114384615e0eb15ef8bb94f1fb3cb43d889..9cb96484c6f5fd6980595377751a5a1e6aca53e8 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 ce7a9a4377083c0646803c8f2a492bbfd348de24..e0ba70478ddf7792bc76f7343ed23724b1568307 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 aa4b13c0964192685b59fed6599a1b618703eff7..593348b04e094845af65c22adc240892bc28d39a 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 84170647ea0fc1ce4355328a69c03dc5564317e9..3b8fcd07d48e68b32a3feac7bbbd108a8527ecfb 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 0000000000000000000000000000000000000000..ee47d6f39319b39a81588d2375afe6cf05991e1c --- /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 31520566229e0956e6adb6f8d2eb20dea34c7fe2..5e0e192464b5ebf45a11f987fd3e3863b006c48c 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 987cbbeee1c970f31e2b9726ef3eafa37fa60ff8..ae1553e8ef12b9e1c4bcf2302a6e5e7a879abfad 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 ade16d59fc99c7d4a8edf692d50ac5769db98f23..93c93972000cd4107f724fa7ac87be75b5d02161 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 b7f059109db2aeb23adc568718630b923d7ad8e0..80184594fc1d14375f357a5f875bbeaafac8798d 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 0000000000000000000000000000000000000000..a4ea7ec36c1e4162f9a56e17183d78be218c4147 --- /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 0000000000000000000000000000000000000000..78f5be45d47861c447df293d5a6efa4c59e44174 --- /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 e27d4d0bce5392d0dfd91591dfd085c04492494e..7e92bd513dcd4c5d80089481f0a5eb2e0246aa4e 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