diff --git a/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery.proto b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery.proto
new file mode 100644
index 0000000..2203614
--- /dev/null
+++ b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery.proto
@@ -0,0 +1,33 @@
+syntax = "proto3";
+
+package UltraCombos.Frozen.RoyalGallery;
+
+service Resource {
+ rpc GetPage (Device) returns (Page) {}
+ rpc SendData (DataRequest) returns (DataReply) {}
+}
+
+message Empty {}
+
+message Device {
+ int32 id = 1;
+}
+
+message Page {
+ string id = 1;
+ string serial = 2;
+ string message = 3;
+}
+
+message DataRequest {
+ string id = 1;
+ string serial = 2;
+ string message = 3;
+ bytes content = 4;
+ bytes signature = 5;
+ bytes thumbnail = 6;
+}
+
+message DataReply {
+ string result = 1;
+}
\ No newline at end of file
diff --git a/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/Ultracombos.Frozen.RoyalGalleryGrpc.cs b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/Ultracombos.Frozen.RoyalGalleryGrpc.cs
new file mode 100644
index 0000000..dedbd0c
--- /dev/null
+++ b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/Ultracombos.Frozen.RoyalGalleryGrpc.cs
@@ -0,0 +1,128 @@
+//
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: Ultracombos.Frozen.RoyalGallery.proto
+//
+#pragma warning disable 0414, 1591
+#region Designer generated code
+
+using grpc = global::Grpc.Core;
+
+namespace UltraCombos.Frozen.RoyalGallery {
+ public static partial class Resource
+ {
+ static readonly string __ServiceName = "UltraCombos.Frozen.RoyalGallery.Resource";
+
+ static readonly grpc::Marshaller __Marshaller_UltraCombos_Frozen_RoyalGallery_Device = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::UltraCombos.Frozen.RoyalGallery.Device.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_UltraCombos_Frozen_RoyalGallery_Page = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::UltraCombos.Frozen.RoyalGallery.Page.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_UltraCombos_Frozen_RoyalGallery_DataRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::UltraCombos.Frozen.RoyalGallery.DataRequest.Parser.ParseFrom);
+ static readonly grpc::Marshaller __Marshaller_UltraCombos_Frozen_RoyalGallery_DataReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::UltraCombos.Frozen.RoyalGallery.DataReply.Parser.ParseFrom);
+
+ static readonly grpc::Method __Method_GetPage = new grpc::Method(
+ grpc::MethodType.Unary,
+ __ServiceName,
+ "GetPage",
+ __Marshaller_UltraCombos_Frozen_RoyalGallery_Device,
+ __Marshaller_UltraCombos_Frozen_RoyalGallery_Page);
+
+ static readonly grpc::Method __Method_SendData = new grpc::Method(
+ grpc::MethodType.Unary,
+ __ServiceName,
+ "SendData",
+ __Marshaller_UltraCombos_Frozen_RoyalGallery_DataRequest,
+ __Marshaller_UltraCombos_Frozen_RoyalGallery_DataReply);
+
+ /// Service descriptor
+ public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+ {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.Services[0]; }
+ }
+
+ /// Base class for server-side implementations of Resource
+ public abstract partial class ResourceBase
+ {
+ public virtual global::System.Threading.Tasks.Task GetPage(global::UltraCombos.Frozen.RoyalGallery.Device request, grpc::ServerCallContext context)
+ {
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
+ }
+
+ public virtual global::System.Threading.Tasks.Task SendData(global::UltraCombos.Frozen.RoyalGallery.DataRequest request, grpc::ServerCallContext context)
+ {
+ throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
+ }
+
+ }
+
+ /// Client for Resource
+ public partial class ResourceClient : grpc::ClientBase
+ {
+ /// Creates a new client for Resource
+ /// The channel to use to make remote calls.
+ public ResourceClient(grpc::Channel channel) : base(channel)
+ {
+ }
+ /// Creates a new client for Resource that uses a custom CallInvoker.
+ /// The callInvoker to use to make remote calls.
+ public ResourceClient(grpc::CallInvoker callInvoker) : base(callInvoker)
+ {
+ }
+ /// Protected parameterless constructor to allow creation of test doubles.
+ protected ResourceClient() : base()
+ {
+ }
+ /// Protected constructor to allow creation of configured clients.
+ /// The client configuration.
+ protected ResourceClient(ClientBaseConfiguration configuration) : base(configuration)
+ {
+ }
+
+ public virtual global::UltraCombos.Frozen.RoyalGallery.Page GetPage(global::UltraCombos.Frozen.RoyalGallery.Device request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ {
+ return GetPage(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ }
+ public virtual global::UltraCombos.Frozen.RoyalGallery.Page GetPage(global::UltraCombos.Frozen.RoyalGallery.Device request, grpc::CallOptions options)
+ {
+ return CallInvoker.BlockingUnaryCall(__Method_GetPage, null, options, request);
+ }
+ public virtual grpc::AsyncUnaryCall GetPageAsync(global::UltraCombos.Frozen.RoyalGallery.Device request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ {
+ return GetPageAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ }
+ public virtual grpc::AsyncUnaryCall GetPageAsync(global::UltraCombos.Frozen.RoyalGallery.Device request, grpc::CallOptions options)
+ {
+ return CallInvoker.AsyncUnaryCall(__Method_GetPage, null, options, request);
+ }
+ public virtual global::UltraCombos.Frozen.RoyalGallery.DataReply SendData(global::UltraCombos.Frozen.RoyalGallery.DataRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ {
+ return SendData(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ }
+ public virtual global::UltraCombos.Frozen.RoyalGallery.DataReply SendData(global::UltraCombos.Frozen.RoyalGallery.DataRequest request, grpc::CallOptions options)
+ {
+ return CallInvoker.BlockingUnaryCall(__Method_SendData, null, options, request);
+ }
+ public virtual grpc::AsyncUnaryCall SendDataAsync(global::UltraCombos.Frozen.RoyalGallery.DataRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+ {
+ return SendDataAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+ }
+ public virtual grpc::AsyncUnaryCall SendDataAsync(global::UltraCombos.Frozen.RoyalGallery.DataRequest request, grpc::CallOptions options)
+ {
+ return CallInvoker.AsyncUnaryCall(__Method_SendData, null, options, request);
+ }
+ /// Creates a new instance of client from given ClientBaseConfiguration.
+ protected override ResourceClient NewInstance(ClientBaseConfiguration configuration)
+ {
+ return new ResourceClient(configuration);
+ }
+ }
+
+ /// Creates service definition that can be registered with a server
+ /// An object implementing the server-side handling logic.
+ public static grpc::ServerServiceDefinition BindService(ResourceBase serviceImpl)
+ {
+ return grpc::ServerServiceDefinition.CreateBuilder()
+ .AddMethod(__Method_GetPage, serviceImpl.GetPage)
+ .AddMethod(__Method_SendData, serviceImpl.SendData).Build();
+ }
+
+ }
+}
+#endregion
diff --git a/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/UltracombosFrozenRoyalGallery.cs b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/UltracombosFrozenRoyalGallery.cs
new file mode 100644
index 0000000..dc7f962
--- /dev/null
+++ b/_Utils/Grpc/Ultracombos.Frozen.RoyalGallery/csharp/UltracombosFrozenRoyalGallery.cs
@@ -0,0 +1,870 @@
+//
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: Ultracombos.Frozen.RoyalGallery.proto
+//
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace UltraCombos.Frozen.RoyalGallery {
+
+ /// Holder for reflection information generated from Ultracombos.Frozen.RoyalGallery.proto
+ public static partial class UltracombosFrozenRoyalGalleryReflection {
+
+ #region Descriptor
+ /// File descriptor for Ultracombos.Frozen.RoyalGallery.proto
+ public static pbr::FileDescriptor Descriptor {
+ get { return descriptor; }
+ }
+ private static pbr::FileDescriptor descriptor;
+
+ static UltracombosFrozenRoyalGalleryReflection() {
+ byte[] descriptorData = global::System.Convert.FromBase64String(
+ string.Concat(
+ "CiVVbHRyYWNvbWJvcy5Gcm96ZW4uUm95YWxHYWxsZXJ5LnByb3RvEh9VbHRy",
+ "YUNvbWJvcy5Gcm96ZW4uUm95YWxHYWxsZXJ5IgcKBUVtcHR5IhQKBkRldmlj",
+ "ZRIKCgJpZBgBIAEoBSIzCgRQYWdlEgoKAmlkGAEgASgJEg4KBnNlcmlhbBgC",
+ "IAEoCRIPCgdtZXNzYWdlGAMgASgJInEKC0RhdGFSZXF1ZXN0EgoKAmlkGAEg",
+ "ASgJEg4KBnNlcmlhbBgCIAEoCRIPCgdtZXNzYWdlGAMgASgJEg8KB2NvbnRl",
+ "bnQYBCABKAwSEQoJc2lnbmF0dXJlGAUgASgMEhEKCXRodW1ibmFpbBgGIAEo",
+ "DCIbCglEYXRhUmVwbHkSDgoGcmVzdWx0GAEgASgJMs8BCghSZXNvdXJjZRJb",
+ "CgdHZXRQYWdlEicuVWx0cmFDb21ib3MuRnJvemVuLlJveWFsR2FsbGVyeS5E",
+ "ZXZpY2UaJS5VbHRyYUNvbWJvcy5Gcm96ZW4uUm95YWxHYWxsZXJ5LlBhZ2Ui",
+ "ABJmCghTZW5kRGF0YRIsLlVsdHJhQ29tYm9zLkZyb3plbi5Sb3lhbEdhbGxl",
+ "cnkuRGF0YVJlcXVlc3QaKi5VbHRyYUNvbWJvcy5Gcm96ZW4uUm95YWxHYWxs",
+ "ZXJ5LkRhdGFSZXBseSIAYgZwcm90bzM="));
+ descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+ new pbr::FileDescriptor[] { },
+ new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+ new pbr::GeneratedClrTypeInfo(typeof(global::UltraCombos.Frozen.RoyalGallery.Empty), global::UltraCombos.Frozen.RoyalGallery.Empty.Parser, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::UltraCombos.Frozen.RoyalGallery.Device), global::UltraCombos.Frozen.RoyalGallery.Device.Parser, new[]{ "Id" }, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::UltraCombos.Frozen.RoyalGallery.Page), global::UltraCombos.Frozen.RoyalGallery.Page.Parser, new[]{ "Id", "Serial", "Message" }, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::UltraCombos.Frozen.RoyalGallery.DataRequest), global::UltraCombos.Frozen.RoyalGallery.DataRequest.Parser, new[]{ "Id", "Serial", "Message", "Content", "Signature", "Thumbnail" }, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::UltraCombos.Frozen.RoyalGallery.DataReply), global::UltraCombos.Frozen.RoyalGallery.DataReply.Parser, new[]{ "Result" }, null, null, null)
+ }));
+ }
+ #endregion
+
+ }
+ #region Messages
+ public sealed partial class Empty : pb::IMessage {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Empty());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.MessageTypes[0]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Empty() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Empty(Empty other) : this() {
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Empty Clone() {
+ return new Empty(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Empty);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Empty other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Empty other) {
+ if (other == null) {
+ return;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ }
+ }
+ }
+
+ }
+
+ public sealed partial class Device : pb::IMessage {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Device());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.MessageTypes[1]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Device() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Device(Device other) : this() {
+ id_ = other.id_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Device Clone() {
+ return new Device(this);
+ }
+
+ /// Field number for the "id" field.
+ public const int IdFieldNumber = 1;
+ private int id_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int Id {
+ get { return id_; }
+ set {
+ id_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Device);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Device other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Id != other.Id) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Id != 0) hash ^= Id.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (Id != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Id);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (Id != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Id);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Device other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Id != 0) {
+ Id = other.Id;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ Id = input.ReadInt32();
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ public sealed partial class Page : pb::IMessage {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Page());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.MessageTypes[2]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Page() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Page(Page other) : this() {
+ id_ = other.id_;
+ serial_ = other.serial_;
+ message_ = other.message_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Page Clone() {
+ return new Page(this);
+ }
+
+ /// Field number for the "id" field.
+ public const int IdFieldNumber = 1;
+ private string id_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Id {
+ get { return id_; }
+ set {
+ id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "serial" field.
+ public const int SerialFieldNumber = 2;
+ private string serial_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Serial {
+ get { return serial_; }
+ set {
+ serial_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "message" field.
+ public const int MessageFieldNumber = 3;
+ private string message_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Message {
+ get { return message_; }
+ set {
+ message_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Page);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Page other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Id != other.Id) return false;
+ if (Serial != other.Serial) return false;
+ if (Message != other.Message) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Id.Length != 0) hash ^= Id.GetHashCode();
+ if (Serial.Length != 0) hash ^= Serial.GetHashCode();
+ if (Message.Length != 0) hash ^= Message.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (Id.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(Id);
+ }
+ if (Serial.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(Serial);
+ }
+ if (Message.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(Message);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (Id.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+ }
+ if (Serial.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Serial);
+ }
+ if (Message.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Message);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Page other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Id.Length != 0) {
+ Id = other.Id;
+ }
+ if (other.Serial.Length != 0) {
+ Serial = other.Serial;
+ }
+ if (other.Message.Length != 0) {
+ Message = other.Message;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Id = input.ReadString();
+ break;
+ }
+ case 18: {
+ Serial = input.ReadString();
+ break;
+ }
+ case 26: {
+ Message = input.ReadString();
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ public sealed partial class DataRequest : pb::IMessage {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DataRequest());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.MessageTypes[3]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataRequest() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataRequest(DataRequest other) : this() {
+ id_ = other.id_;
+ serial_ = other.serial_;
+ message_ = other.message_;
+ content_ = other.content_;
+ signature_ = other.signature_;
+ thumbnail_ = other.thumbnail_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataRequest Clone() {
+ return new DataRequest(this);
+ }
+
+ /// Field number for the "id" field.
+ public const int IdFieldNumber = 1;
+ private string id_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Id {
+ get { return id_; }
+ set {
+ id_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "serial" field.
+ public const int SerialFieldNumber = 2;
+ private string serial_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Serial {
+ get { return serial_; }
+ set {
+ serial_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "message" field.
+ public const int MessageFieldNumber = 3;
+ private string message_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Message {
+ get { return message_; }
+ set {
+ message_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "content" field.
+ public const int ContentFieldNumber = 4;
+ private pb::ByteString content_ = pb::ByteString.Empty;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public pb::ByteString Content {
+ get { return content_; }
+ set {
+ content_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "signature" field.
+ public const int SignatureFieldNumber = 5;
+ private pb::ByteString signature_ = pb::ByteString.Empty;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public pb::ByteString Signature {
+ get { return signature_; }
+ set {
+ signature_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "thumbnail" field.
+ public const int ThumbnailFieldNumber = 6;
+ private pb::ByteString thumbnail_ = pb::ByteString.Empty;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public pb::ByteString Thumbnail {
+ get { return thumbnail_; }
+ set {
+ thumbnail_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as DataRequest);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(DataRequest other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Id != other.Id) return false;
+ if (Serial != other.Serial) return false;
+ if (Message != other.Message) return false;
+ if (Content != other.Content) return false;
+ if (Signature != other.Signature) return false;
+ if (Thumbnail != other.Thumbnail) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Id.Length != 0) hash ^= Id.GetHashCode();
+ if (Serial.Length != 0) hash ^= Serial.GetHashCode();
+ if (Message.Length != 0) hash ^= Message.GetHashCode();
+ if (Content.Length != 0) hash ^= Content.GetHashCode();
+ if (Signature.Length != 0) hash ^= Signature.GetHashCode();
+ if (Thumbnail.Length != 0) hash ^= Thumbnail.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (Id.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(Id);
+ }
+ if (Serial.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(Serial);
+ }
+ if (Message.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(Message);
+ }
+ if (Content.Length != 0) {
+ output.WriteRawTag(34);
+ output.WriteBytes(Content);
+ }
+ if (Signature.Length != 0) {
+ output.WriteRawTag(42);
+ output.WriteBytes(Signature);
+ }
+ if (Thumbnail.Length != 0) {
+ output.WriteRawTag(50);
+ output.WriteBytes(Thumbnail);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (Id.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Id);
+ }
+ if (Serial.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Serial);
+ }
+ if (Message.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Message);
+ }
+ if (Content.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeBytesSize(Content);
+ }
+ if (Signature.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeBytesSize(Signature);
+ }
+ if (Thumbnail.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeBytesSize(Thumbnail);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(DataRequest other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Id.Length != 0) {
+ Id = other.Id;
+ }
+ if (other.Serial.Length != 0) {
+ Serial = other.Serial;
+ }
+ if (other.Message.Length != 0) {
+ Message = other.Message;
+ }
+ if (other.Content.Length != 0) {
+ Content = other.Content;
+ }
+ if (other.Signature.Length != 0) {
+ Signature = other.Signature;
+ }
+ if (other.Thumbnail.Length != 0) {
+ Thumbnail = other.Thumbnail;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Id = input.ReadString();
+ break;
+ }
+ case 18: {
+ Serial = input.ReadString();
+ break;
+ }
+ case 26: {
+ Message = input.ReadString();
+ break;
+ }
+ case 34: {
+ Content = input.ReadBytes();
+ break;
+ }
+ case 42: {
+ Signature = input.ReadBytes();
+ break;
+ }
+ case 50: {
+ Thumbnail = input.ReadBytes();
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ public sealed partial class DataReply : pb::IMessage {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DataReply());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UltraCombos.Frozen.RoyalGallery.UltracombosFrozenRoyalGalleryReflection.Descriptor.MessageTypes[4]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataReply() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataReply(DataReply other) : this() {
+ result_ = other.result_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public DataReply Clone() {
+ return new DataReply(this);
+ }
+
+ /// Field number for the "result" field.
+ public const int ResultFieldNumber = 1;
+ private string result_ = "";
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Result {
+ get { return result_; }
+ set {
+ result_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as DataReply);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(DataReply other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Result != other.Result) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Result.Length != 0) hash ^= Result.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (Result.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(Result);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (Result.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Result);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(DataReply other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Result.Length != 0) {
+ Result = other.Result;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Result = input.ReadString();
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/_Utils/Grpc/drop_and_compile_protoc.bat b/_Utils/Grpc/drop_and_compile_protoc.bat
new file mode 100644
index 0000000..38a450b
--- /dev/null
+++ b/_Utils/Grpc/drop_and_compile_protoc.bat
@@ -0,0 +1,13 @@
+set name=%~n1
+set output_path_csharp=%name%\csharp
+set plugin_path_csharp=grpc_csharp_plugin.exe
+md %name%
+md %output_path_csharp%
+
+protoc.exe --proto_path=.\^
+ --plugin=protoc-gen-grpc=%plugin_path_csharp%^
+ --grpc_out=%output_path_csharp%^
+ --csharp_out=%output_path_csharp%^
+ %name%.proto
+
+ pause
\ No newline at end of file
diff --git a/_Utils/Grpc/grpc_csharp_plugin.exe b/_Utils/Grpc/grpc_csharp_plugin.exe
new file mode 100644
index 0000000..32c20b2
Binary files /dev/null and b/_Utils/Grpc/grpc_csharp_plugin.exe differ
diff --git a/_Utils/Grpc/protoc.exe b/_Utils/Grpc/protoc.exe
new file mode 100644
index 0000000..837f42f
Binary files /dev/null and b/_Utils/Grpc/protoc.exe differ