diff --git a/.gitattributes b/.gitattributes
index 762e01718..467d6642e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -51,4 +51,5 @@
*.dylib filter=lfs diff=lfs merge=lfs -text
*.bundle filter=lfs diff=lfs merge=lfs -text
*.engine filter=lfs diff=lfs merge=lfs -text
-*.sbsar filter=lfs diff=lfs merge=lfs -text
\ No newline at end of file
+*.sbsar filter=lfs diff=lfs merge=lfs -text
+*.a filter=lfs diff=lfs merge=lfs -text
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..e69de29bb
diff --git a/.idea/.idea.Aetheria-Economy/.idea/.gitignore b/.idea/.idea.Aetheria-Economy/.idea/.gitignore
new file mode 100644
index 000000000..5c98b4288
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml
new file mode 100644
index 000000000..5c02b7a0b
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/encodings.xml b/.idea/.idea.Aetheria-Economy/.idea/encodings.xml
new file mode 100644
index 000000000..15a15b218
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/indexLayout.xml b/.idea/.idea.Aetheria-Economy/.idea/indexLayout.xml
new file mode 100644
index 000000000..59657e7c7
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/indexLayout.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Library/PackageCache/com.unity.package-manager-ui@2.0.8
+ Library/PackageCache/com.unity.textmeshpro@1.4.1
+ Packages
+ ProjectSettings
+
+
+ .git
+ .idea
+ Economy.Server
+ Economy.Shared
+ Library
+ Logs
+ Server
+ Temp
+ obj
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/modules.xml b/.idea/.idea.Aetheria-Economy/.idea/modules.xml
new file mode 100644
index 000000000..a208ed7a3
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/projectSettingsUpdater.xml b/.idea/.idea.Aetheria-Economy/.idea/projectSettingsUpdater.xml
new file mode 100644
index 000000000..7515e7605
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/projectSettingsUpdater.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/.idea/vcs.xml b/.idea/.idea.Aetheria-Economy/.idea/vcs.xml
new file mode 100644
index 000000000..94a25f7f4
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Aetheria-Economy/riderModule.iml b/.idea/.idea.Aetheria-Economy/riderModule.iml
new file mode 100644
index 000000000..1a4e0d95f
--- /dev/null
+++ b/.idea/.idea.Aetheria-Economy/riderModule.iml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/.gitignore b/.idea/.idea.Economy/.idea/.gitignore
new file mode 100644
index 000000000..5c98b4288
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/.name b/.idea/.idea.Economy/.idea/.name
new file mode 100644
index 000000000..bc0cd0567
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/.name
@@ -0,0 +1 @@
+Economy
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/contentModel.xml b/.idea/.idea.Economy/.idea/contentModel.xml
new file mode 100644
index 000000000..0521333ab
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/contentModel.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/encodings.xml b/.idea/.idea.Economy/.idea/encodings.xml
new file mode 100644
index 000000000..15a15b218
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/indexLayout.xml b/.idea/.idea.Economy/.idea/indexLayout.xml
new file mode 100644
index 000000000..2f6cd4809
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/indexLayout.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Assets
+ Library/PackageCache/com.unity.package-manager-ui@2.0.8
+ Library/PackageCache/com.unity.textmeshpro@1.4.1
+ Packages
+ ProjectSettings
+
+
+ .git
+ .idea
+ Library
+ Logs
+ Server
+ Temp
+ obj
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/modules.xml b/.idea/.idea.Economy/.idea/modules.xml
new file mode 100644
index 000000000..b561af881
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/projectSettingsUpdater.xml b/.idea/.idea.Economy/.idea/projectSettingsUpdater.xml
new file mode 100644
index 000000000..7515e7605
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/projectSettingsUpdater.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/.idea/vcs.xml b/.idea/.idea.Economy/.idea/vcs.xml
new file mode 100644
index 000000000..94a25f7f4
--- /dev/null
+++ b/.idea/.idea.Economy/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Economy/riderModule.iml b/.idea/.idea.Economy/riderModule.iml
new file mode 100644
index 000000000..1a4e0d95f
--- /dev/null
+++ b/.idea/.idea.Economy/riderModule.iml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta
new file mode 100644
index 000000000..e5bd13300
--- /dev/null
+++ b/Assets/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 90833898188c49d46afaf79612689387
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Editor.meta b/Assets/Plugins/Editor.meta
new file mode 100644
index 000000000..eb9c50384
--- /dev/null
+++ b/Assets/Plugins/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1829d9a4a1359de47bda1a7f40ce3d04
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Google.Protobuf.meta b/Assets/Plugins/Google.Protobuf.meta
new file mode 100644
index 000000000..c9d3ca96b
--- /dev/null
+++ b/Assets/Plugins/Google.Protobuf.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4b6ebd913ac610041b63fc847ee96302
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Google.Protobuf/lib.meta b/Assets/Plugins/Google.Protobuf/lib.meta
new file mode 100644
index 000000000..d415abf6d
--- /dev/null
+++ b/Assets/Plugins/Google.Protobuf/lib.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e4ab5b3f8a676a84a9eb3ffcf1e8138d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Google.Protobuf/lib/net45.meta b/Assets/Plugins/Google.Protobuf/lib/net45.meta
new file mode 100644
index 000000000..b7670b6f7
--- /dev/null
+++ b/Assets/Plugins/Google.Protobuf/lib/net45.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4c50e24955a9a294b99ad097ae2e252a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll b/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll
new file mode 100644
index 000000000..b378d5e93
--- /dev/null
+++ b/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dd06dd3ce2930529ea2571668f91c1d42e7cb3017b4ea84a1e3350af697283ec
+size 332272
diff --git a/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll.meta b/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll.meta
new file mode 100644
index 000000000..d6a537838
--- /dev/null
+++ b/Assets/Plugins/Google.Protobuf/lib/net45/Google.Protobuf.dll.meta
@@ -0,0 +1,30 @@
+fileFormatVersion: 2
+guid: 286edf5aec6aae64697e5e8b7ab9b60e
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.Api.meta b/Assets/Plugins/Grpc.Core.Api.meta
new file mode 100644
index 000000000..f5d5149c2
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9b4ba511bab164bf9a5d0db8bb681b05
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.Api/lib.meta b/Assets/Plugins/Grpc.Core.Api/lib.meta
new file mode 100644
index 000000000..88c1aedba
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 21a3894045fc74e85a09ab84c0e35c3a
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.Api/lib/net45.meta b/Assets/Plugins/Grpc.Core.Api/lib/net45.meta
new file mode 100644
index 000000000..8012e3d58
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib/net45.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9fd1c7cd7b6ed4d5285de90a332fb93e
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll
new file mode 100644
index 000000000..5fcdecb60
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16cbcec16298560353235e0362f5f9a52844cd326b6d7e0f9c58a4efb9a7807c
+size 43008
diff --git a/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll.meta b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll.meta
new file mode 100644
index 000000000..7b939f861
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.dll.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: c9bf7237d50ec4e99ba7d2c153b80e8f
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml
new file mode 100644
index 000000000..eef1ab263
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml
@@ -0,0 +1,2539 @@
+
+
+
+ Grpc.Core.Api
+
+
+
+
+ Asynchronous authentication interceptor for .
+
+ The interceptor context.
+ Metadata to populate with entries that will be added to outgoing call's headers.
+
+
+
+
+ Context for an RPC being intercepted by .
+
+
+
+
+ Initializes a new instance of AuthInterceptorContext.
+
+
+
+
+ The fully qualified service URL for the RPC being called.
+
+
+
+
+ The method name of the RPC being called.
+
+
+
+
+ Provides an abstraction over the callback providers
+ used by AsyncUnaryCall, AsyncDuplexStreamingCall, etc
+
+
+
+
+ Return type for client streaming calls.
+
+ Request message type for this call.
+ Response message type for this call.
+
+
+
+ Creates a new AsyncClientStreamingCall object with the specified properties.
+
+ Stream of request values.
+ The response of the asynchronous call.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+
+
+
+ Creates a new AsyncClientStreamingCall object with the specified properties.
+
+ Stream of request values.
+ The response of the asynchronous call.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+ State object for use with the callback parameters.
+
+
+
+ Asynchronous call result.
+
+
+
+
+ Asynchronous access to response headers.
+
+
+
+
+ Async stream to send streaming requests.
+
+
+
+
+ Allows awaiting this object directly.
+
+
+
+
+
+ Gets the call status if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets the call trailing metadata if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Provides means to cleanup after the call.
+ If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything.
+ Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ As a result, all resources being used by the call should be released eventually.
+
+
+ Normally, there is no need for you to dispose the call unless you want to utilize the
+ "Cancel" semantics of invoking Dispose.
+
+
+
+
+ Return type for bidirectional streaming calls.
+
+ Request message type for this call.
+ Response message type for this call.
+
+
+
+ Creates a new AsyncDuplexStreamingCall object with the specified properties.
+
+ Stream of request values.
+ Stream of response values.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+
+
+
+ Creates a new AsyncDuplexStreamingCall object with the specified properties.
+
+ Stream of request values.
+ Stream of response values.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+ State object for use with the callback parameters.
+
+
+
+ Async stream to read streaming responses.
+
+
+
+
+ Async stream to send streaming requests.
+
+
+
+
+ Asynchronous access to response headers.
+
+
+
+
+ Gets the call status if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets the call trailing metadata if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Provides means to cleanup after the call.
+ If the call has already finished normally (request stream has been completed and response stream has been fully read), doesn't do anything.
+ Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ As a result, all resources being used by the call should be released eventually.
+
+
+ Normally, there is no need for you to dispose the call unless you want to utilize the
+ "Cancel" semantics of invoking Dispose.
+
+
+
+
+ Return type for server streaming calls.
+
+ Response message type for this call.
+
+
+
+ Creates a new AsyncDuplexStreamingCall object with the specified properties.
+
+ Stream of response values.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+
+
+
+ Creates a new AsyncDuplexStreamingCall object with the specified properties.
+
+ Stream of response values.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+ State object for use with the callback parameters.
+
+
+
+ Async stream to read streaming responses.
+
+
+
+
+ Asynchronous access to response headers.
+
+
+
+
+ Gets the call status if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets the call trailing metadata if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Provides means to cleanup after the call.
+ If the call has already finished normally (response stream has been fully read), doesn't do anything.
+ Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ As a result, all resources being used by the call should be released eventually.
+
+
+ Normally, there is no need for you to dispose the call unless you want to utilize the
+ "Cancel" semantics of invoking Dispose.
+
+
+
+
+ Extension methods for .
+
+
+
+
+ Advances the stream reader to the next element in the sequence, returning the result asynchronously.
+
+ The message type.
+ The stream reader.
+
+ Task containing the result of the operation: true if the reader was successfully advanced
+ to the next element; false if the reader has passed the end of the sequence.
+
+
+
+
+ Return type for single request - single response call.
+
+ Response message type for this call.
+
+
+
+ Creates a new AsyncUnaryCall object with the specified properties.
+
+ The response of the asynchronous call.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+
+
+
+ Creates a new AsyncUnaryCall object with the specified properties.
+
+ The response of the asynchronous call.
+ Response headers of the asynchronous call.
+ Delegate returning the status of the call.
+ Delegate returning the trailing metadata of the call.
+ Delegate to invoke when Dispose is called on the call object.
+ State object for use with the callback parameters.
+
+
+
+ Asynchronous call result.
+
+
+
+
+ Asynchronous access to response headers.
+
+
+
+
+ Allows awaiting this object directly.
+
+
+
+
+ Gets the call status if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets the call trailing metadata if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Provides means to cleanup after the call.
+ If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything.
+ Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ As a result, all resources being used by the call should be released eventually.
+
+
+ Normally, there is no need for you to dispose the call unless you want to utilize the
+ "Cancel" semantics of invoking Dispose.
+
+
+
+
+ Authentication context for a call.
+ AuthContext is the only reliable source of truth when it comes to authenticating calls.
+ Using any other call/context properties for authentication purposes is wrong and inherently unsafe.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Peer identity property name.
+ Multimap of auth properties by name.
+
+
+
+ Returns true if the peer is authenticated.
+
+
+
+
+ Gets the name of the property that indicates the peer identity. Returns null
+ if the peer is not authenticated.
+
+
+
+
+ Gets properties that represent the peer identity (there can be more than one). Returns an empty collection
+ if the peer is not authenticated.
+
+
+
+
+ Gets the auth properties of this context.
+
+
+
+
+ Returns the auth properties with given name (there can be more than one).
+ If no properties of given name exist, an empty collection will be returned.
+
+
+
+
+ A property of an .
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Gets the name of the property.
+
+
+
+
+ Gets the string value of the property.
+
+
+
+
+ Gets the binary value of the property.
+
+
+
+
+ Creates an instance of AuthProperty.
+
+ the name
+ the binary value of the property
+
+
+
+ Gets the binary value of the property (without making a defensive copy).
+
+
+
+
+ Creates and instance of AuthProperty without making a defensive copy of valueBytes.
+
+
+
+
+ Specifies the location of the service bind method for a gRPC service.
+ The bind method is typically generated code and is used to register a service's
+ methods with the server on startup.
+
+ The bind method signature takes a and an optional
+ instance of the service base class, e.g. static void BindService(ServiceBinderBase, GreeterService).
+
+
+
+
+ Initializes a new instance of the class.
+
+ The type the service bind method is defined on.
+ The name of the service bind method.
+
+
+
+ Gets the type the service bind method is defined on.
+
+
+
+
+ Gets the name of the service bind method.
+
+
+
+
+ Client-side call credentials. Provide authorization with per-call granularity.
+
+
+
+
+ Composes multiple multiple CallCredentials objects into
+ a single CallCredentials object.
+
+ credentials to compose
+ The new CompositeCallCredentials
+
+
+
+ Creates a new instance of CallCredentials class from an
+ interceptor that can attach metadata to outgoing calls.
+
+ authentication interceptor
+
+
+
+ Populates call credentials configurator with this instance's configuration.
+ End users never need to invoke this method as it is part of internal implementation.
+
+
+
+
+ Base class for objects that can consume configuration from CallCredentials objects.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Consumes configuration for composite call credentials.
+
+
+
+
+ Consumes configuration for call credentials created from AsyncAuthInterceptor
+
+
+
+
+ Flags to enable special call behaviors (client-side only).
+
+
+
+
+ The call is idempotent (retrying the call doesn't change the outcome of the operation).
+
+
+
+
+ If channel is in ChannelState.TransientFailure, attempt waiting for the channel to recover
+ instead of failing the call immediately.
+
+
+
+
+ The call is cacheable. gRPC is free to use GET verb */
+
+
+
+
+ Call invoker that throws NotImplementedException for all requests.
+
+
+
+
+ Abstraction of client-side RPC invocation.
+
+
+
+
+ Invokes a simple remote call in a blocking fashion.
+
+
+
+
+ Invokes a simple remote call asynchronously.
+
+
+
+
+ Invokes a server streaming call asynchronously.
+ In server streaming scenario, client sends on request and server responds with a stream of responses.
+
+
+
+
+ Invokes a client streaming call asynchronously.
+ In client streaming scenario, client sends a stream of requests and server responds with a single response.
+
+
+
+
+ Invokes a duplex streaming call asynchronously.
+ In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses.
+ The response stream is completely independent and both side can be sending messages at the same time.
+
+
+
+
+ Options for calls made by client.
+
+
+
+
+ Creates a new instance of CallOptions struct.
+
+ Headers to be sent with the call.
+ Deadline for the call to finish. null means no deadline.
+ Can be used to request cancellation of the call.
+ Write options that will be used for this call.
+ Context propagation token obtained from .
+ Credentials to use for this call.
+
+
+
+ Headers to send at the beginning of the call.
+
+
+
+
+ Call deadline.
+
+
+
+
+ Token that can be used for cancelling the call on the client side.
+ Cancelling the token will request cancellation
+ of the remote call. Best effort will be made to deliver the cancellation
+ notification to the server and interaction of the call with the server side
+ will be terminated. Unless the call finishes before the cancellation could
+ happen (there is an inherent race),
+ the call will finish with StatusCode.Cancelled status.
+
+
+
+
+ Write options that will be used for this call.
+
+
+
+
+ Token for propagating parent call context.
+
+
+
+
+ Credentials to use for this call.
+
+
+
+
+ If true and and channel is in ChannelState.TransientFailure, the call will attempt waiting for the channel to recover
+ instead of failing immediately (which is the default "FailFast" semantics).
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Flags to use for this call.
+
+
+
+
+ Returns new instance of with
+ Headers set to the value provided. Values of all other fields are preserved.
+
+ The headers.
+
+
+
+ Returns new instance of with
+ Deadline set to the value provided. Values of all other fields are preserved.
+
+ The deadline.
+
+
+
+ Returns new instance of with
+ CancellationToken set to the value provided. Values of all other fields are preserved.
+
+ The cancellation token.
+
+
+
+ Returns new instance of with
+ WriteOptions set to the value provided. Values of all other fields are preserved.
+
+ The write options.
+
+
+
+ Returns new instance of with
+ PropagationToken set to the value provided. Values of all other fields are preserved.
+
+ The context propagation token.
+
+
+
+ Returns new instance of with
+ Credentials set to the value provided. Values of all other fields are preserved.
+
+ The call credentials.
+
+
+
+ Returns new instance of with "WaitForReady" semantics enabled/disabled.
+ .
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Returns new instance of with
+ Flags set to the value provided. Values of all other fields are preserved.
+
+ The call flags.
+
+
+
+ Base class for gRPC channel. Channels are an abstraction of long-lived connections to remote servers.
+
+
+
+
+ Initializes a new instance of class that connects to a specific host.
+
+ Target of the channel.
+
+
+ The original target used to create the channel.
+
+
+
+ Create a new for the channel.
+
+ A new .
+
+
+
+ Client-side channel credentials. Used for creation of a secure channel.
+
+
+
+
+ Creates a new instance of channel credentials
+
+
+
+
+ Returns instance of credentials that provides no security and
+ will result in creating an unsecure channel with no encryption whatsoever.
+
+
+
+
+ Creates a new instance of ChannelCredentials class by composing
+ given channel credentials with call credentials.
+
+ Channel credentials.
+ Call credentials.
+ The new composite ChannelCredentials
+
+
+
+ Populates channel credentials configurator with this instance's configuration.
+ End users never need to invoke this method as it is part of internal implementation.
+
+
+
+
+ Returns true if this credential type allows being composed by CompositeCredentials.
+
+
+
+
+ Credentials that allow composing one object and
+ one or more objects into a single .
+
+
+
+
+ Initializes a new instance of CompositeChannelCredentials class.
+ The resulting credentials object will be composite of all the credentials specified as parameters.
+
+ channelCredentials to compose
+ channelCredentials to compose
+
+
+
+ Base class for objects that can consume configuration from CallCredentials objects.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Configures the credentials to use insecure credentials.
+
+
+
+
+ Configures the credentials to use SslCredentials.
+
+
+
+
+ Configures the credentials to use composite channel credentials (a composite of channel credentials and call credentials).
+
+
+
+
+ Generic base class for client-side stubs.
+
+
+
+
+ Initializes a new instance of ClientBase class that
+ throws NotImplementedException upon invocation of any RPC.
+ This constructor is only provided to allow creation of test doubles
+ for client classes (e.g. mocking requires a parameterless constructor).
+
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The configuration.
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The channel to use for remote call invocation.
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The CallInvoker for remote call invocation.
+
+
+
+ Creates a new client that sets host field for calls explicitly.
+ gRPC supports multiple "hosts" being served by a single server.
+ By default (if a client was not created by calling this method),
+ host null with the meaning "use default host" is used.
+
+
+
+
+ Creates a new instance of client from given ClientBaseConfiguration.
+
+
+
+
+ Base class for client-side stubs.
+
+
+
+
+ Initializes a new instance of ClientBase class that
+ throws NotImplementedException upon invocation of any RPC.
+ This constructor is only provided to allow creation of test doubles
+ for client classes (e.g. mocking requires a parameterless constructor).
+
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The configuration.
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The channel to use for remote call invocation.
+
+
+
+ Initializes a new instance of ClientBase class.
+
+ The CallInvoker for remote call invocation.
+
+
+
+ Gets the call invoker.
+
+
+
+
+ Gets the configuration.
+
+
+
+
+ Represents configuration of ClientBase. The class itself is visible to
+ subclasses, but contents are marked as internal to make the instances opaque.
+ The verbose name of this class was chosen to make name clash in generated code
+ less likely.
+
+
+
+
+ Creates a new instance of ClientBaseConfigurationInterceptor given the specified header and host interceptor function.
+
+
+
+
+ Options for .
+
+
+
+
+ The context propagation options that will be used by default.
+
+
+
+
+ Creates new context propagation options.
+
+ If set to true parent call's deadline will be propagated to the child call.
+ If set to true parent call's cancellation token will be propagated to the child call.
+
+
+ true if parent call's deadline should be propagated to the child call.
+
+
+ true if parent call's cancellation token should be propagated to the child call.
+
+
+
+ Token for propagating context of server side handlers to child calls.
+ In situations when a backend is making calls to another backend,
+ it makes sense to propagate properties like deadline and cancellation
+ token of the server call to the child call.
+ Underlying gRPC implementation may provide other "opaque" contexts (like tracing context) that
+ are not explicitly accesible via the public C# API, but this token still allows propagating them.
+
+
+
+
+ Provides access to the payload being deserialized when deserializing messages.
+
+
+
+
+ Get the total length of the payload in bytes.
+
+
+
+
+ Gets the entire payload as a newly allocated byte array.
+ Once the byte array is returned, the byte array becomes owned by the caller and won't be ever accessed or reused by gRPC again.
+ NOTE: Obtaining the buffer as a newly allocated byte array is the simplest way of accessing the payload,
+ but it can have important consequences in high-performance scenarios.
+ In particular, using this method usually requires copying of the entire buffer one extra time.
+ Also, allocating a new buffer each time can put excessive pressure on GC, especially if
+ the payload is more than 86700 bytes large (which means the newly allocated buffer will be placed in LOH,
+ and LOH object can only be garbage collected via a full ("stop the world") GC run).
+ NOTE: Deserializers are expected not to call this method (or other payload accessor methods) more than once per received message
+ (as there is no practical reason for doing so) and DeserializationContext implementations are free to assume so.
+
+ byte array containing the entire payload.
+
+
+
+ Gets the entire payload as a ReadOnlySequence.
+ The ReadOnlySequence is only valid for the duration of the deserializer routine and the caller must not access it after the deserializer returns.
+ Using the read only sequence is the most efficient way to access the message payload. Where possible it allows directly
+ accessing the received payload without needing to perform any buffer copying or buffer allocations.
+ NOTE: When using this method, it is recommended to use C# 7.2 compiler to make it more useful (using Span type directly from your code requires C# 7.2)."
+ NOTE: Deserializers are expected not to call this method (or other payload accessor methods) more than once per received message
+ (as there is no practical reason for doing so) and DeserializationContext implementations are free to assume so.
+
+ read only sequence containing the entire payload.
+
+
+
+ A stream of messages to be read.
+ Messages can be awaited await reader.MoveNext(), that returns true
+ if there is a message available and false if there are no more messages
+ (i.e. the stream has been closed).
+
+ On the client side, the last invocation of MoveNext() either returns false
+ if the call has finished successfully or throws RpcException if call finished
+ with an error. Once the call finishes, subsequent invocations of MoveNext() will
+ continue yielding the same result (returning false or throwing an exception).
+
+
+ On the server side, MoveNext() does not throw exceptions.
+ In case of a failure, the request stream will appear to be finished
+ (MoveNext will return false) and the CancellationToken
+ associated with the call will be cancelled to signal the failure.
+
+
+ MoveNext() operations can be cancelled via a cancellation token. Cancelling
+ an individual read operation has the same effect as cancelling the entire call
+ (which will also result in the read operation returning prematurely), but the per-read cancellation
+ tokens passed to MoveNext() only result in cancelling the call if the read operation haven't finished
+ yet.
+
+
+ The message type.
+
+
+
+ Gets the current element in the iteration.
+
+
+
+
+ Advances the reader to the next element in the sequence, returning the result asynchronously.
+
+ Cancellation token that can be used to cancel the operation.
+
+ Task containing the result of the operation: true if the reader was successfully advanced
+ to the next element; false if the reader has passed the end of the sequence.
+
+
+
+ A writable stream of messages.
+
+ The message type.
+
+
+
+ Writes a single asynchronously. Only one write can be pending at a time.
+
+ the message to be written. Cannot be null.
+
+
+
+ Write options that will be used for the next write.
+ If null, default options will be used.
+ Once set, this property maintains its value across subsequent
+ writes.
+
+
+
+
+ Client-side writable stream of messages with Close capability.
+
+ The message type.
+
+
+
+ Completes/closes the stream. Can only be called once there is no pending write. No writes should follow calling this.
+
+
+
+
+ Extends the CallInvoker class to provide the interceptor facility on the client side.
+
+
+
+
+ Returns a instance that intercepts
+ the invoker with the given interceptor.
+
+ The underlying invoker to intercept.
+ The interceptor to intercept calls to the invoker with.
+
+ Multiple interceptors can be added on top of each other by calling
+ "invoker.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted CallInvoker, effectively
+ building a chain like "invoker.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Returns a instance that intercepts
+ the invoker with the given interceptors.
+
+ The channel to intercept.
+
+ An array of interceptors to intercept the calls to the invoker with.
+ Control is passed to the interceptors in the order specified.
+
+
+ Multiple interceptors can be added on top of each other by calling
+ "invoker.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted CallInvoker, effectively
+ building a chain like "invoker.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Returns a instance that intercepts
+ the invoker with the given interceptor.
+
+ The underlying invoker to intercept.
+
+ An interceptor delegate that takes the request metadata to be sent with an outgoing call
+ and returns a instance that will replace the existing
+ invocation metadata.
+
+
+ Multiple interceptors can be added on top of each other by
+ building a chain like "invoker.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Creates a new instance of MetadataInterceptor given the specified interceptor function.
+
+
+
+
+ Provides extension methods to make it easy to register interceptors on Channel objects.
+
+
+
+
+ Returns a instance that intercepts
+ the channel with the given interceptor.
+
+ The channel to intercept.
+ The interceptor to intercept the channel with.
+
+ Multiple interceptors can be added on top of each other by calling
+ "channel.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted channel, effectively
+ building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Returns a instance that intercepts
+ the channel with the given interceptors.
+
+ The channel to intercept.
+
+ An array of interceptors to intercept the channel with.
+ Control is passed to the interceptors in the order specified.
+
+
+ Multiple interceptors can be added on top of each other by calling
+ "channel.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted channel, effectively
+ building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Returns a instance that intercepts
+ the invoker with the given interceptor.
+
+ The channel to intercept.
+
+ An interceptor delegate that takes the request metadata to be sent with an outgoing call
+ and returns a instance that will replace the existing
+ invocation metadata.
+
+
+ Multiple interceptors can be added on top of each other by
+ building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Carries along the context associated with intercepted invocations on the client side.
+
+
+
+
+ Creates a new instance of
+ with the specified method, host, and call options.
+
+ A object representing the method to be invoked.
+ The host to dispatch the current call to.
+ A instance containing the call options of the current call.
+
+
+
+ Gets the instance
+ representing the method to be invoked.
+
+
+
+
+ Gets the host that the currect invocation will be dispatched to.
+
+
+
+
+ Gets the structure representing the
+ call options associated with the current invocation.
+
+
+
+
+ Decorates an underlying to
+ intercept calls through a given interceptor.
+
+
+
+
+ Creates a new instance of
+ with the given underlying invoker and interceptor instances.
+
+
+
+
+ Intercepts a simple blocking call with the registered interceptor.
+
+
+
+
+ Intercepts a simple asynchronous call with the registered interceptor.
+
+
+
+
+ Intercepts an asynchronous server streaming call with the registered interceptor.
+
+
+
+
+ Intercepts an asynchronous client streaming call with the registered interceptor.
+
+
+
+
+ Intercepts an asynchronous duplex streaming call with the registered interceptor.
+
+
+
+
+ Serves as the base class for gRPC interceptors.
+
+
+
+
+ Represents a continuation for intercepting simple blocking invocations.
+ A delegate of this type is passed to the BlockingUnaryCall method
+ when an outgoing invocation is being intercepted and calling the
+ delegate will invoke the next interceptor in the chain, or the underlying
+ call invoker if called from the last interceptor. The interceptor is
+ allowed to call it zero, one, or multiple times, passing it the appropriate
+ context and request values as it sees fit.
+
+ Request message type for this invocation.
+ Response message type for this invocation.
+ The request value to continue the invocation with.
+
+ The
+ instance to pass to the next step in the invocation process.
+
+
+ The response value of the invocation to return to the caller.
+ The interceptor can choose to return the return value of the
+ continuation delegate or an arbitrary value as it sees fit.
+
+
+
+
+ Represents a continuation for intercepting simple asynchronous invocations.
+ A delegate of this type is passed to the AsyncUnaryCall method
+ when an outgoing invocation is being intercepted and calling the
+ delegate will invoke the next interceptor in the chain, or the underlying
+ call invoker if called from the last interceptor. The interceptor is
+ allowed to call it zero, one, or multiple times, passing it the appropriate
+ request value and context as it sees fit.
+
+ Request message type for this invocation.
+ Response message type for this invocation.
+ The request value to continue the invocation with.
+
+ The
+ instance to pass to the next step in the invocation process.
+
+
+ An instance of
+ representing an asynchronous invocation of a unary RPC.
+ The interceptor can choose to return the same object returned from
+ the continuation delegate or an arbitrarily constructed instance as it sees fit.
+
+
+
+
+ Represents a continuation for intercepting asynchronous server-streaming invocations.
+ A delegate of this type is passed to the AsyncServerStreamingCall method
+ when an outgoing invocation is being intercepted and calling the
+ delegate will invoke the next interceptor in the chain, or the underlying
+ call invoker if called from the last interceptor. The interceptor is
+ allowed to call it zero, one, or multiple times, passing it the appropriate
+ request value and context as it sees fit.
+
+ Request message type for this invocation.
+ Response message type for this invocation.
+ The request value to continue the invocation with.
+
+ The
+ instance to pass to the next step in the invocation process.
+
+
+ An instance of
+ representing an asynchronous invocation of a server-streaming RPC.
+ The interceptor can choose to return the same object returned from
+ the continuation delegate or an arbitrarily constructed instance as it sees fit.
+
+
+
+
+ Represents a continuation for intercepting asynchronous client-streaming invocations.
+ A delegate of this type is passed to the AsyncClientStreamingCall method
+ when an outgoing invocation is being intercepted and calling the
+ delegate will invoke the next interceptor in the chain, or the underlying
+ call invoker if called from the last interceptor. The interceptor is
+ allowed to call it zero, one, or multiple times, passing it the appropriate
+ request value and context as it sees fit.
+
+ Request message type for this invocation.
+ Response message type for this invocation.
+
+ The
+ instance to pass to the next step in the invocation process.
+
+
+ An instance of
+ representing an asynchronous invocation of a client-streaming RPC.
+ The interceptor can choose to return the same object returned from
+ the continuation delegate or an arbitrarily constructed instance as it sees fit.
+
+
+
+
+ Represents a continuation for intercepting asynchronous duplex invocations.
+ A delegate of this type is passed to the AsyncDuplexStreamingCall method
+ when an outgoing invocation is being intercepted and calling the
+ delegate will invoke the next interceptor in the chain, or the underlying
+ call invoker if called from the last interceptor. The interceptor is
+ allowed to call it zero, one, or multiple times, passing it the appropriate
+ request value and context as it sees fit.
+
+
+ The
+ instance to pass to the next step in the invocation process.
+
+
+ An instance of
+ representing an asynchronous invocation of a duplex-streaming RPC.
+ The interceptor can choose to return the same object returned from
+ the continuation delegate or an arbitrarily constructed instance as it sees fit.
+
+
+
+
+ Intercepts a blocking invocation of a simple remote call.
+
+ The request message of the invocation.
+
+ The
+ associated with the current invocation.
+
+
+ The callback that continues the invocation process.
+ This can be invoked zero or more times by the interceptor.
+ The interceptor can invoke the continuation passing the given
+ request value and context arguments, or substitute them as it sees fit.
+
+
+ The response message of the current invocation.
+ The interceptor can simply return the return value of the
+ continuation delegate passed to it intact, or an arbitrary
+ value as it sees fit.
+
+
+
+
+ Intercepts an asynchronous invocation of a simple remote call.
+
+ The request message of the invocation.
+
+ The
+ associated with the current invocation.
+
+
+ The callback that continues the invocation process.
+ This can be invoked zero or more times by the interceptor.
+ The interceptor can invoke the continuation passing the given
+ request value and context arguments, or substitute them as it sees fit.
+
+
+ An instance of
+ representing an asynchronous unary invocation.
+ The interceptor can simply return the return value of the
+ continuation delegate passed to it intact, or construct its
+ own substitute as it sees fit.
+
+
+
+
+ Intercepts an asynchronous invocation of a streaming remote call.
+
+ The request message of the invocation.
+
+ The
+ associated with the current invocation.
+
+
+ The callback that continues the invocation process.
+ This can be invoked zero or more times by the interceptor.
+ The interceptor can invoke the continuation passing the given
+ request value and context arguments, or substitute them as it sees fit.
+
+
+ An instance of
+ representing an asynchronous server-streaming invocation.
+ The interceptor can simply return the return value of the
+ continuation delegate passed to it intact, or construct its
+ own substitute as it sees fit.
+
+
+
+
+ Intercepts an asynchronous invocation of a client streaming call.
+
+
+ The
+ associated with the current invocation.
+
+
+ The callback that continues the invocation process.
+ This can be invoked zero or more times by the interceptor.
+ The interceptor can invoke the continuation passing the given
+ context argument, or substitute as it sees fit.
+
+
+ An instance of
+ representing an asynchronous client-streaming invocation.
+ The interceptor can simply return the return value of the
+ continuation delegate passed to it intact, or construct its
+ own substitute as it sees fit.
+
+
+
+
+ Intercepts an asynchronous invocation of a duplex streaming call.
+
+
+ The
+ associated with the current invocation.
+
+
+ The callback that continues the invocation process.
+ This can be invoked zero or more times by the interceptor.
+ The interceptor can invoke the continuation passing the given
+ context argument, or substitute as it sees fit.
+
+
+ An instance of
+ representing an asynchronous duplex-streaming invocation.
+ The interceptor can simply return the return value of the
+ continuation delegate passed to it intact, or construct its
+ own substitute as it sees fit.
+
+
+
+
+ Server-side handler for intercepting and incoming unary call.
+
+ Request message type for this method.
+ Response message type for this method.
+ The request value of the incoming invocation.
+
+ An instance of representing
+ the context of the invocation.
+
+
+ A delegate that asynchronously proceeds with the invocation, calling
+ the next interceptor in the chain, or the service request handler,
+ in case of the last interceptor and return the response value of
+ the RPC. The interceptor can choose to call it zero or more times
+ at its discretion.
+
+
+ A future representing the response value of the RPC. The interceptor
+ can simply return the return value from the continuation intact,
+ or an arbitrary response value as it sees fit.
+
+
+
+
+ Server-side handler for intercepting client streaming call.
+
+ Request message type for this method.
+ Response message type for this method.
+ The request stream of the incoming invocation.
+
+ An instance of representing
+ the context of the invocation.
+
+
+ A delegate that asynchronously proceeds with the invocation, calling
+ the next interceptor in the chain, or the service request handler,
+ in case of the last interceptor and return the response value of
+ the RPC. The interceptor can choose to call it zero or more times
+ at its discretion.
+
+
+ A future representing the response value of the RPC. The interceptor
+ can simply return the return value from the continuation intact,
+ or an arbitrary response value as it sees fit. The interceptor has
+ the ability to wrap or substitute the request stream when calling
+ the continuation.
+
+
+
+
+ Server-side handler for intercepting server streaming call.
+
+ Request message type for this method.
+ Response message type for this method.
+ The request value of the incoming invocation.
+ The response stream of the incoming invocation.
+
+ An instance of representing
+ the context of the invocation.
+
+
+ A delegate that asynchronously proceeds with the invocation, calling
+ the next interceptor in the chain, or the service request handler,
+ in case of the last interceptor and the interceptor can choose to
+ call it zero or more times at its discretion. The interceptor has
+ the ability to wrap or substitute the request value and the response stream
+ when calling the continuation.
+
+
+
+
+ Server-side handler for intercepting bidirectional streaming calls.
+
+ Request message type for this method.
+ Response message type for this method.
+ The request stream of the incoming invocation.
+ The response stream of the incoming invocation.
+
+ An instance of representing
+ the context of the invocation.
+
+
+ A delegate that asynchronously proceeds with the invocation, calling
+ the next interceptor in the chain, or the service request handler,
+ in case of the last interceptor and the interceptor can choose to
+ call it zero or more times at its discretion. The interceptor has
+ the ability to wrap or substitute the request and response streams
+ when calling the continuation.
+
+
+
+
+ A writable stream of messages that is used in server-side handlers.
+
+
+
+
+ Key certificate pair (in PEM encoding).
+
+
+
+
+ Creates a new certificate chain - private key pair.
+
+ PEM encoded certificate chain.
+ PEM encoded private key.
+
+
+
+ PEM encoded certificate chain.
+
+
+
+
+ PEM encoded private key.
+
+
+
+
+ Encapsulates the logic for serializing and deserializing messages.
+
+
+
+
+ Initializes a new marshaller from simple serialize/deserialize functions.
+
+ Function that will be used to serialize messages.
+ Function that will be used to deserialize messages.
+
+
+
+ Initializes a new marshaller from serialize/deserialize fuctions that can access serialization and deserialization
+ context. Compared to the simple serializer/deserializer functions, using the contextual version provides more
+ flexibility and can lead to increased efficiency (and better performance).
+ Note: This constructor is part of an experimental API that can change or be removed without any prior notice.
+
+ Function that will be used to serialize messages.
+ Function that will be used to deserialize messages.
+
+
+
+ Gets the serializer function.
+
+
+
+
+ Gets the deserializer function.
+
+
+
+
+ Gets the serializer function.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Gets the serializer function.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Utilities for creating marshallers.
+
+
+
+
+ Creates a marshaller from specified serializer and deserializer.
+
+
+
+
+ Creates a marshaller from specified contextual serializer and deserializer.
+ Note: This method is part of an experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Returns a marshaller for string type. This is useful for testing.
+
+
+
+
+ A collection of metadata entries that can be exchanged during a call.
+ gRPC supports these types of metadata:
+
+ - Request headersare sent by the client at the beginning of a remote call before any request messages are sent.
+ - Response headersare sent by the server at the beginning of a remote call handler before any response messages are sent.
+ - Response trailersare sent by the server at the end of a remote call along with resulting call status.
+
+
+
+
+
+ All binary headers should have this suffix.
+
+
+
+
+ An read-only instance of metadata containing no entries.
+
+
+
+
+ To be used in initial metadata to request specific compression algorithm
+ for given call. Direct selection of compression algorithms is an internal
+ feature and is not part of public API.
+
+
+
+
+ Initializes a new instance of Metadata.
+
+
+
+
+ Makes this object read-only.
+
+ this object
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adds a new ASCII-valued metadata entry. See Metadata.Entry constructor for params.
+
+
+
+
+ Adds a new binary-valued metadata entry. See Metadata.Entry constructor for params.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Metadata entry
+
+
+
+
+ Initializes a new instance of the struct with a binary value.
+
+ Metadata key. Gets converted to lowercase. Needs to have suffix indicating a binary valued metadata entry. Can only contain lowercase alphanumeric characters, underscores, hyphens and dots.
+ Value bytes.
+
+
+
+ Initializes a new instance of the struct with an ASCII value.
+
+ Metadata key. Gets converted to lowercase. Must not use suffix indicating a binary valued metadata entry. Can only contain lowercase alphanumeric characters, underscores, hyphens and dots.
+ Value string. Only ASCII characters are allowed.
+
+
+
+ Gets the metadata entry key.
+
+
+
+
+ Gets the binary value of this metadata entry.
+
+
+
+
+ Gets the string value of this metadata entry.
+
+
+
+
+ Returns true if this entry is a binary-value entry.
+
+
+
+
+ Returns a that represents the current .
+
+
+
+
+ Gets the serialized value for this entry. For binary metadata entries, this leaks
+ the internal valueBytes byte array and caller must not change contents of it.
+
+
+
+
+ Creates a binary value or ascii value metadata entry from data received from the native layer.
+ We trust C core to give us well-formed data, so we don't perform any checks or defensive copying.
+
+
+
+
+ Returns true if the key has "-bin" binary header suffix.
+
+
+
+
+ Method types supported by gRPC.
+
+
+
+ Single request sent from client, single response received from server.
+
+
+ Stream of request sent from client, single response received from server.
+
+
+ Single request sent from client, stream of responses received from server.
+
+
+ Both server and client can stream arbitrary number of requests and responses simultaneously.
+
+
+
+ A non-generic representation of a remote method.
+
+
+
+
+ Gets the type of the method.
+
+
+
+
+ Gets the name of the service to which this method belongs.
+
+
+
+
+ Gets the unqualified name of the method.
+
+
+
+
+ Gets the fully qualified name of the method. On the server side, methods are dispatched
+ based on this name.
+
+
+
+
+ A description of a remote method.
+
+ Request message type for this method.
+ Response message type for this method.
+
+
+
+ Initializes a new instance of the Method class.
+
+ Type of method.
+ Name of service this method belongs to.
+ Unqualified name of the method.
+ Marshaller used for request messages.
+ Marshaller used for response messages.
+
+
+
+ Gets the type of the method.
+
+
+
+
+ Gets the name of the service to which this method belongs.
+
+
+
+
+ Gets the unqualified name of the method.
+
+
+
+
+ Gets the marshaller used for request messages.
+
+
+
+
+ Gets the marshaller used for response messages.
+
+
+
+
+ Gets the fully qualified name of the method. On the server side, methods are dispatched
+ based on this name.
+
+
+
+
+ Gets full name of the method including the service name.
+
+
+
+
+ Thrown when remote procedure call fails. Every RpcException is associated with a resulting of the call.
+
+
+
+
+ Creates a new RpcException associated with given status.
+
+ Resulting status of a call.
+
+
+
+ Creates a new RpcException associated with given status and message.
+ NOTE: the exception message is not sent to the remote peer. Use status.Details to pass error
+ details to the peer.
+
+ Resulting status of a call.
+ The exception message.
+
+
+
+ Creates a new RpcException associated with given status and trailing response metadata.
+
+ Resulting status of a call.
+ Response trailing metadata.
+
+
+
+ Creates a new RpcException associated with given status, message and trailing response metadata.
+ NOTE: the exception message is not sent to the remote peer. Use status.Details to pass error
+ details to the peer.
+
+ Resulting status of a call.
+ Response trailing metadata.
+ The exception message.
+
+
+
+ Resulting status of the call.
+
+
+
+
+ Returns the status code of the call, as a convenient alternative to Status.StatusCode.
+
+
+
+
+ Gets the call trailing metadata.
+ Trailers only have meaningful content for client-side calls (in which case they represent the trailing metadata sent by the server when closing the call).
+ Instances of RpcException thrown by the server-side part of the stack will have trailers always set to empty.
+
+
+
+
+ Provides storage for payload when serializing a message.
+
+
+
+
+ Use the byte array as serialized form of current message and mark serialization process as complete.
+ Complete(byte[]) can only be called once. By calling this method the caller gives up the ownership of the
+ payload which must not be accessed afterwards.
+
+ the serialized form of current message
+
+
+
+ Gets buffer writer that can be used to write the serialized data. Once serialization is finished,
+ Complete() needs to be called.
+
+
+
+
+ Sets the payload length when writing serialized data into a buffer writer. If the serializer knows the full payload
+ length in advance, providing that information before obtaining the buffer writer using GetBufferWriter() can improve
+ serialization efficiency by avoiding copies. The provided payload length must be the same as the data written to the writer.
+ Calling this method is optional. If the payload length is not set then the length is calculated using the data written to
+ the buffer writer when Complete() is called.
+
+ The total length of the payload in bytes.
+
+
+
+ Complete the payload written to the buffer writer. Complete() can only be called once.
+
+
+
+
+ Context for a server-side call.
+
+
+
+
+ Creates a new instance of ServerCallContext.
+
+
+
+
+ Asynchronously sends response headers for the current call to the client. This method may only be invoked once for each call and needs to be invoked
+ before any response messages are written. Writing the first response message implicitly sends empty response headers if WriteResponseHeadersAsync haven't
+ been called yet.
+
+ The response headers to send.
+ The task that finished once response headers have been written.
+
+
+
+ Creates a propagation token to be used to propagate call context to a child call.
+
+
+
+ Name of method called in this RPC.
+
+
+ Name of host called in this RPC.
+
+
+ Address of the remote endpoint in URI format.
+
+
+ Deadline for this RPC. The call will be automatically cancelled once the deadline is exceeded.
+
+
+ Initial metadata sent by client.
+
+
+ Cancellation token signals when call is cancelled. It is also triggered when the deadline is exceeeded or there was some other error (e.g. network problem).
+
+
+ Trailers to send back to client after RPC finishes.
+
+
+ Status to send back to client after RPC finishes.
+
+
+
+ Allows setting write options for the following write.
+ For streaming response calls, this property is also exposed as on IServerStreamWriter for convenience.
+ Both properties are backed by the same underlying value.
+
+
+
+
+ Gets the AuthContext associated with this call.
+ Note: Access to AuthContext is an experimental API that can change without any prior notice.
+
+
+
+
+ Gets a dictionary that can be used by the various interceptors and handlers of this
+ call to store arbitrary state.
+
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+ Provides implementation of a non-virtual public member.
+
+
+
+ Server-side handler for unary call.
+
+ Request message type for this method.
+ Response message type for this method.
+
+
+
+ Server-side handler for client streaming call.
+
+ Request message type for this method.
+ Response message type for this method.
+
+
+
+ Server-side handler for server streaming call.
+
+ Request message type for this method.
+ Response message type for this method.
+
+
+
+ Server-side handler for bidi streaming call.
+
+ Request message type for this method.
+ Response message type for this method.
+
+
+
+ Stores mapping of methods to server call handlers.
+ Normally, the ServerServiceDefinition objects will be created by the BindService factory method
+ that is part of the autogenerated code for a protocol buffers service definition.
+
+
+
+
+ Forwards all the previously stored AddMethod calls to the service binder.
+
+
+
+
+ Creates a new builder object for ServerServiceDefinition.
+
+ The builder object.
+
+
+
+ Builder class for .
+
+
+
+
+ Creates a new instance of builder.
+
+
+
+
+ Adds a definition for a single request - single response method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+ This builder instance.
+
+
+
+ Adds a definition for a client streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+ This builder instance.
+
+
+
+ Adds a definition for a server streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+ This builder instance.
+
+
+
+ Adds a definition for a bidirectional streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+ This builder instance.
+
+
+
+ Creates an immutable ServerServiceDefinition from this builder.
+
+ The ServerServiceDefinition object.
+
+
+
+ Allows binding server-side method implementations in alternative serving stacks.
+ Instances of this class are usually populated by the BindService method
+ that is part of the autogenerated code for a protocol buffers service definition.
+
+
+
+
+ Adds a definition for a single request - single response method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+
+
+
+ Adds a definition for a client streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+
+
+
+ Adds a definition for a server streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+
+
+
+ Adds a definition for a bidirectional streaming method.
+
+ The request message class.
+ The response message class.
+ The method.
+ The method handler.
+
+
+
+ Callback invoked with the expected targetHost and the peer's certificate.
+ If false is returned by this callback then it is treated as a
+ verification failure and the attempted connection will fail.
+ Invocation of the callback is blocking, so any
+ implementation should be light-weight.
+ Note that the callback can potentially be invoked multiple times,
+ concurrently from different threads (e.g. when multiple connections
+ are being created for the same credentials).
+
+ The associated with the callback
+ true if verification succeeded, false otherwise.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+ Client-side SSL credentials.
+
+
+
+
+ Creates client-side SSL credentials loaded from
+ disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable.
+ If that fails, gets the roots certificates from a well known place on disk.
+
+
+
+
+ Creates client-side SSL credentials from
+ a string containing PEM encoded root certificates.
+
+
+
+
+ Creates client-side SSL credentials.
+
+ string containing PEM encoded server root certificates.
+ a key certificate pair.
+
+
+
+ Creates client-side SSL credentials.
+
+ string containing PEM encoded server root certificates.
+ a key certificate pair.
+ a callback to verify peer's target name and certificate.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+ PEM encoding of the server root certificates.
+
+
+
+
+ Client side key and certificate pair.
+ If null, client will not use key and certificate pair.
+
+
+
+
+ Populates channel credentials configurator with this instance's configuration.
+ End users never need to invoke this method as it is part of internal implementation.
+
+
+
+
+ Represents RPC result, which consists of and an optional detail string.
+
+
+
+
+ Default result of a successful RPC. StatusCode=OK, empty details message.
+
+
+
+
+ Default result of a cancelled RPC. StatusCode=Cancelled, empty details message.
+
+
+
+
+ Creates a new instance of Status.
+
+ Status code.
+ Detail.
+
+
+
+ Gets the gRPC status code. OK indicates success, all other values indicate an error.
+
+
+
+
+ Gets the detail.
+
+
+
+
+ Returns a that represents the current .
+
+
+
+
+ Result of a remote procedure call.
+ Based on grpc_status_code from grpc/status.h
+
+
+
+ Not an error; returned on success.
+
+
+ The operation was cancelled (typically by the caller).
+
+
+
+ Unknown error. An example of where this error may be returned is
+ if a Status value received from another address space belongs to
+ an error-space that is not known in this address space. Also
+ errors raised by APIs that do not return enough error information
+ may be converted to this error.
+
+
+
+
+ Client specified an invalid argument. Note that this differs
+ from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments
+ that are problematic regardless of the state of the system
+ (e.g., a malformed file name).
+
+
+
+
+ Deadline expired before operation could complete. For operations
+ that change the state of the system, this error may be returned
+ even if the operation has completed successfully. For example, a
+ successful response from a server could have been delayed long
+ enough for the deadline to expire.
+
+
+
+ Some requested entity (e.g., file or directory) was not found.
+
+
+ Some entity that we attempted to create (e.g., file or directory) already exists.
+
+
+
+ The caller does not have permission to execute the specified
+ operation. PERMISSION_DENIED must not be used for rejections
+ caused by exhausting some resource (use RESOURCE_EXHAUSTED
+ instead for those errors). PERMISSION_DENIED must not be
+ used if the caller can not be identified (use UNAUTHENTICATED
+ instead for those errors).
+
+
+
+ The request does not have valid authentication credentials for the operation.
+
+
+
+ Some resource has been exhausted, perhaps a per-user quota, or
+ perhaps the entire file system is out of space.
+
+
+
+
+ Operation was rejected because the system is not in a state
+ required for the operation's execution. For example, directory
+ to be deleted may be non-empty, an rmdir operation is applied to
+ a non-directory, etc.
+
+
+
+
+ The operation was aborted, typically due to a concurrency issue
+ like sequencer check failures, transaction aborts, etc.
+
+
+
+
+ Operation was attempted past the valid range. E.g., seeking or
+ reading past end of file.
+
+
+
+ Operation is not implemented or not supported/enabled in this service.
+
+
+
+ Internal errors. Means some invariants expected by underlying
+ system has been broken. If you see one of these errors,
+ something is very broken.
+
+
+
+
+ The service is currently unavailable. This is a most likely a
+ transient condition and may be corrected by retrying with
+ a backoff. Note that it is not always safe to retry
+ non-idempotent operations.
+
+
+
+ Unrecoverable data loss or corruption.
+
+
+
+ Converts byte* pointing to an encoded byte array to a string using the provided Encoding.
+
+
+
+
+ Converts IntPtr pointing to a encoded byte array to a string using the provided Encoding.
+
+
+
+
+ Utility methods to simplify checking preconditions in the code.
+
+
+
+
+ Throws if condition is false.
+
+ The condition.
+
+
+
+ Throws with given message if condition is false.
+
+ The condition.
+ The error message.
+
+
+
+ Throws if reference is null.
+
+ The reference.
+
+
+
+ Throws if reference is null.
+
+ The reference.
+ The parameter name.
+
+
+
+ Throws if condition is false.
+
+ The condition.
+
+
+
+ Throws with given message if condition is false.
+
+ The condition.
+ The error message.
+
+
+
+ Verification context for VerifyPeerCallback.
+ Note: experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The target name of the peer.
+ The PEM encoded certificate of the peer.
+
+
+
+ The target name of the peer.
+
+
+
+
+ The PEM encoded certificate of the peer.
+
+
+
+
+ Provides info about current version of gRPC.
+ See https://codingforsmarties.wordpress.com/2016/01/21/how-to-version-assemblies-destined-for-nuget/
+ for rationale about assembly versioning.
+
+
+
+
+ Current AssemblyVersion attribute of gRPC C# assemblies
+
+
+
+
+ Current AssemblyFileVersion of gRPC C# assemblies
+
+
+
+
+ Current version of gRPC C#
+
+
+
+
+ Flags for write operations.
+
+
+
+
+ Hint that the write may be buffered and need not go out on the wire immediately.
+ gRPC is free to buffer the message until the next non-buffered
+ write, or until write stream completion, but it need not buffer completely or at all.
+
+
+
+
+ Force compression to be disabled for a particular write.
+
+
+
+
+ Options for write operations.
+
+
+
+
+ Default write options.
+
+
+
+
+ Initializes a new instance of WriteOptions class.
+
+ The write flags.
+
+
+
+ Gets the write flags.
+
+
+
+
diff --git a/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml.meta b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml.meta
new file mode 100644
index 000000000..e3814dc58
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.Api/lib/net45/Grpc.Core.Api.xml.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 0a4fb8823a783423880c9d8c9d3b5cf4
+timeCreated: 1531219386
+licenseType: Free
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core.meta b/Assets/Plugins/Grpc.Core.meta
new file mode 100644
index 000000000..47737027e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: e28eaddc034fe664591e93e8816968aa
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/lib.meta b/Assets/Plugins/Grpc.Core/lib.meta
new file mode 100644
index 000000000..0e284f0be
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 1f862d451f11a2442aeac99ad2827285
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/lib/net45.meta b/Assets/Plugins/Grpc.Core/lib/net45.meta
new file mode 100644
index 000000000..85acb0b28
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib/net45.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 89bdbe2a1282d4e40ba11e96b1481d09
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll
new file mode 100644
index 000000000..2bb2d6cc8
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:802c11dc28577e1959833ac0f2eebd263cf4ca469d10948154dfe85e39913d45
+size 464384
diff --git a/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll.meta b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll.meta
new file mode 100644
index 000000000..f22a7c4c3
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.dll.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 63fdcd70d29d1dc49b4e61e22a9e96e1
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml
new file mode 100644
index 000000000..9e61bdbba
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml
@@ -0,0 +1,2183 @@
+
+
+
+ Grpc.Core
+
+
+
+
+ Details about a client-side call to be invoked.
+
+ Request message type for the call.
+ Response message type for the call.
+
+
+
+ Initializes a new instance of the struct.
+
+ Channel to use for this call.
+ Method to call.
+ Call options.
+
+
+
+ Initializes a new instance of the struct.
+
+ Channel to use for this call.
+ Method to call.
+ Host that contains the method. if null, default host will be used.
+ Call options.
+
+
+
+ Initializes a new instance of the struct.
+
+ Channel to use for this call.
+ Qualified method name.
+ Host that contains the method.
+ Request marshaller.
+ Response marshaller.
+ Call options.
+
+
+
+ Get channel associated with this call.
+
+
+
+
+ Gets name of method to be called.
+
+
+
+
+ Get name of host.
+
+
+
+
+ Gets marshaller used to serialize requests.
+
+
+
+
+ Gets marshaller used to deserialized responses.
+
+
+
+
+ Gets the call options.
+
+
+
+
+ Returns new instance of with
+ Options set to the value provided. Values of all other fields are preserved.
+
+
+
+
+ Helper methods for generated clients to make RPC calls.
+ Most users will use this class only indirectly and will be
+ making calls using client object generated from protocol
+ buffer definition files.
+
+
+
+
+ Invokes a simple remote call in a blocking fashion.
+
+ The response.
+ The call definition.
+ Request message.
+ Type of request message.
+ The of response message.
+
+
+
+ Invokes a simple remote call asynchronously.
+
+ An awaitable call object providing access to the response.
+ The call definition.
+ Request message.
+ Type of request message.
+ The of response message.
+
+
+
+ Invokes a server streaming call asynchronously.
+ In server streaming scenario, client sends on request and server responds with a stream of responses.
+
+ A call object providing access to the asynchronous response stream.
+ The call definition.
+ Request message.
+ Type of request message.
+ The of response messages.
+
+
+
+ Invokes a client streaming call asynchronously.
+ In client streaming scenario, client sends a stream of requests and server responds with a single response.
+
+ The call definition.
+ An awaitable call object providing access to the response.
+ Type of request messages.
+ The of response message.
+
+
+
+ Invokes a duplex streaming call asynchronously.
+ In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses.
+ The response stream is completely independent and both side can be sending messages at the same time.
+
+ A call object providing access to the asynchronous request and response streams.
+ The call definition.
+ Type of request messages.
+ Type of responsemessages.
+
+
+
+ Represents a gRPC channel. Channels are an abstraction of long-lived connections to remote servers.
+ More client objects can reuse the same channel. Creating a channel is an expensive operation compared to invoking
+ a remote call so in general you should reuse a single channel for as many calls as possible.
+
+
+
+
+ Creates a channel that connects to a specific host.
+ Port will default to 80 for an unsecure channel and to 443 for a secure channel.
+
+ Target of the channel.
+ Credentials to secure the channel.
+
+
+
+ Creates a channel that connects to a specific host.
+ Port will default to 80 for an unsecure channel or to 443 for a secure channel.
+
+ Target of the channel.
+ Credentials to secure the channel.
+ Channel options.
+
+
+
+ Creates a channel that connects to a specific host and port.
+
+ The name or IP address of the host.
+ The port.
+ Credentials to secure the channel.
+
+
+
+ Creates a channel that connects to a specific host and port.
+
+ The name or IP address of the host.
+ The port.
+ Credentials to secure the channel.
+ Channel options.
+
+
+
+ Gets current connectivity state of this channel.
+ After channel has been shutdown, ChannelState.Shutdown will be returned.
+
+
+
+
+ Returned tasks completes once channel state has become different from
+ given lastObservedState.
+ If deadline is reached or an error occurs, returned task is cancelled.
+
+
+
+
+ Returned tasks completes once channel state has become different from
+ given lastObservedState (true is returned) or if the wait has timed out (false is returned).
+
+
+
+ Resolved address of the remote endpoint in URI format.
+
+
+
+ Returns a token that gets cancelled once ShutdownAsync is invoked.
+
+
+
+
+ Allows explicitly requesting channel to connect without starting an RPC.
+ Returned task completes once state Ready was seen. If the deadline is reached,
+ or channel enters the Shutdown state, the task is cancelled.
+ There is no need to call this explicitly unless your use case requires that.
+ Starting an RPC on a new channel will request connection implicitly.
+
+ The deadline. null indicates no deadline.
+
+
+
+ Shuts down the channel cleanly. It is strongly recommended to shutdown
+ all previously created channels before exiting from the process.
+
+
+ This method doesn't wait for all calls on this channel to finish (nor does
+ it explicitly cancel all outstanding calls). It is user's responsibility to make sure
+ all the calls on this channel have finished (successfully or with an error)
+ before shutting down the channel to ensure channel shutdown won't impact
+ the outcome of those remote calls.
+
+
+
+
+ Create a new for the channel.
+
+ A new .
+
+
+
+ Channel option specified when creating a channel.
+ Corresponds to grpc_channel_args from grpc/grpc.h.
+ Commonly used channel option names are defined in ChannelOptions,
+ but any of the GRPC_ARG_* channel options names defined in grpc_types.h can be used.
+
+
+
+
+ Type of ChannelOption.
+
+
+
+
+ Channel option with integer value.
+
+
+
+
+ Channel option with string value.
+
+
+
+
+ Creates a channel option with a string value.
+
+ Name.
+ String value.
+
+
+
+ Creates a channel option with an integer value.
+
+ Name.
+ Integer value.
+
+
+
+ Gets the type of the ChannelOption.
+
+
+
+
+ Gets the name of the ChannelOption.
+
+
+
+
+ Gets the integer value the ChannelOption.
+
+
+
+
+ Gets the string value the ChannelOption.
+
+
+
+
+ Determines whether the specified object is equal to the current object.
+
+
+
+
+ Determines whether the specified object is equal to the current object.
+
+
+
+
+ A hash code for the current object.
+
+
+
+
+ Equality operator.
+
+
+
+
+ Inequality operator.
+
+
+
+
+ Defines names of most commonly used channel options.
+ Other supported options names can be found in grpc_types.h (GRPC_ARG_* definitions)
+
+
+
+ Override SSL target check. Only to be used for testing.
+
+
+ Enable census for tracing and stats collection
+
+
+ Maximum number of concurrent incoming streams to allow on a http2 connection
+
+
+ Maximum message length that the channel can receive
+
+
+ Maximum message length that the channel can send
+
+
+ Obsolete, for backward compatibility only.
+
+
+ Initial sequence number for http2 transports
+
+
+ Default authority for calls.
+
+
+ Primary user agent: goes at the start of the user-agent metadata
+
+
+ Secondary user agent: goes at the end of the user-agent metadata
+
+
+ If non-zero, allow the use of SO_REUSEPORT for server if it's available (default 1)
+
+
+
+ Creates native object for a collection of channel options.
+
+ The native channel arguments.
+
+
+
+ Connectivity state of a channel.
+ Based on grpc_connectivity_state from grpc/grpc.h
+
+
+
+
+ Channel is idle
+
+
+
+
+ Channel is connecting
+
+
+
+
+ Channel is ready for work
+
+
+
+
+ Channel has seen a failure but expects to recover
+
+
+
+
+ Channel has seen a failure that it cannot recover from
+
+
+
+
+ Compression level based on grpc_compression_level from grpc/compression.h
+
+
+
+
+ No compression.
+
+
+
+
+ Low compression.
+
+
+
+
+ Medium compression.
+
+
+
+
+ High compression.
+
+
+
+
+ Invokes client RPCs using .
+
+
+
+
+ Initializes a new instance of the class.
+
+ Channel to use.
+
+
+
+ Invokes a simple remote call in a blocking fashion.
+
+
+
+
+ Invokes a simple remote call asynchronously.
+
+
+
+
+ Invokes a server streaming call asynchronously.
+ In server streaming scenario, client sends on request and server responds with a stream of responses.
+
+
+
+
+ Invokes a client streaming call asynchronously.
+ In client streaming scenario, client sends a stream of requests and server responds with a single response.
+
+
+
+
+ Invokes a duplex streaming call asynchronously.
+ In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses.
+ The response stream is completely independent and both side can be sending messages at the same time.
+
+
+
+ Creates call invocation details for given method.
+
+
+
+ Encapsulates initialization and shutdown of gRPC library.
+
+
+
+
+ Returns a reference-counted instance of initialized gRPC environment.
+ Subsequent invocations return the same instance unless reference count has dropped to zero previously.
+
+
+
+
+ Decrements the reference count for currently active environment and asynchronously shuts down the gRPC environment if reference count drops to zero.
+
+
+
+
+ Requests shutdown of all channels created by the current process.
+
+
+
+
+ Requests immediate shutdown of all servers created by the current process.
+
+
+
+
+ Gets application-wide logger used by gRPC.
+
+ The logger.
+
+
+
+ Sets the application-wide logger that should be used by gRPC.
+
+
+
+
+ Sets the number of threads in the gRPC thread pool that polls for internal RPC events.
+ Can be only invoked before the GrpcEnviroment is started and cannot be changed afterwards.
+ Setting thread pool size is an advanced setting and you should only use it if you know what you are doing.
+ Most users should rely on the default value provided by gRPC library.
+ Note: this method is part of an experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Sets the number of completion queues in the gRPC thread pool that polls for internal RPC events.
+ Can be only invoked before the GrpcEnviroment is started and cannot be changed afterwards.
+ Setting the number of completions queues is an advanced setting and you should only use it if you know what you are doing.
+ Most users should rely on the default value provided by gRPC library.
+ Note: this method is part of an experimental API that can change or be removed without any prior notice.
+
+
+
+
+ By default, gRPC's internal event handlers get offloaded to .NET default thread pool thread (inlineHandlers=false).
+ Setting inlineHandlers to true will allow scheduling the event handlers directly to
+ GrpcThreadPool internal threads. That can lead to significant performance gains in some situations,
+ but requires user to never block in async code (incorrectly written code can easily lead to deadlocks).
+ Inlining handlers is an advanced setting and you should only use it if you know what you are doing.
+ Most users should rely on the default value provided by gRPC library.
+ Note: this method is part of an experimental API that can change or be removed without any prior notice.
+ Note: inlineHandlers=true was the default in gRPC C# v1.4.x and earlier.
+
+
+
+
+ Sets the parameters for a pool that caches batch context instances. Reusing batch context instances
+ instead of creating a new one for every C core operation helps reducing the GC pressure.
+ Can be only invoked before the GrpcEnviroment is started and cannot be changed afterwards.
+ This is an advanced setting and you should only use it if you know what you are doing.
+ Most users should rely on the default value provided by gRPC library.
+ Note: this method is part of an experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Sets the parameters for a pool that caches request call context instances. Reusing request call context instances
+ instead of creating a new one for every requested call in C core helps reducing the GC pressure.
+ Can be only invoked before the GrpcEnviroment is started and cannot be changed afterwards.
+ This is an advanced setting and you should only use it if you know what you are doing.
+ Most users should rely on the default value provided by gRPC library.
+ Note: this method is part of an experimental API that can change or be removed without any prior notice.
+
+
+
+
+ Occurs when GrpcEnvironment is about the start the shutdown logic.
+ If GrpcEnvironment is later initialized and shutdown, the event will be fired again (unless unregistered first).
+
+
+
+
+ Creates gRPC environment.
+
+
+
+
+ Gets the completion queues used by this gRPC environment.
+
+
+
+
+ Picks a completion queue in a round-robin fashion.
+ Shouldn't be invoked on a per-call basis (used at per-channel basis).
+
+
+
+
+ Gets the completion queue used by this gRPC environment.
+
+
+
+
+ Gets version of gRPC C core.
+
+
+
+
+ Shuts down this environment.
+
+
+
+
+ Handler for AppDomain.DomainUnload, AppDomain.ProcessExit and AssemblyLoadContext.Unloading hooks.
+
+
+
+
+ Extends the ServerServiceDefinition class to add methods used to register interceptors on the server side.
+
+
+
+
+ Returns a instance that
+ intercepts incoming calls to the underlying service handler through the given interceptor.
+
+ The instance to register interceptors on.
+ The interceptor to intercept the incoming invocations with.
+
+ Multiple interceptors can be added on top of each other by calling
+ "serverServiceDefinition.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted service definition, effectively
+ building a chain like "serverServiceDefinition.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Returns a instance that
+ intercepts incoming calls to the underlying service handler through the given interceptors.
+
+ The instance to register interceptors on.
+
+ An array of interceptors to intercept the incoming invocations with.
+ Control is passed to the interceptors in the order specified.
+
+
+ Multiple interceptors can be added on top of each other by calling
+ "serverServiceDefinition.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c".
+ Interceptors can be later added to an existing intercepted service definition, effectively
+ building a chain like "serverServiceDefinition.Intercept(c).Intercept(b).Intercept(a)". Note that
+ in this case, the last interceptor added will be the first to take control.
+
+
+
+
+ Helper for creating ServerServiceDefinition with intercepted handlers.
+
+
+
+
+ Manages client side native call lifecycle.
+
+
+
+
+ This constructor should only be used for testing.
+
+
+
+
+ Blocking unary request - unary response call.
+
+
+
+
+ Starts a unary request - unary response call.
+
+
+
+
+ Starts a streamed request - unary response call.
+ Use StartSendMessage and StartSendCloseFromClient to stream requests.
+
+
+
+
+ Starts a unary request - streamed response call.
+
+
+
+
+ Starts a streaming request - streaming response call.
+ Use StartSendMessage and StartSendCloseFromClient to stream requests.
+
+
+
+
+ Sends a streaming request. Only one pending send action is allowed at any given time.
+
+
+
+
+ Receives a streaming response. Only one pending read action is allowed at any given time.
+
+
+
+
+ Sends halfclose, indicating client is done with streaming requests.
+ Only one pending send action is allowed at any given time.
+
+
+
+
+ Get the task that completes once if streaming response call finishes with ok status and throws RpcException with given status otherwise.
+
+
+
+
+ Get the task that completes once response headers are received.
+
+
+
+
+ Gets the resulting status if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets the trailing metadata if the call has already finished.
+ Throws InvalidOperationException otherwise.
+
+
+
+
+ Gets WriteFlags set in callDetails.Options.WriteOptions
+
+
+
+
+ Handles receive status completion for calls with streaming response.
+
+
+
+
+ Handler for unary response completion.
+
+
+
+
+ Handles receive status completion for calls with streaming response.
+
+
+
+
+ Base for handling both client side and server side calls.
+ Manages native call lifecycle and provides convenience methods.
+
+
+
+
+ Requests cancelling the call.
+
+
+
+
+ Requests cancelling the call with given status.
+
+
+
+
+ Initiates sending a message. Only one send operation can be active at a time.
+
+
+
+
+ Initiates reading a message. Only one read operation can be active at a time.
+
+
+
+
+ If there are no more pending actions and no new actions can be started, releases
+ the underlying native resources.
+
+
+
+
+ Returns an exception to throw for a failed send operation.
+ It is only allowed to call this method for a call that has already finished.
+
+
+
+
+ Checks if sending is allowed and possibly returns a Task that allows short-circuiting the send
+ logic by directly returning the write operation result task. Normally, null is returned.
+
+
+
+
+ Handles send completion (including SendCloseFromClient).
+
+
+
+
+ Handles send status from server completion.
+
+
+
+
+ Handles streaming read completion.
+
+
+
+
+ Manages server side native call lifecycle.
+
+
+
+
+ Only for testing purposes.
+
+
+
+
+ Starts a server side call.
+
+
+
+
+ Sends a streaming response. Only one pending send action is allowed at any given time.
+
+
+
+
+ Receives a streaming request. Only one pending read action is allowed at any given time.
+
+
+
+
+ Initiates sending a initial metadata.
+ Even though C-core allows sending metadata in parallel to sending messages, we will treat sending metadata as a send message operation
+ to make things simpler.
+
+
+
+
+ Sends call result status, indicating we are done with writes.
+ Sending a status different from StatusCode.OK will also implicitly cancel the call.
+
+
+
+
+ Gets cancellation token that gets cancelled once close completion
+ is received and the cancelled flag is set.
+
+
+
+
+ Handles the server side close completion.
+
+
+
+
+ grpc_auth_context
+
+
+
+
+ Copies contents of the native auth context into a new AuthContext instance.
+
+
+
+
+ grpc_auth_property
+
+
+
+
+ grpc_auth_property_iterator
+
+
+
+
+ grpcsharp_batch_context
+
+
+
+
+ grpc_call_credentials from grpc/grpc_security.h
+
+
+
+
+ grpc_call_error from grpc/grpc.h
+
+
+
+
+ Checks the call API invocation's result is OK.
+
+
+
+
+ Returns a new instance of with
+ all previously unset values set to their defaults and deadline and cancellation
+ token propagated when appropriate.
+
+
+
+
+ grpc_call from grpc/grpc.h
+
+
+
+
+ Only for testing.
+
+
+
+
+ grpc_channel_args from grpc/grpc.h
+
+
+
+
+ grpc_channel_credentials from grpc/grpc_security.h
+
+
+
+
+ grpc_channel from grpc/grpc.h
+
+
+
+
+ Writes requests asynchronously to an underlying AsyncCall object.
+
+
+
+
+ Status + metadata received on client side when call finishes.
+ (when receive_status_on_client operation finishes).
+
+
+
+
+ gpr_clock_type from grpc/support/time.h
+
+
+
+
+ grpc_event from grpc/grpc.h
+
+
+
+
+ grpc_completion_type from grpc/grpc.h
+
+
+
+
+ grpc_completion_queue from grpc/grpc.h
+
+
+
+
+ Create a completion queue that can only be used for Pluck operations.
+
+
+
+
+ Create a completion queue that can only be used for Next operations.
+
+
+
+
+ Creates a new usage scope for this completion queue. Once successfully created,
+ the completion queue won't be shutdown before scope.Dispose() is called.
+
+
+
+
+ Completion registry associated with this completion queue.
+ Doesn't need to be set if only using Pluck() operations.
+
+
+
+
+ For testing purposes only. NOT threadsafe.
+
+
+
+
+ IntPtr doesn't implement IEquatable{IntPtr} so we need to use custom comparer to avoid boxing.
+
+
+
+
+ Context propagation flags from grpc/grpc.h.
+
+
+
+
+ Implementation of ContextPropagationToken that carries
+ all fields needed for context propagation by C-core based implementation of gRPC.
+ Instances of ContextPropagationToken that are not of this
+ type will be recognized as "foreign" and will be silently ignored
+ (treated as if null).
+
+
+
+
+ Default propagation mask used by C core.
+
+
+
+
+ Default propagation mask used by C# - we want to propagate deadline
+ and cancellation token by our own means, everything else will be propagated
+ by C core automatically (according to DefaultCoreMask).
+
+
+
+
+ Gets the native handle of the parent call.
+
+
+
+
+ Gets the parent call's deadline.
+
+
+
+
+ Gets the parent call's cancellation token.
+
+
+
+
+ Get the context propagation options.
+
+
+
+
+ Converts given ContextPropagationToken to ContextPropagationTokenImpl
+ if possible or returns null.
+ Being able to convert means that the context propagation token is recognized as
+ "ours" (was created by this implementation).
+
+
+
+
+ Owned char* object.
+
+
+
+
+ Checks the debug stats and take action for any inconsistency found.
+
+
+
+
+ Creates native call credential objects from instances of CallCredentials.
+
+
+
+
+ Creates native object for the credentials.
+
+ The native credentials.
+
+
+
+ Creates native call credential objects from instances of ChannelCredentials.
+
+
+
+
+ Creates native object for the credentials.
+
+ The native credentials.
+
+
+
+ Pool of objects that combines a shared pool and a thread local pool.
+
+
+
+
+ Initializes a new instance of DefaultObjectPool with given shared capacity and thread local capacity.
+ Thread local capacity should be significantly smaller than the shared capacity as we don't guarantee immediately
+ disposing the objects in the thread local pool after this pool is disposed (they will eventually be garbage collected
+ after the thread that owns them has finished).
+ On average, the shared pool will only be accessed approx. once for every threadLocalCapacity / 2 rent or lease
+ operations.
+
+
+
+
+ Leases an item from the pool or creates a new instance if the pool is empty.
+ Attempts to retrieve the item from the thread local pool first.
+ If the thread local pool is empty, the item is taken from the shared pool
+ along with more items that are moved to the thread local pool to avoid
+ prevent acquiring the lock for shared pool too often.
+ The methods should not be called after the pool is disposed, but it won't
+ results in an error to do so (after depleting the items potentially left
+ in the thread local pool, it will continue returning new objects created by the factory).
+
+
+
+
+ Returns an item to the pool.
+ Attempts to add the item to the thread local pool first.
+ If the thread local pool is full, item is added to a shared pool,
+ along with half of the items for the thread local pool, which
+ should prevent acquiring the lock for shared pool too often.
+ If called after the pool is disposed, we make best effort not to
+ add anything to the thread local pool and we guarantee not to add
+ anything to the shared pool (items will be disposed instead).
+
+
+
+
+ Expose serializer as buffer writer
+
+
+
+
+ Complete the payload written so far.
+
+
+
+
+ Overrides the content of default SSL roots.
+
+
+
+
+ Overrides C core's default roots with roots.pem loaded as embedded resource.
+
+
+
+
+ Pool of threads polling on a set of completions queues.
+
+
+
+
+ Creates a thread pool threads polling on a set of completions queues.
+
+ Environment.
+ Pool size.
+ Completion queue count.
+ Handler inlining.
+
+
+
+ Returns true if there is at least one thread pool thread that hasn't
+ already stopped.
+ Threads can either stop because all completion queues shut down or
+ because all foreground threads have already shutdown and process is
+ going to exit.
+
+
+
+
+ Body of the polling thread.
+
+
+
+
+ Abstraction of a native call object.
+
+
+
+
+ Pool of objects.
+
+
+
+
+ An object that can be pooled in IObjectPool.
+
+
+
+
+
+ Set the action that will be invoked to return a leased object to the pool.
+
+
+
+
+ Exposes non-generic members of ServerReponseStream.
+
+
+
+
+ Asynchronously sends response headers for the current call to the client. See ServerCallContext.WriteResponseHeadersAsync for exact semantics.
+
+
+
+
+ Gets or sets the write options.
+
+
+
+
+ Useful methods for native/managed marshalling.
+
+
+
+
+ Converts IntPtr pointing to a UTF-8 encoded byte array to string.
+
+
+
+
+ UTF-8 encodes the given string into a buffer of sufficient size
+
+
+
+
+ Returns the maximum number of bytes required to encode a given string.
+
+
+
+
+ Returns the actual number of bytes required to encode a given string.
+
+
+
+
+ grpc_metadata_array from grpc/grpc.h
+
+
+
+
+ Reads metadata from pointer to grpc_metadata_array
+
+
+
+
+ Use this attribute to mark methods that will be called back from P/Invoke calls.
+ iOS (and probably other AOT platforms) needs to have delegates registered.
+ Instead of depending on Xamarin.iOS for this, we can just create our own,
+ the iOS runtime just checks for the type name.
+ See: https://docs.microsoft.com/en-gb/xamarin/ios/internals/limitations#reverse-callbacks
+
+
+
+
+ Takes care of loading C# native extension and provides access to PInvoke calls the library exports.
+
+
+
+
+ Gets singleton instance of this class.
+ The native extension is loaded when called for the first time.
+
+
+
+
+ Provides access to the exported native methods.
+
+
+
+
+ Detects which configuration of native extension to load and load it.
+
+
+
+
+ Loads native extension and return native methods delegates.
+
+
+
+
+ Return native method delegates when running on Unity platform.
+ Unity does not use standard NuGet packages and the native library is treated
+ there as a "native plugin" which is (provided it has the right metadata)
+ automatically made available to [DllImport] loading logic.
+ WARNING: Unity support is experimental and work-in-progress. Don't expect it to work.
+
+
+
+
+ Return native method delegates when running on the Xamarin platform.
+ WARNING: Xamarin support is experimental and work-in-progress. Don't expect it to work.
+
+
+
+
+ Logs from gRPC C core library can get lost if your application is not a console app.
+ This class allows redirection of logs to gRPC logger.
+
+
+
+
+ Redirects logs from native gRPC C core library to a general logger.
+
+
+
+
+ Provides access to all native methods provided by NativeExtension.
+ An extra level of indirection is added to P/Invoke calls to allow intelligent loading
+ of the right configuration of the native extension based on current platform, architecture etc.
+
+
+
+
+ Gets singleton instance of this class.
+
+
+
+
+ Delegate types for all published native methods. Declared under inner class to prevent scope pollution.
+
+
+
+
+ grpc_csharp_ext used as a static library (e.g Unity iOS).
+
+
+
+
+ grpc_csharp_ext used a shared library (e.g on Unity Standalone and Android).
+
+
+
+
+ Utility methods for detecting platform and architecture.
+
+
+
+
+ true if running on Unity platform.
+
+
+
+
+ true if running on Unity iOS, false otherwise.
+
+
+
+
+ true if running on a Xamarin platform (either Xamarin.Android or Xamarin.iOS),
+ false otherwise.
+
+
+
+
+ true if running on Xamarin.iOS, false otherwise.
+
+
+
+
+ true if running on Xamarin.Android, false otherwise.
+
+
+
+
+ true if running on .NET Core (CoreCLR), false otherwise.
+
+
+
+
+ Returns UnityEngine.Application.platform as a string.
+ See https://docs.unity3d.com/ScriptReference/Application-platform.html for possible values.
+ Value is obtained via reflection to avoid compile-time dependency on Unity.
+ This method should only be called if IsUnity is true.
+
+
+
+
+ grpcsharp_request_call_context
+
+
+
+
+ Safe handle to wrap native objects.
+
+
+
+
+ Handler used for unimplemented method.
+
+
+
+
+ grpc_server_credentials from grpc/grpc_security.h
+
+
+
+
+ Writes responses asynchronously to an underlying AsyncCallServer object.
+
+
+
+
+ Details of a newly received RPC.
+
+
+
+
+ grpc_server from grpc/grpc.h
+
+
+
+
+ Maps methods from ServerServiceDefinition to server call handlers.
+
+
+
+
+ Helper for converting ServerServiceDefinition to server call handlers.
+
+
+
+
+ Slice of native memory.
+ Rough equivalent of grpc_slice (but doesn't support inlined slices, just a pointer to data and length)
+
+
+
+
+ Returns a that represents the current .
+
+
+
+
+ Represents grpc_slice_buffer with some extra utility functions to allow
+ writing data to it using the IBufferWriter interface.
+
+
+
+
+ gpr_timespec from grpc/support/time.h
+
+
+
+
+ Indicates whether this instance and a specified object are equal.
+
+
+
+
+ Returns the hash code for this instance.
+
+
+
+
+ Returns the full type name of this instance.
+
+
+
+
+ Indicates whether this instance and a specified object are equal.
+
+
+
+
+ Timespec a long time in the future.
+
+
+
+
+ Timespec a long time in the past.
+
+
+
+
+ Return Timespec representing the current time.
+
+
+
+
+ Seconds since unix epoch.
+
+
+
+
+ The nanoseconds part of timeval.
+
+
+
+
+ Converts the timespec to desired clock type.
+
+
+
+
+ Converts Timespec to DateTime.
+ Timespec needs to be of type GPRClockType.Realtime and needs to represent a legal value.
+ DateTime has lower resolution (100ns), so rounding can occurs.
+ Value are always rounded up to the nearest DateTime value in the future.
+
+ For Timespec.InfFuture or if timespec is after the largest representable DateTime, DateTime.MaxValue is returned.
+ For Timespec.InfPast or if timespec is before the lowest representable DateTime, DateTime.MinValue is returned.
+
+ Unless DateTime.MaxValue or DateTime.MinValue is returned, the resulting DateTime is always in UTC
+ (DateTimeKind.Utc)
+
+
+
+
+ Creates DateTime to Timespec.
+ DateTime has to be in UTC (DateTimeKind.Utc) unless it's DateTime.MaxValue or DateTime.MinValue.
+ For DateTime.MaxValue of date time after the largest representable Timespec, Timespec.InfFuture is returned.
+ For DateTime.MinValue of date time before the lowest representable Timespec, Timespec.InfPast is returned.
+
+ The date time.
+ Date time.
+
+
+
+ Gets current timestamp using GPRClockType.Precise.
+ Only available internally because core needs to be compiled with
+ GRPC_TIMERS_RDTSC support for this to use RDTSC.
+
+
+
+
+ Call invoker that throws NotImplementedException for all requests.
+
+
+
+
+ Represents a dynamically loaded unmanaged library in a (partially) platform independent manner.
+ First, the native library is loaded using dlopen (on Unix systems) or using LoadLibrary (on Windows).
+ dlsym or GetProcAddress are then used to obtain symbol addresses. Marshal.GetDelegateForFunctionPointer
+ transforms the addresses into delegates to native methods.
+ See http://stackoverflow.com/questions/13461989/p-invoke-to-dynamically-loaded-library-on-mono.
+
+
+
+
+ Loads symbol in a platform specific way.
+
+
+
+
+
+
+ Loads library in a platform specific way.
+
+
+
+
+ On Linux systems, using using dlopen and dlsym results in
+ DllNotFoundException("libdl.so not found") if libc6-dev
+ is not installed. As a workaround, we load symbols for
+ dlopen and dlsym from the current process as on Linux
+ Mono sure is linked against these symbols.
+
+
+
+
+ Similarly as for Mono on Linux, we load symbols for
+ dlopen and dlsym from the "libcoreclr.so",
+ to avoid the dependency on libc-dev Linux.
+
+
+
+
+ Utility type for identifying "well-known" strings (i.e. headers/keys etc that
+ we expect to see frequently, and don't want to allocate lots of copies of)
+
+
+
+
+ Test whether the provided byte sequence is recognized as a well-known string; if
+ so, return a shared instance of that string; otherwise, return null
+
+
+
+
+ Test whether the provided byte sequence is recognized as a well-known string; if
+ so, return a shared instance of that string; otherwise, return null
+
+
+
+
+ Default implementation of ServerCallContext.
+
+
+
+
+ Creates a new instance of ServerCallContext.
+ To allow reuse of ServerCallContext API by different gRPC implementations, the implementation of some members is provided externally.
+ To provide state, this ServerCallContext instance and extraData will be passed to the member implementations.
+
+
+
+ Logger that logs to System.Console.
+
+
+ Creates a console logger not associated to any specific type.
+
+
+ Creates a console logger that logs messsage specific for given type.
+
+
+
+ Returns a logger associated with the specified type.
+
+
+
+ For logging messages.
+
+
+ Returns a logger associated with the specified type.
+
+
+ Logs a message with severity Debug.
+
+
+ Logs a formatted message with severity Debug.
+
+
+ Logs a message with severity Info.
+
+
+ Logs a formatted message with severity Info.
+
+
+ Logs a message with severity Warning.
+
+
+ Logs a formatted message with severity Warning.
+
+
+ Logs a message and an associated exception with severity Warning.
+
+
+ Logs a message with severity Error.
+
+
+ Logs a formatted message with severity Error.
+
+
+ Logs a message and an associated exception with severity Error.
+
+
+ Standard logging levels.
+
+
+
+ Debug severity.
+
+
+
+
+ Info severity.
+
+
+
+
+ Warning severity.
+
+
+
+
+ Error severity.
+
+
+
+
+ Logging is off.
+
+
+
+ Logger that filters out messages below certain log level.
+
+
+
+ Creates and instance of LogLevelFilter.
+
+
+
+
+ Creates and instance of LogLevelFilter.
+ The fromEnvironmentVariable parameter allows looking up "GRPC_VERBOSITY" setting provided by C-core
+ and uses the same log level for C# logs. Using this setting is recommended as it can prevent unintentionally hiding
+ C core logs requested by "GRPC_VERBOSITY" environment variable (which could happen if C# logger's log level was set to a more restrictive value).
+
+ the logger to forward filtered logs to.
+ the default log level, unless overriden by env variable.
+ if true, override log level with setting from environment variable.
+
+
+
+ Returns a logger associated with the specified type.
+
+
+
+ Logs a message with severity Debug.
+
+
+ Logs a formatted message with severity Debug.
+
+
+ Logs a message with severity Info.
+
+
+ Logs a formatted message with severity Info.
+
+
+ Logs a message with severity Warning.
+
+
+ Logs a formatted message with severity Warning.
+
+
+ Logs a message and an associated exception with severity Warning.
+
+
+ Logs a message with severity Error.
+
+
+ Logs a formatted message with severity Error.
+
+
+ Logs a message and an associated exception with severity Error.
+
+
+ Get log level based on a default and lookup of GRPC_VERBOSITY environment variable.
+
+
+
+ Logger which doesn't log any information anywhere.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ Returns a reference to the instance on which the method is called, as
+ instances aren't associated with specific types.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+
+ As with all logging calls on this logger, this method is a no-op.
+
+
+
+ Logger that logs to an arbitrary System.IO.TextWriter.
+
+
+
+ Creates a console logger not associated to any specific type and writes to given System.IO.TextWriter.
+ User is responsible for providing an instance of TextWriter that is thread-safe.
+
+
+
+
+ Creates a console logger not associated to any specific type and writes to a System.IO.TextWriter obtained from given provider.
+ User is responsible for providing an instance of TextWriter that is thread-safe.
+
+
+
+ Creates a console logger that logs messsage specific for given type.
+
+
+
+ Returns a logger associated with the specified type.
+
+
+
+ Logs a message with severity Debug.
+
+
+ Logs a formatted message with severity Debug.
+
+
+ Logs a message with severity Info.
+
+
+ Logs a formatted message with severity Info.
+
+
+ Logs a message with severity Warning.
+
+
+ Logs a formatted message with severity Warning.
+
+
+ Logs a message and an associated exception with severity Warning.
+
+
+ Logs a message with severity Error.
+
+
+ Logs a formatted message with severity Error.
+
+
+ Logs a message and an associated exception with severity Error.
+
+
+ Gets the type associated with this logger.
+
+
+
+ gRPC server. A single server can serve an arbitrary number of services and can listen on more than one port.
+
+
+
+
+ Creates a new server.
+
+
+
+
+ Creates a new server.
+
+ Channel options.
+
+
+
+ Services that will be exported by the server once started. Register a service with this
+ server by adding its definition to this collection.
+
+
+
+
+ Ports on which the server will listen once started. Register a port with this
+ server by adding its definition to this collection.
+
+
+
+
+ To allow awaiting termination of the server.
+
+
+
+
+ Experimental API. Might anytime change without prior notice.
+ Number or calls requested via grpc_server_request_call at any given time for each completion queue.
+
+
+
+
+ Starts the server.
+ Throws IOException if not successful.
+
+
+
+
+ Requests server shutdown and when there are no more calls being serviced,
+ cleans up used resources. The returned task finishes when shutdown procedure
+ is complete.
+
+
+ It is strongly recommended to shutdown all previously created servers before exiting from the process.
+
+
+
+
+ Requests server shutdown while cancelling all the in-progress calls.
+ The returned task finishes when shutdown procedure is complete.
+
+
+ It is strongly recommended to shutdown all previously created servers before exiting from the process.
+
+
+
+
+ Shuts down the server.
+
+
+
+
+ In case the environment's threadpool becomes dead, the shutdown completion will
+ never be delivered, but we need to release the environment's handle anyway.
+
+
+
+
+ Adds a service definition.
+
+
+
+
+ Adds a listening port.
+
+
+
+
+ Allows one new RPC call to be received by server.
+
+
+
+
+ Checks that all ports have been bound successfully.
+
+
+
+
+ Selects corresponding handler for given call and handles the call.
+
+
+
+
+ Handles the native callback.
+
+
+
+
+ Handles native callback.
+
+
+
+
+ Collection of service definitions.
+
+
+
+
+ Adds a service definition to the server. This is how you register
+ handlers for a service with the server. Only call this before Start().
+
+
+
+
+ Gets enumerator for this collection.
+
+
+
+
+ Collection of server ports.
+
+
+
+
+ Adds a new port on which server should listen.
+ Only call this before Start().
+ The port on which server will be listening.
+
+
+
+
+ Adds a new port on which server should listen.
+ The port on which server will be listening.
+
+ the host
+ the port. If zero, an unused port is chosen automatically.
+ credentials to use to secure this port.
+
+
+
+ Gets enumerator for this collection.
+
+
+
+
+ Server side credentials.
+
+
+
+
+ Returns instance of credential that provides no security and
+ will result in creating an unsecure server port with no encryption whatsoever.
+
+
+
+
+ Creates native object for the credentials.
+
+ The native credentials.
+
+
+
+ Modes of requesting client's SSL certificate by the server.
+ Corresponds to grpc_ssl_client_certificate_request_type.
+
+
+
+
+ Server does not request client certificate.
+ The certificate presented by the client is not checked by the server at
+ all. (A client may present a self signed or signed certificate or not
+ present a certificate at all and any of those option would be accepted)
+
+
+
+
+ Server requests client certificate but does not enforce that the client
+ presents a certificate.
+ If the client presents a certificate, the client authentication is left to
+ the application (the necessary metadata will be available to the
+ application via authentication context properties, see grpc_auth_context).
+ The client's key certificate pair must be valid for the SSL connection to
+ be established.
+
+
+
+
+ Server requests client certificate but does not enforce that the client
+ presents a certificate.
+ If the client presents a certificate, the client authentication is done by
+ the gRPC framework. (For a successful connection the client needs to either
+ present a certificate that can be verified against the root certificate
+ configured by the server or not present a certificate at all)
+ The client's key certificate pair must be valid for the SSL connection to
+ be established.
+
+
+
+
+ Server requests client certificate and enforces that the client presents a
+ certificate.
+ If the client presents a certificate, the client authentication is left to
+ the application (the necessary metadata will be available to the
+ application via authentication context properties, see grpc_auth_context).
+ The client's key certificate pair must be valid for the SSL connection to
+ be established.
+
+
+
+
+ Server requests client certificate and enforces that the client presents a
+ certificate.
+ The certificate presented by the client is verified by the gRPC framework.
+ (For a successful connection the client needs to present a certificate that
+ can be verified against the root certificate configured by the server)
+ The client's key certificate pair must be valid for the SSL connection to
+ be established.
+
+
+
+
+ Server-side SSL credentials.
+
+
+
+
+ Creates server-side SSL credentials.
+
+ Key-certificates to use.
+ PEM encoded client root certificates used to authenticate client.
+ Deprecated, use clientCertificateRequest overload instead.
+
+
+
+ Creates server-side SSL credentials.
+
+ Key-certificates to use.
+ PEM encoded client root certificates used to authenticate client.
+ Options for requesting and verifying client certificate.
+
+
+
+ Creates server-side SSL credentials.
+ This constructor should be used if you do not wish to authenticate the client.
+ (client certificate won't be requested and checked by the server at all).
+
+ Key-certificates to use.
+
+
+
+ Key-certificate pairs.
+
+
+
+
+ PEM encoded client root certificates.
+
+
+
+
+ Deprecated. If true, the authenticity of client check will be enforced.
+
+
+
+
+ Mode of requesting certificate from client by the server.
+
+
+
+
+ A port exposed by a server.
+
+
+
+
+ Pass this value as port to have the server choose an unused listening port for you.
+ Ports added to a server will contain the bound port in their property.
+
+
+
+
+ Creates a new port on which server should listen.
+
+ The port on which server will be listening.
+ the host
+ the port. If zero, an unused port is chosen automatically.
+ credentials to use to secure this port.
+
+
+
+ Creates a port from an existing ServerPort instance and boundPort value.
+
+
+
+ The host.
+
+
+ The port.
+
+
+ The server credentials.
+
+
+
+ The port actually bound by the server. This is useful if you let server
+ pick port automatically.
+
+
+
+
+ Extension methods that simplify work with gRPC streaming calls.
+
+
+
+
+ Reads the entire stream and executes an async action for each element.
+
+
+
+
+ Reads the entire stream and creates a list containing all the elements read.
+
+
+
+
+ Writes all elements from given enumerable to the stream.
+ Completes the stream afterwards unless close = false.
+
+
+
+
+ Writes all elements from given enumerable to the stream.
+
+
+
+
+ Utility methods to run microbenchmarks.
+
+
+
+
+ Runs a simple benchmark preceded by warmup phase.
+
+
+
+
+ Utility methods for task parallel library.
+
+
+
+
+ Framework independent equivalent of Task.CompletedTask.
+
+
+
+
diff --git a/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml.meta b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml.meta
new file mode 100644
index 000000000..2c1a53292
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/lib/net45/Grpc.Core.xml.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ec9cf7702008ac648af0687c05064f78
+timeCreated: 1531219386
+licenseType: Free
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes.meta b/Assets/Plugins/Grpc.Core/runtimes.meta
new file mode 100644
index 000000000..921669fdd
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 643bdb9ca01174f4eb77e3e15f8324b3
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android.meta b/Assets/Plugins/Grpc.Core/runtimes/android.meta
new file mode 100644
index 000000000..489e8ddd4
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: f7f79be62cf24a940be0211dab5d2e5e
+folderAsset: yes
+timeCreated: 1531220113
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a.meta b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a.meta
new file mode 100644
index 000000000..976b74b6e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 47ba39f5fad6b49c5aae011940e9eea2
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so
new file mode 100644
index 000000000..ebe568cf4
Binary files /dev/null and b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so differ
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so.meta b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so.meta
new file mode 100644
index 000000000..6f9361728
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/arm64-v8a/libgrpc_csharp_ext.so.meta
@@ -0,0 +1,102 @@
+fileFormatVersion: 2
+guid: e1f44cc7ecd4244448817ccae6de42a3
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 0
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings:
+ CPU: ARM64
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a.meta b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a.meta
new file mode 100644
index 000000000..36a3b7e6c
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: de2aa4d10bc38f54fb8345aca9b21195
+folderAsset: yes
+timeCreated: 1531220167
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so
new file mode 100644
index 000000000..ac173af4a
Binary files /dev/null and b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so differ
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so.meta b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so.meta
new file mode 100644
index 000000000..82578436b
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/armeabi-v7a/libgrpc_csharp_ext.so.meta
@@ -0,0 +1,102 @@
+fileFormatVersion: 2
+guid: 04fe0e4dcf310416b991e57c99e5d55f
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 0
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/x86.meta b/Assets/Plugins/Grpc.Core/runtimes/android/x86.meta
new file mode 100644
index 000000000..53032587e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/x86.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 800ab3aa15d1b49b19df1caf1315bd3e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so b/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so
new file mode 100644
index 000000000..b5c69d214
Binary files /dev/null and b/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so differ
diff --git a/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so.meta b/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so.meta
new file mode 100644
index 000000000..3ebdd010e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/android/x86/libgrpc_csharp_ext.so.meta
@@ -0,0 +1,102 @@
+fileFormatVersion: 2
+guid: 245e3d515096b414fbcdd1fd4160161a
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 0
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c b/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c
new file mode 100644
index 000000000..58a7c58e9
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c
@@ -0,0 +1,436 @@
+
+// Copyright 2019 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// When building for Unity Android with il2cpp backend, Unity tries to link
+// the __Internal PInvoke definitions (which are required by iOS) even though
+// the .so/.dll will be actually used. This file provides dummy stubs to
+// make il2cpp happy.
+// See https://github.com/grpc/grpc/issues/16012
+
+#include
+#include
+
+void grpcsharp_init() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_shutdown() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_version_string() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_initial_metadata() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_message_length() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_message_next_slice_peek() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_status_on_client_status() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_status_on_client_details() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_status_on_client_trailing_metadata() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_recv_close_on_server_cancelled() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_reset() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_batch_context_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_call() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_method() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_host() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_deadline() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_request_metadata() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_reset() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_request_call_context_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_composite_call_credentials_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_credentials_release() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_cancel() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_cancel_with_status() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_start_unary() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_start_client_streaming() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_start_server_streaming() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_start_duplex_streaming() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_send_message() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_send_close_from_client() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_send_status_from_server() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_recv_message() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_recv_initial_metadata() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_start_serverside() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_send_initial_metadata() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_set_credentials() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_get_peer() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_args_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_args_set_string() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_args_set_integer() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_args_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_override_default_ssl_roots() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_ssl_credentials_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_composite_channel_credentials_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_credentials_release() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_insecure_channel_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_secure_channel_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_create_call() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_check_connectivity_state() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_watch_connectivity_state() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_get_target() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_channel_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_sizeof_grpc_event() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_create_async() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_create_sync() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_shutdown() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_next() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_pluck() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_completion_queue_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_free() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_add() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_count() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_get_key() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_get_value() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_array_destroy_full() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_redirect_log() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_native_callback_dispatcher_init() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_credentials_create_from_plugin() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_metadata_credentials_notify_from_plugin() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_ssl_server_credentials_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_credentials_release() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_register_completion_queue() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_add_insecure_http2_port() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_add_secure_http2_port() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_start() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_request_call() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_cancel_all_calls() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_shutdown_and_notify_callback() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_server_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_call_auth_context() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_auth_context_peer_identity_property_name() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_auth_context_property_iterator() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_auth_property_iterator_next() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_auth_context_release() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_create() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_adjust_tail_space() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_slice_count() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_slice_peek() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_reset_and_unref() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_slice_buffer_destroy() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_now() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_inf_future() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_inf_past() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_convert_clock_type() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void gprsharp_sizeof_timespec() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_test_callback() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_test_nop() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_test_override_method() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
+void grpcsharp_test_call_start_unary_echo() {
+ fprintf(stderr, "Should never reach here");
+ abort();
+}
diff --git a/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c.meta b/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c.meta
new file mode 100644
index 000000000..d93af38e4
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/grpc_csharp_ext_dummy_stubs.c.meta
@@ -0,0 +1,93 @@
+fileFormatVersion: 2
+guid: 576b78662f1f8af4fa751f709b620f52
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 0
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 0
+ Exclude Win64: 0
+ - first:
+ Android: Android
+ second:
+ enabled: 1
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/ios.meta b/Assets/Plugins/Grpc.Core/runtimes/ios.meta
new file mode 100644
index 000000000..5d3259e20
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/ios.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: a5f54f019e6510541ac61eeec96aa82d
+folderAsset: yes
+timeCreated: 1531456012
+licenseType: Pro
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a
new file mode 100644
index 000000000..593b37f95
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b10201b3d9800fdd1430aa6e21ece4cbfc441febe3e115fb0aa75fb3ab91b982
+size 150475712
diff --git a/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a.meta b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a.meta
new file mode 100644
index 000000000..3647568a8
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc.a.meta
@@ -0,0 +1,95 @@
+fileFormatVersion: 2
+guid: dde9f75258bae4033a4f778fd1149ccd
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ AddToEmbeddedBinaries: false
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a
new file mode 100644
index 000000000..bb4222c2b
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3919391e766965fe334a675dce831a408212eb237fe5526363ba19a37b5cffc9
+size 233696
diff --git a/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a.meta b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a.meta
new file mode 100644
index 000000000..af8485851
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/ios/libgrpc_csharp_ext.a.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 83f99c0e7db71754ba8927bbfb83c668
+timeCreated: 1531456013
+licenseType: Pro
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXIntel: 1
+ Exclude OSXIntel64: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 0
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux.meta b/Assets/Plugins/Grpc.Core/runtimes/linux.meta
new file mode 100644
index 000000000..9fc0e6478
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/linux.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 1ff40de7dc502c14e8893c7679e9f44a
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x64.meta b/Assets/Plugins/Grpc.Core/runtimes/linux/x64.meta
new file mode 100644
index 000000000..28d3c0fd8
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/linux/x64.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 08ccfdbfbd8d2d6458eb44d41a7b0b0a
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so b/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so
new file mode 100644
index 000000000..d16b10c54
Binary files /dev/null and b/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so differ
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so.meta b/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so.meta
new file mode 100644
index 000000000..0d639762e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/linux/x64/libgrpc_csharp_ext.so.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: c176dc12f2803e14bb37bcd0ba4a0718
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 1
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXIntel: 1
+ Exclude OSXIntel64: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 0
+ Exclude Win64: 0
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Linux
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x86.meta b/Assets/Plugins/Grpc.Core/runtimes/linux/x86.meta
new file mode 100644
index 000000000..b050a3b23
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/linux/x86.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: d62d998e3cdebd542a967743103c64b6
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so b/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so
new file mode 100644
index 000000000..197f10d09
Binary files /dev/null and b/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so differ
diff --git a/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta b/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta
new file mode 100644
index 000000000..f597b1aa2
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/linux/x86/libgrpc_csharp_ext.so.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 0165d78fa73d0cc4c8984f3d4f2a6c86
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 0
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 0
+ Exclude OSXIntel: 1
+ Exclude OSXIntel64: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 0
+ Exclude Win64: 0
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Linux
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx.meta b/Assets/Plugins/Grpc.Core/runtimes/osx.meta
new file mode 100644
index 000000000..cc9c9b60f
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 7b1ebe888da0a174c95a712766d2558c
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x64.meta b/Assets/Plugins/Grpc.Core/runtimes/osx/x64.meta
new file mode 100644
index 000000000..d01c158c6
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x64.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: ccea531b15a71974a91329186dd65075
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle b/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle
new file mode 100644
index 000000000..db12c02c6
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c65d82793dbac7259ddfb527eae94db1cf01ee36867cf8e50788490516ef646
+size 5013732
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle.meta b/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle.meta
new file mode 100644
index 000000000..9d192f59e
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x64/grpc_csharp_ext.bundle.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: da53c729add26524fbecb84a7b599289
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXIntel: 1
+ Exclude OSXIntel64: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: OSX
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x86.meta b/Assets/Plugins/Grpc.Core/runtimes/osx/x86.meta
new file mode 100644
index 000000000..17713f8c9
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x86.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 2ee63d0ffcfa72a4fbd7ad04ba34cadb
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle b/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle
new file mode 100644
index 000000000..665c22ee8
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ed5e0ec1804f47b340349b661399ee77863e2e2fe6665ce16a5b39b64f74c099
+size 4441560
diff --git a/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta b/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta
new file mode 100644
index 000000000..53822bbe0
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/osx/x86/grpc_csharp_ext.bundle.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 34ec9b69f128d6d4fa3fb46bc70b547c
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXIntel: 0
+ Exclude OSXIntel64: 1
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: OSX
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win.meta b/Assets/Plugins/Grpc.Core/runtimes/win.meta
new file mode 100644
index 000000000..1491ee6f0
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 928a9392668000344b70b6fd126e522c
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x64.meta b/Assets/Plugins/Grpc.Core/runtimes/win/x64.meta
new file mode 100644
index 000000000..ac2a063f9
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x64.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 34969b8c99d7a934eaa5e84da9fcf326
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll b/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll
new file mode 100644
index 000000000..2f1b62785
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a505fb074329d351ee5942c5f87dd08f69d6b8f098f2a43c8c557a962cd5061
+size 4323840
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll.meta b/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll.meta
new file mode 100644
index 000000000..a42f84fc8
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x64/grpc_csharp_ext.dll.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: cb634ddbaed75c344a6b79bc91ca996e
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 0
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXIntel: 0
+ Exclude OSXIntel64: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 0
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Windows
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x86.meta b/Assets/Plugins/Grpc.Core/runtimes/win/x86.meta
new file mode 100644
index 000000000..f3eb146cc
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x86.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: ed5c6044f868f9a4f955b7db2d2df619
+folderAsset: yes
+timeCreated: 1531219385
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll b/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll
new file mode 100644
index 000000000..f6de94dc5
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f689f9fd9fcf82b70eebdf0e828b0662b49307301aed66dda407378e5970dbf9
+size 3297792
diff --git a/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll.meta b/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll.meta
new file mode 100644
index 000000000..bd6291eaf
--- /dev/null
+++ b/Assets/Plugins/Grpc.Core/runtimes/win/x86/grpc_csharp_ext.dll.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: fe9aa1338bfc3864eb50df0f9d648316
+timeCreated: 1531219386
+licenseType: Free
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ isPreloaded: 0
+ isOverridable: 0
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Android: 1
+ Exclude Editor: 0
+ Exclude Linux: 0
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXIntel: 0
+ Exclude OSXIntel64: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 0
+ Exclude Win64: 1
+ Exclude iOS: 1
+ - first:
+ Android: Android
+ second:
+ enabled: 0
+ settings:
+ CPU: ARMv7
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Windows
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXIntel64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 0
+ settings:
+ CompileFlags:
+ FrameworkDependencies:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/System.Buffers.dll b/Assets/Plugins/System.Buffers.dll
new file mode 100644
index 000000000..a231c5a9d
--- /dev/null
+++ b/Assets/Plugins/System.Buffers.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9444b5a41a816b193c033bec199d74cdfc8298ed8300a3c39a4e953dec137494
+size 27992
diff --git a/Assets/Plugins/System.Buffers.dll.meta b/Assets/Plugins/System.Buffers.dll.meta
new file mode 100644
index 000000000..07d59567f
--- /dev/null
+++ b/Assets/Plugins/System.Buffers.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: ce837d1683742b46ab956fb33360fafe
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/System.Memory.dll b/Assets/Plugins/System.Memory.dll
new file mode 100644
index 000000000..0f4395de1
--- /dev/null
+++ b/Assets/Plugins/System.Memory.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:41b5e1a4c59abdb1ce1467f58c3d9fd06d39dff4fc61d500a2410fece8037f4b
+size 148760
diff --git a/Assets/Plugins/System.Memory.dll.meta b/Assets/Plugins/System.Memory.dll.meta
new file mode 100644
index 000000000..7d2e2940f
--- /dev/null
+++ b/Assets/Plugins/System.Memory.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 273576731295a11c1b7fca8490ef5afd
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll
new file mode 100644
index 000000000..19ad4e23b
--- /dev/null
+++ b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ad2dd7225d5162a0fd3a3b337a1949448520e3130a4bc8e010ec02f76097500
+size 23600
diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta
new file mode 100644
index 000000000..ff4acd7c5
--- /dev/null
+++ b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: c4ad452d6724491ca843aaee0eacf0e1
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Plugins/System.Threading.Tasks.Extensions.dll b/Assets/Plugins/System.Threading.Tasks.Extensions.dll
new file mode 100644
index 000000000..393652b40
--- /dev/null
+++ b/Assets/Plugins/System.Threading.Tasks.Extensions.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1f54718bbab6e7a649e460f5097ed444f33452b1451841f67e2e194641d5fccd
+size 33048
diff --git a/Assets/Plugins/System.Threading.Tasks.Extensions.dll.meta b/Assets/Plugins/System.Threading.Tasks.Extensions.dll.meta
new file mode 100644
index 000000000..fa275c098
--- /dev/null
+++ b/Assets/Plugins/System.Threading.Tasks.Extensions.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 7d5fdfa6c0d89190186e8a6be326096d
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/ChatScene.unity b/Assets/Scenes/ChatScene.unity
new file mode 100644
index 000000000..09c11735c
--- /dev/null
+++ b/Assets/Scenes/ChatScene.unity
@@ -0,0 +1,3131 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 500
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 0
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_ExportTrainingData: 0
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &164639239
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 164639240}
+ - component: {fileID: 164639242}
+ - component: {fileID: 164639241}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &164639240
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 164639239}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &164639241
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 164639239}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.38679248, g: 0.38679248, b: 0.38679248, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &164639242
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 164639239}
+ m_CullTransparentMesh: 0
+--- !u!1 &190778106
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 190778107}
+ - component: {fileID: 190778110}
+ - component: {fileID: 190778109}
+ - component: {fileID: 190778108}
+ m_Layer: 5
+ m_Name: SendReportButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &190778107
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 190778106}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 525475477}
+ m_Father: {fileID: 1309622324}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &190778108
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 190778106}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 190778109}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: SendReport
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &190778109
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 190778106}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.5943396, g: 0.5747152, b: 0.5747152, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &190778110
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 190778106}
+ m_CullTransparentMesh: 0
+--- !u!1 &237511814
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 237511817}
+ - component: {fileID: 237511816}
+ - component: {fileID: 237511815}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &237511815
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 237511814}
+ m_Enabled: 1
+--- !u!20 &237511816
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 237511814}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &237511817
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 237511814}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &247055287
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 247055288}
+ - component: {fileID: 247055290}
+ - component: {fileID: 247055289}
+ m_Layer: 5
+ m_Name: Line
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &247055288
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 247055287}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.082}
+ m_AnchorMax: {x: 1, y: 0.086}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &247055289
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 247055287}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &247055290
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 247055287}
+ m_CullTransparentMesh: 0
+--- !u!1 &330057072
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 330057073}
+ - component: {fileID: 330057076}
+ - component: {fileID: 330057075}
+ - component: {fileID: 330057074}
+ m_Layer: 5
+ m_Name: InputField
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &330057073
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330057072}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1337382646}
+ - {fileID: 1329709669}
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.17, y: 0.22}
+ m_AnchorMax: {x: 0.83, y: 0.28}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &330057074
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330057072}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 575553740, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 330057075}
+ m_TextComponent: {fileID: 1329709670}
+ m_Placeholder: {fileID: 1337382647}
+ m_ContentType: 0
+ m_InputType: 0
+ m_AsteriskChar: 42
+ m_KeyboardType: 0
+ m_LineType: 0
+ m_HideMobileInput: 0
+ m_CharacterValidation: 0
+ m_CharacterLimit: 0
+ m_OnEndEdit:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+ m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_CustomCaretColor: 0
+ m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+ m_Text:
+ m_CaretBlinkRate: 0.85
+ m_CaretWidth: 1
+ m_ReadOnly: 0
+--- !u!114 &330057075
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330057072}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &330057076
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 330057072}
+ m_CullTransparentMesh: 0
+--- !u!1 &525475476
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 525475477}
+ - component: {fileID: 525475479}
+ - component: {fileID: 525475478}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &525475477
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 525475476}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 190778107}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &525475478
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 525475476}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Send Report
+--- !u!222 &525475479
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 525475476}
+ m_CullTransparentMesh: 0
+--- !u!1 &557907330
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 557907331}
+ - component: {fileID: 557907332}
+ - component: {fileID: 557907334}
+ m_Layer: 5
+ m_Name: Buttons
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &557907331
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 557907330}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1487425764}
+ - {fileID: 1383832575}
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.12, y: 0.15}
+ m_AnchorMax: {x: 0.88, y: 0.2}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &557907332
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 557907330}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -405508275, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 4
+ m_Spacing: 30
+ m_ChildForceExpandWidth: 1
+ m_ChildForceExpandHeight: 1
+ m_ChildControlWidth: 1
+ m_ChildControlHeight: 1
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+--- !u!222 &557907334
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 557907330}
+ m_CullTransparentMesh: 0
+--- !u!1 &574419691
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 574419692}
+ - component: {fileID: 574419694}
+ - component: {fileID: 574419693}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &574419692
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 574419691}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1096149280}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &574419693
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 574419691}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Disconnect Test
+--- !u!222 &574419694
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 574419691}
+ m_CullTransparentMesh: 0
+--- !u!1 &609138041
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 609138042}
+ - component: {fileID: 609138044}
+ - component: {fileID: 609138043}
+ m_Layer: 5
+ m_Name: Placeholder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &609138042
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 609138041}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1671399962}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -0.5}
+ m_SizeDelta: {x: -20, y: -13}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &609138043
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 609138041}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 30
+ m_FontStyle: 2
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 3
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Please enter report text...
+--- !u!222 &609138044
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 609138041}
+ m_CullTransparentMesh: 0
+--- !u!1 &632675411
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 632675412}
+ - component: {fileID: 632675414}
+ - component: {fileID: 632675413}
+ m_Layer: 5
+ m_Name: Buttons
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &632675412
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 632675411}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1096149280}
+ - {fileID: 2120537442}
+ - {fileID: 1868729446}
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.12, y: 0.1}
+ m_AnchorMax: {x: 0.88, y: 0.135}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &632675413
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 632675411}
+ m_CullTransparentMesh: 0
+--- !u!114 &632675414
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 632675411}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -405508275, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 4
+ m_Spacing: 30
+ m_ChildForceExpandWidth: 1
+ m_ChildForceExpandHeight: 1
+ m_ChildControlWidth: 1
+ m_ChildControlHeight: 1
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+--- !u!1 &771375552
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 771375553}
+ - component: {fileID: 771375555}
+ - component: {fileID: 771375554}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &771375553
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771375552}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1487425764}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &771375554
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771375552}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Enter the room
+--- !u!222 &771375555
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771375552}
+ m_CullTransparentMesh: 0
+--- !u!1 &817501237
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 817501238}
+ - component: {fileID: 817501240}
+ - component: {fileID: 817501239}
+ m_Layer: 5
+ m_Name: Handle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &817501238
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 817501237}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 963732563}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &817501239
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 817501237}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &817501240
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 817501237}
+ m_CullTransparentMesh: 0
+--- !u!1 &927062024
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 927062025}
+ - component: {fileID: 927062027}
+ - component: {fileID: 927062028}
+ - component: {fileID: 927062026}
+ m_Layer: 5
+ m_Name: ScrollPanel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &927062025
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 927062024}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1978894556}
+ - {fileID: 1799772182}
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.1, y: 0.3}
+ m_AnchorMax: {x: 0.9, y: 0.95}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &927062026
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 927062024}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &927062027
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 927062024}
+ m_CullTransparentMesh: 0
+--- !u!114 &927062028
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 927062024}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1367256648, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Content: {fileID: 1522127878}
+ m_Horizontal: 0
+ m_Vertical: 1
+ m_MovementType: 1
+ m_Elasticity: 0.1
+ m_Inertia: 1
+ m_DecelerationRate: 0.135
+ m_ScrollSensitivity: 1
+ m_Viewport: {fileID: 1978894556}
+ m_HorizontalScrollbar: {fileID: 0}
+ m_VerticalScrollbar: {fileID: 1799772183}
+ m_HorizontalScrollbarVisibility: 0
+ m_VerticalScrollbarVisibility: 1
+ m_HorizontalScrollbarSpacing: 0
+ m_VerticalScrollbarSpacing: 0
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!1 &963732562
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 963732563}
+ m_Layer: 5
+ m_Name: Sliding Area
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &963732563
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 963732562}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 817501238}
+ m_Father: {fileID: 1799772182}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: -20, y: -20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1040922706
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1040922707}
+ - component: {fileID: 1040922709}
+ - component: {fileID: 1040922708}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1040922707
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1040922706}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1868729446}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1040922708
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1040922706}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Generate Exception(hub)
+--- !u!222 &1040922709
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1040922706}
+ m_CullTransparentMesh: 0
+--- !u!1 &1096149279
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1096149280}
+ - component: {fileID: 1096149283}
+ - component: {fileID: 1096149282}
+ - component: {fileID: 1096149281}
+ m_Layer: 5
+ m_Name: DisconnectButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1096149280
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1096149279}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 574419692}
+ m_Father: {fileID: 632675412}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1096149281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1096149279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1096149282}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: DisconnectServer
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &1096149282
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1096149279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.69753474, g: 0.70003784, b: 0.7075472, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1096149283
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1096149279}
+ m_CullTransparentMesh: 0
+--- !u!1 &1309622323
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1309622324}
+ - component: {fileID: 1309622326}
+ - component: {fileID: 1309622325}
+ m_Layer: 5
+ m_Name: Report
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1309622324
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1309622323}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1671399962}
+ - {fileID: 190778107}
+ m_Father: {fileID: 1634534318}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.08, y: 0.02}
+ m_AnchorMax: {x: 0.92, y: 0.07}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1309622325
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1309622323}
+ m_CullTransparentMesh: 0
+--- !u!114 &1309622326
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1309622323}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -405508275, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 4
+ m_Spacing: 30
+ m_ChildForceExpandWidth: 1
+ m_ChildForceExpandHeight: 1
+ m_ChildControlWidth: 1
+ m_ChildControlHeight: 1
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+--- !u!1 &1329709668
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1329709669}
+ - component: {fileID: 1329709671}
+ - component: {fileID: 1329709670}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1329709669
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1329709668}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 330057073}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -0.5}
+ m_SizeDelta: {x: -20, y: -13}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1329709670
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1329709668}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 30
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 3
+ m_MaxSize: 40
+ m_Alignment: 3
+ m_AlignByGeometry: 0
+ m_RichText: 0
+ m_HorizontalOverflow: 1
+ m_VerticalOverflow: 1
+ m_LineSpacing: 1
+ m_Text:
+--- !u!222 &1329709671
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1329709668}
+ m_CullTransparentMesh: 0
+--- !u!1 &1337382645
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1337382646}
+ - component: {fileID: 1337382648}
+ - component: {fileID: 1337382647}
+ m_Layer: 5
+ m_Name: Placeholder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1337382646
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1337382645}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 330057073}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -0.5}
+ m_SizeDelta: {x: -20, y: -13}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1337382647
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1337382645}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 30
+ m_FontStyle: 2
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 3
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Enter text...
+--- !u!222 &1337382648
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1337382645}
+ m_CullTransparentMesh: 0
+--- !u!1 &1383832574
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1383832575}
+ - component: {fileID: 1383832578}
+ - component: {fileID: 1383832577}
+ - component: {fileID: 1383832576}
+ m_Layer: 5
+ m_Name: AddCommentButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1383832575
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383832574}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1420340486}
+ m_Father: {fileID: 557907331}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1383832576
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383832574}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1383832577}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: SendMessage
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &1383832577
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383832574}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.33521715, g: 0.764151, b: 0.5044038, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1383832578
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383832574}
+ m_CullTransparentMesh: 0
+--- !u!1 &1409526054
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1409526057}
+ - component: {fileID: 1409526056}
+ - component: {fileID: 1409526055}
+ m_Layer: 0
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1409526055
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1409526054}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &1409526056
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1409526054}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!4 &1409526057
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1409526054}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1420340485
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1420340486}
+ - component: {fileID: 1420340488}
+ - component: {fileID: 1420340487}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1420340486
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1420340485}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1383832575}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1420340487
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1420340485}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Enter a comment
+--- !u!222 &1420340488
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1420340485}
+ m_CullTransparentMesh: 0
+--- !u!1 &1434588224
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1434588225}
+ - component: {fileID: 1434588227}
+ - component: {fileID: 1434588226}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1434588225
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1434588224}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2120537442}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1434588226
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1434588224}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Generate Exception(unary)
+--- !u!222 &1434588227
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1434588224}
+ m_CullTransparentMesh: 0
+--- !u!1 &1487425763
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1487425764}
+ - component: {fileID: 1487425767}
+ - component: {fileID: 1487425766}
+ - component: {fileID: 1487425765}
+ m_Layer: 5
+ m_Name: JoinAndLeaveRoomButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1487425764
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1487425763}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 771375553}
+ m_Father: {fileID: 557907331}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1487425765
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1487425763}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1487425766}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: JoinOrLeave
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &1487425766
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1487425763}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.3137255, g: 0.5686275, b: 0.627451, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1487425767
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1487425763}
+ m_CullTransparentMesh: 0
+--- !u!1 &1522127877
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1522127878}
+ - component: {fileID: 1522127881}
+ - component: {fileID: 1522127880}
+ - component: {fileID: 1522127879}
+ m_Layer: 5
+ m_Name: ChatText
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1522127878
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1522127877}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1978894556}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.02, y: 0.02}
+ m_AnchorMax: {x: 0.98, y: 0.98}
+ m_AnchoredPosition: {x: 0, y: 5.530014}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 1}
+--- !u!114 &1522127879
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1522127877}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1741964061, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalFit: 0
+ m_VerticalFit: 2
+--- !u!114 &1522127880
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1522127877}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 0
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 1
+ m_LineSpacing: 1
+ m_Text: Sample Text
+--- !u!222 &1522127881
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1522127877}
+ m_CullTransparentMesh: 0
+--- !u!1 &1634534314
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1634534318}
+ - component: {fileID: 1634534317}
+ - component: {fileID: 1634534316}
+ - component: {fileID: 1634534315}
+ - component: {fileID: 1634534319}
+ m_Layer: 5
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1634534315
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1634534314}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &1634534316
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1634534314}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 900, y: 1600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+--- !u!223 &1634534317
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1634534314}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &1634534318
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1634534314}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 164639240}
+ - {fileID: 927062025}
+ - {fileID: 330057073}
+ - {fileID: 557907331}
+ - {fileID: 632675412}
+ - {fileID: 247055288}
+ - {fileID: 1309622324}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!114 &1634534319
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1634534314}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 7ea9e77872213814ea60ab05d1064578, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ ChatText: {fileID: 1522127880}
+ JoinOrLeaveButton: {fileID: 1487425765}
+ JoinOrLeaveButtonText: {fileID: 771375554}
+ SendMessageButton: {fileID: 1383832576}
+ Input: {fileID: 330057074}
+ ReportInput: {fileID: 1671399963}
+ SendReportButton: {fileID: 190778108}
+ DisconnectButon: {fileID: 1096149281}
+ ExceptionButton: {fileID: 1868729447}
+ UnaryExceptionButton: {fileID: 2120537443}
+--- !u!1 &1671399961
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1671399962}
+ - component: {fileID: 1671399965}
+ - component: {fileID: 1671399964}
+ - component: {fileID: 1671399963}
+ m_Layer: 5
+ m_Name: ReportInputField
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1671399962
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1671399961}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 609138042}
+ - {fileID: 1901126666}
+ m_Father: {fileID: 1309622324}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1671399963
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1671399961}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 575553740, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1671399964}
+ m_TextComponent: {fileID: 1901126667}
+ m_Placeholder: {fileID: 609138043}
+ m_ContentType: 0
+ m_InputType: 0
+ m_AsteriskChar: 42
+ m_KeyboardType: 0
+ m_LineType: 0
+ m_HideMobileInput: 0
+ m_CharacterValidation: 0
+ m_CharacterLimit: 0
+ m_OnEndEdit:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+ m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_CustomCaretColor: 0
+ m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+ m_Text:
+ m_CaretBlinkRate: 0.85
+ m_CaretWidth: 1
+ m_ReadOnly: 0
+--- !u!114 &1671399964
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1671399961}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1671399965
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1671399961}
+ m_CullTransparentMesh: 0
+--- !u!1 &1799772181
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1799772182}
+ - component: {fileID: 1799772185}
+ - component: {fileID: 1799772184}
+ - component: {fileID: 1799772183}
+ m_Layer: 5
+ m_Name: Scrollbar
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1799772182
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1799772181}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 963732563}
+ m_Father: {fileID: 927062025}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0.02}
+ m_AnchorMax: {x: 1, y: 0.98}
+ m_AnchoredPosition: {x: -20, y: 0}
+ m_SizeDelta: {x: 20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1799772183
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1799772181}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -2061169968, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 817501239}
+ m_HandleRect: {fileID: 817501238}
+ m_Direction: 3
+ m_Value: 1
+ m_Size: 1
+ m_NumberOfSteps: 0
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.Scrollbar+ScrollEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &1799772184
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1799772181}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1799772185
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1799772181}
+ m_CullTransparentMesh: 0
+--- !u!1 &1868729445
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1868729446}
+ - component: {fileID: 1868729449}
+ - component: {fileID: 1868729448}
+ - component: {fileID: 1868729447}
+ m_Layer: 5
+ m_Name: ExceptiontButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1868729446
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1868729445}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1040922707}
+ m_Father: {fileID: 632675412}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1868729447
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1868729445}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1868729448}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: GenerateException
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &1868729448
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1868729445}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.7647059, g: 0.33333337, b: 0.3651321, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &1868729449
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1868729445}
+ m_CullTransparentMesh: 0
+--- !u!1 &1901126665
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1901126666}
+ - component: {fileID: 1901126668}
+ - component: {fileID: 1901126667}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1901126666
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1901126665}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1671399962}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: -0.5}
+ m_SizeDelta: {x: -20, y: -13}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1901126667
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1901126665}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 30
+ m_FontStyle: 0
+ m_BestFit: 1
+ m_MinSize: 3
+ m_MaxSize: 40
+ m_Alignment: 3
+ m_AlignByGeometry: 0
+ m_RichText: 0
+ m_HorizontalOverflow: 1
+ m_VerticalOverflow: 1
+ m_LineSpacing: 1
+ m_Text:
+--- !u!222 &1901126668
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1901126665}
+ m_CullTransparentMesh: 0
+--- !u!1 &1978894555
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1978894556}
+ - component: {fileID: 1978894558}
+ - component: {fileID: 1978894559}
+ m_Layer: 5
+ m_Name: Viewport
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1978894556
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1978894555}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1522127878}
+ m_Father: {fileID: 927062025}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1978894558
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1978894555}
+ m_CullTransparentMesh: 0
+--- !u!114 &1978894559
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1978894555}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -146154839, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &2120537441
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2120537442}
+ - component: {fileID: 2120537445}
+ - component: {fileID: 2120537444}
+ - component: {fileID: 2120537443}
+ m_Layer: 5
+ m_Name: UnaryExceptiontButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2120537442
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2120537441}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1434588225}
+ m_Father: {fileID: 632675412}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2120537443
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2120537441}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.11764706, g: 0.11764706, b: 0.11764706, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Highlighted
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 2120537444}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1634534319}
+ m_MethodName: UnaryGenerateException
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+ Culture=neutral, PublicKeyToken=null
+--- !u!114 &2120537444
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2120537441}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.7647059, g: 0.33333337, b: 0.3651321, a: 1}
+ m_RaycastTarget: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+ m_Sprite: {fileID: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+--- !u!222 &2120537445
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2120537441}
+ m_CullTransparentMesh: 0
diff --git a/Assets/Scenes/ChatScene.unity.meta b/Assets/Scenes/ChatScene.unity.meta
new file mode 100644
index 000000000..70b3a62ca
--- /dev/null
+++ b/Assets/Scenes/ChatScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ea5a8dc36702b6445b34bb7c7c5eb088
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/Main.unity
similarity index 100%
rename from Assets/Scenes/SampleScene.unity
rename to Assets/Scenes/Main.unity
diff --git a/Assets/Scenes/SampleScene.unity.meta b/Assets/Scenes/Main.unity.meta
similarity index 100%
rename from Assets/Scenes/SampleScene.unity.meta
rename to Assets/Scenes/Main.unity.meta
diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta
new file mode 100644
index 000000000..57ab26d23
--- /dev/null
+++ b/Assets/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8e21db93f5570914091daea046edc6a5
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ChatComponent.cs b/Assets/Scripts/ChatComponent.cs
new file mode 100644
index 000000000..cce2fa9ed
--- /dev/null
+++ b/Assets/Scripts/ChatComponent.cs
@@ -0,0 +1,223 @@
+using ChatApp.Shared.Hubs;
+using ChatApp.Shared.MessagePackObjects;
+using ChatApp.Shared.Services;
+using Grpc.Core;
+using MagicOnion.Client;
+using System.IO;
+using System.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Assets.Scripts
+{
+ public class ChatComponent : MonoBehaviour, IChatHubReceiver
+ {
+ private Channel channel;
+ private IChatHub streamingClient;
+ private IChatService client;
+
+ private bool isJoin;
+ private bool isSelfDisConnected;
+
+ public Text ChatText;
+
+ public Button JoinOrLeaveButton;
+
+ public Text JoinOrLeaveButtonText;
+
+ public Button SendMessageButton;
+
+ public InputField Input;
+
+ public InputField ReportInput;
+
+ public Button SendReportButton;
+
+ public Button DisconnectButon;
+ public Button ExceptionButton;
+ public Button UnaryExceptionButton;
+
+
+ void Start()
+ {
+ this.InitializeClient();
+ this.InitializeUi();
+ }
+
+
+ async void OnDestroy()
+ {
+ // Clean up Hub and channel
+ await this.streamingClient.DisposeAsync();
+ await this.channel.ShutdownAsync();
+ }
+
+
+ private void InitializeClient()
+ {
+ // Initialize the Hub
+ this.channel = new Channel("localhost", 12345, ChannelCredentials.Insecure);
+ // for SSL/TLS connection
+ //var serverCred = new SslCredentials(File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "server.crt")));
+ //this.channel = new Channel("test.example.com", 12345, serverCred);
+ this.streamingClient = StreamingHubClient.Connect(this.channel, this);
+ this.RegisterDisconnectEvent(streamingClient);
+ this.client = MagicOnionClient.Create(this.channel);
+ }
+
+
+ private void InitializeUi()
+ {
+ this.isJoin = false;
+
+ this.SendMessageButton.interactable = false;
+ this.ChatText.text = string.Empty;
+ this.Input.text = string.Empty;
+ this.Input.placeholder.GetComponent().text = "Please enter your name.";
+ this.JoinOrLeaveButtonText.text = "Enter the room";
+ this.ExceptionButton.interactable = false;
+ }
+
+
+ private async void RegisterDisconnectEvent(IChatHub streamingClient)
+ {
+ try
+ {
+ // you can wait disconnected event
+ await streamingClient.WaitForDisconnect();
+ }
+ finally
+ {
+ // try-to-reconnect? logging event? close? etc...
+ Debug.Log("disconnected server.");
+
+ if (this.isSelfDisConnected)
+ {
+ // there is no particular meaning
+ await Task.Delay(2000);
+
+ // reconnect
+ this.ReconnectServer();
+ }
+ }
+ }
+
+
+ public async void DisconnectServer()
+ {
+ this.isSelfDisConnected = true;
+
+ this.JoinOrLeaveButton.interactable = false;
+ this.SendMessageButton.interactable = false;
+ this.SendReportButton.interactable = false;
+ this.DisconnectButon.interactable = false;
+ this.ExceptionButton.interactable = false;
+ this.UnaryExceptionButton.interactable = false;
+
+ if (this.isJoin)
+ this.JoinOrLeave();
+
+ await this.streamingClient.DisposeAsync();
+ }
+
+
+ private void ReconnectServer()
+ {
+ this.streamingClient = StreamingHubClient.Connect(this.channel, this);
+ this.RegisterDisconnectEvent(streamingClient);
+ Debug.Log("Reconnected server.");
+
+ this.JoinOrLeaveButton.interactable = true;
+ this.SendMessageButton.interactable = false;
+ this.SendReportButton.interactable = true;
+ this.DisconnectButon.interactable = true;
+ this.ExceptionButton.interactable = true;
+ this.UnaryExceptionButton.interactable = true;
+
+ this.isSelfDisConnected = false;
+ }
+
+
+ #region Client -> Server (Streaming)
+ public async void JoinOrLeave()
+ {
+ if (this.isJoin)
+ {
+ await this.streamingClient.LeaveAsync();
+
+ this.InitializeUi();
+ }
+ else
+ {
+ var request = new JoinRequest { RoomName = "SampleRoom", UserName = this.Input.text };
+ await this.streamingClient.JoinAsync(request);
+
+ this.isJoin = true;
+ this.SendMessageButton.interactable = true;
+ this.JoinOrLeaveButtonText.text = "Leave the room";
+ this.Input.text = string.Empty;
+ this.Input.placeholder.GetComponent().text = "Please enter a comment.";
+ this.ExceptionButton.interactable = true;
+ }
+ }
+
+
+ public async void SendMessage()
+ {
+ if (!this.isJoin)
+ return;
+
+ await this.streamingClient.SendMessageAsync(this.Input.text);
+
+ this.Input.text = string.Empty;
+ }
+
+ public async void GenerateException()
+ {
+ // hub
+ if (!this.isJoin) return;
+ await this.streamingClient.GenerateException("client exception(streaminghub)!");
+ }
+
+ public void SampleMethod()
+ {
+ throw new System.NotImplementedException();
+ }
+ #endregion
+
+
+ #region Server -> Client (Streaming)
+ public void OnJoin(string name)
+ {
+ this.ChatText.text += $"\n{name} entered the room.";
+ }
+
+
+ public void OnLeave(string name)
+ {
+ this.ChatText.text += $"\n{name} left the room.";
+ }
+
+ public void OnSendMessage(MessageResponse message)
+ {
+ this.ChatText.text += $"\n{message.UserName}:{message.Message}";
+ }
+ #endregion
+
+
+ #region Client -> Server (Unary)
+ public async void SendReport()
+ {
+ await this.client.SendReportAsync(this.ReportInput.text);
+
+ this.ReportInput.text = string.Empty;
+ }
+
+ public async void UnaryGenerateException()
+ {
+ // unary
+ await this.client.GenerateException("client exception(unary)!");
+ }
+ #endregion
+ }
+}
diff --git a/Assets/Scripts/ChatComponent.cs.meta b/Assets/Scripts/ChatComponent.cs.meta
new file mode 100644
index 000000000..dc83ccfa4
--- /dev/null
+++ b/Assets/Scripts/ChatComponent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7ea9e77872213814ea60ab05d1064578
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Generated.meta b/Assets/Scripts/Generated.meta
new file mode 100644
index 000000000..203aa717a
--- /dev/null
+++ b/Assets/Scripts/Generated.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d7949e630c7ec6044af484bed87f78fd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Generated/MagicOnion.Generated.cs b/Assets/Scripts/Generated/MagicOnion.Generated.cs
new file mode 100644
index 000000000..47b505860
--- /dev/null
+++ b/Assets/Scripts/Generated/MagicOnion.Generated.cs
@@ -0,0 +1,397 @@
+//
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 219
+#pragma warning disable 168
+
+namespace MagicOnion
+{
+ using global::System;
+ using global::System.Collections.Generic;
+ using global::System.Linq;
+ using global::MagicOnion;
+ using global::MagicOnion.Client;
+
+ public static partial class MagicOnionInitializer
+ {
+ static bool isRegistered = false;
+
+ [UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.BeforeSceneLoad)]
+ public static void Register()
+ {
+ if(isRegistered) return;
+ isRegistered = true;
+
+ MagicOnionClientRegistry.Register((x, y, z) => new ChatApp.Shared.Services.ChatServiceClient(x, y, z));
+
+ StreamingHubClientRegistry.Register((a, _, b, c, d, e) => new ChatApp.Shared.Hubs.ChatHubClient(a, b, c, d, e));
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 219
+#pragma warning restore 414
+#pragma warning restore 612
+#pragma warning restore 618
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 219
+#pragma warning disable 168
+
+namespace MagicOnion.Resolvers
+{
+ using System;
+ using MessagePack;
+
+ public class MagicOnionResolver : global::MessagePack.IFormatterResolver
+ {
+ public static readonly global::MessagePack.IFormatterResolver Instance = new MagicOnionResolver();
+
+ MagicOnionResolver()
+ {
+
+ }
+
+ public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter()
+ {
+ return FormatterCache.formatter;
+ }
+
+ static class FormatterCache
+ {
+ public static readonly global::MessagePack.Formatters.IMessagePackFormatter formatter;
+
+ static FormatterCache()
+ {
+ var f = MagicOnionResolverGetFormatterHelper.GetFormatter(typeof(T));
+ if (f != null)
+ {
+ formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f;
+ }
+ }
+ }
+ }
+
+ internal static class MagicOnionResolverGetFormatterHelper
+ {
+ static readonly global::System.Collections.Generic.Dictionary lookup;
+
+ static MagicOnionResolverGetFormatterHelper()
+ {
+ lookup = new global::System.Collections.Generic.Dictionary(3)
+ {
+ {typeof(global::MagicOnion.DynamicArgumentTuple, global::System.Collections.Generic.Dictionary>), 0 },
+ {typeof(global::System.Collections.Generic.Dictionary), 1 },
+ {typeof(global::System.Collections.Generic.List), 2 },
+ };
+ }
+
+ internal static object GetFormatter(Type t)
+ {
+ int key;
+ if (!lookup.TryGetValue(t, out key))
+ {
+ return null;
+ }
+
+ switch (key)
+ {
+ case 0: return new global::MagicOnion.DynamicArgumentTupleFormatter, global::System.Collections.Generic.Dictionary>(default(global::System.Collections.Generic.List), default(global::System.Collections.Generic.Dictionary));
+ case 1: return new global::MessagePack.Formatters.DictionaryFormatter();
+ case 2: return new global::MessagePack.Formatters.ListFormatter();
+ default: return null;
+ }
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 219
+#pragma warning restore 414
+#pragma warning restore 612
+#pragma warning restore 618
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 219
+#pragma warning disable 168
+
+namespace ChatApp.Shared.Services {
+ using System;
+ using MagicOnion;
+ using MagicOnion.Client;
+ using Grpc.Core;
+ using MessagePack;
+
+ [Ignore]
+ public class ChatServiceClient : MagicOnionClientBase, global::ChatApp.Shared.Services.IChatService
+ {
+ static readonly Method GenerateExceptionMethod;
+ static readonly Func GenerateExceptionDelegate;
+ static readonly Method SendReportAsyncMethod;
+ static readonly Func SendReportAsyncDelegate;
+
+ static ChatServiceClient()
+ {
+ GenerateExceptionMethod = new Method(MethodType.Unary, "IChatService", "GenerateException", MagicOnionMarshallers.ThroughMarshaller, MagicOnionMarshallers.ThroughMarshaller);
+ GenerateExceptionDelegate = _GenerateException;
+ SendReportAsyncMethod = new Method(MethodType.Unary, "IChatService", "SendReportAsync", MagicOnionMarshallers.ThroughMarshaller, MagicOnionMarshallers.ThroughMarshaller);
+ SendReportAsyncDelegate = _SendReportAsync;
+ }
+
+ ChatServiceClient()
+ {
+ }
+
+ public ChatServiceClient(CallInvoker callInvoker, MessagePackSerializerOptions serializerOptions, IClientFilter[] filters)
+ : base(callInvoker, serializerOptions, filters)
+ {
+ }
+
+ protected override MagicOnionClientBase Clone()
+ {
+ var clone = new ChatServiceClient();
+ clone.host = this.host;
+ clone.option = this.option;
+ clone.callInvoker = this.callInvoker;
+ clone.serializerOptions = this.serializerOptions;
+ clone.filters = filters;
+ return clone;
+ }
+
+ public new IChatService WithHeaders(Metadata headers)
+ {
+ return base.WithHeaders(headers);
+ }
+
+ public new IChatService WithCancellationToken(System.Threading.CancellationToken cancellationToken)
+ {
+ return base.WithCancellationToken(cancellationToken);
+ }
+
+ public new IChatService WithDeadline(System.DateTime deadline)
+ {
+ return base.WithDeadline(deadline);
+ }
+
+ public new IChatService WithHost(string host)
+ {
+ return base.WithHost(host);
+ }
+
+ public new IChatService WithOptions(CallOptions option)
+ {
+ return base.WithOptions(option);
+ }
+
+ static ResponseContext _GenerateException(RequestContext __context)
+ {
+ return CreateResponseContext(__context, GenerateExceptionMethod);
+ }
+
+ public global::MagicOnion.UnaryResult GenerateException(string message)
+ {
+ return InvokeAsync("IChatService/GenerateException", message, GenerateExceptionDelegate);
+ }
+ static ResponseContext _SendReportAsync(RequestContext __context)
+ {
+ return CreateResponseContext(__context, SendReportAsyncMethod);
+ }
+
+ public global::MagicOnion.UnaryResult SendReportAsync(string message)
+ {
+ return InvokeAsync("IChatService/SendReportAsync", message, SendReportAsyncDelegate);
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 219
+#pragma warning restore 414
+#pragma warning restore 612
+#pragma warning restore 618
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 219
+#pragma warning disable 168
+
+namespace ChatApp.Shared.Hubs {
+ using Grpc.Core;
+ using Grpc.Core.Logging;
+ using MagicOnion;
+ using MagicOnion.Client;
+ using MessagePack;
+ using System;
+ using System.Threading.Tasks;
+
+ [Ignore]
+ public class ChatHubClient : StreamingHubClientBase, global::ChatApp.Shared.Hubs.IChatHub
+ {
+ static readonly Method method = new Method(MethodType.DuplexStreaming, "IChatHub", "Connect", MagicOnionMarshallers.ThroughMarshaller, MagicOnionMarshallers.ThroughMarshaller);
+
+ protected override Method DuplexStreamingAsyncMethod { get { return method; } }
+
+ readonly global::ChatApp.Shared.Hubs.IChatHub __fireAndForgetClient;
+
+ public ChatHubClient(CallInvoker callInvoker, string host, CallOptions option, MessagePackSerializerOptions serializerOptions, ILogger logger)
+ : base(callInvoker, host, option, serializerOptions, logger)
+ {
+ this.__fireAndForgetClient = new FireAndForgetClient(this);
+ }
+
+ public global::ChatApp.Shared.Hubs.IChatHub FireAndForget()
+ {
+ return __fireAndForgetClient;
+ }
+
+ protected override void OnBroadcastEvent(int methodId, ArraySegment data)
+ {
+ switch (methodId)
+ {
+ case -1297457280: // OnJoin
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ receiver.OnJoin(result); break;
+ }
+ case 532410095: // OnLeave
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ receiver.OnLeave(result); break;
+ }
+ case -552695459: // OnSendMessage
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ receiver.OnSendMessage(result); break;
+ }
+ default:
+ break;
+ }
+ }
+
+ protected override void OnResponseEvent(int methodId, object taskCompletionSource, ArraySegment data)
+ {
+ switch (methodId)
+ {
+ case -733403293: // JoinAsync
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ ((TaskCompletionSource)taskCompletionSource).TrySetResult(result);
+ break;
+ }
+ case 1368362116: // LeaveAsync
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ ((TaskCompletionSource)taskCompletionSource).TrySetResult(result);
+ break;
+ }
+ case -601690414: // SendMessageAsync
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ ((TaskCompletionSource)taskCompletionSource).TrySetResult(result);
+ break;
+ }
+ case 517938971: // GenerateException
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ ((TaskCompletionSource)taskCompletionSource).TrySetResult(result);
+ break;
+ }
+ case -852153394: // SampleMethod
+ {
+ var result = MessagePackSerializer.Deserialize(data, serializerOptions);
+ ((TaskCompletionSource)taskCompletionSource).TrySetResult(result);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ public global::System.Threading.Tasks.Task JoinAsync(global::ChatApp.Shared.MessagePackObjects.JoinRequest request)
+ {
+ return WriteMessageWithResponseAsync(-733403293, request);
+ }
+
+ public global::System.Threading.Tasks.Task LeaveAsync()
+ {
+ return WriteMessageWithResponseAsync(1368362116, Nil.Default);
+ }
+
+ public global::System.Threading.Tasks.Task SendMessageAsync(string message)
+ {
+ return WriteMessageWithResponseAsync(-601690414, message);
+ }
+
+ public global::System.Threading.Tasks.Task GenerateException(string message)
+ {
+ return WriteMessageWithResponseAsync(517938971, message);
+ }
+
+ public global::System.Threading.Tasks.Task SampleMethod(global::System.Collections.Generic.List sampleList, global::System.Collections.Generic.Dictionary sampleDictionary)
+ {
+ return WriteMessageWithResponseAsync, global::System.Collections.Generic.Dictionary>, Nil>(-852153394, new DynamicArgumentTuple, global::System.Collections.Generic.Dictionary>(sampleList, sampleDictionary));
+ }
+
+
+ class FireAndForgetClient : global::ChatApp.Shared.Hubs.IChatHub
+ {
+ readonly ChatHubClient __parent;
+
+ public FireAndForgetClient(ChatHubClient parentClient)
+ {
+ this.__parent = parentClient;
+ }
+
+ public global::ChatApp.Shared.Hubs.IChatHub FireAndForget()
+ {
+ throw new NotSupportedException();
+ }
+
+ public Task DisposeAsync()
+ {
+ throw new NotSupportedException();
+ }
+
+ public Task WaitForDisconnect()
+ {
+ throw new NotSupportedException();
+ }
+
+ public global::System.Threading.Tasks.Task JoinAsync(global::ChatApp.Shared.MessagePackObjects.JoinRequest request)
+ {
+ return __parent.WriteMessageAsync(-733403293, request);
+ }
+
+ public global::System.Threading.Tasks.Task LeaveAsync()
+ {
+ return __parent.WriteMessageAsync(1368362116, Nil.Default);
+ }
+
+ public global::System.Threading.Tasks.Task SendMessageAsync(string message)
+ {
+ return __parent.WriteMessageAsync(-601690414, message);
+ }
+
+ public global::System.Threading.Tasks.Task GenerateException(string message)
+ {
+ return __parent.WriteMessageAsync(517938971, message);
+ }
+
+ public global::System.Threading.Tasks.Task SampleMethod(global::System.Collections.Generic.List sampleList, global::System.Collections.Generic.Dictionary sampleDictionary)
+ {
+ return __parent.WriteMessageAsync, global::System.Collections.Generic.Dictionary>>(-852153394, new DynamicArgumentTuple, global::System.Collections.Generic.Dictionary>(sampleList, sampleDictionary));
+ }
+
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 219
+#pragma warning restore 414
+#pragma warning restore 618
+#pragma warning restore 612
diff --git a/Assets/Scripts/Generated/MagicOnion.Generated.cs.meta b/Assets/Scripts/Generated/MagicOnion.Generated.cs.meta
new file mode 100644
index 000000000..cf214a934
--- /dev/null
+++ b/Assets/Scripts/Generated/MagicOnion.Generated.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8101cc28afd16634bb4bbd1bff64cf99
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Generated/MessagePack.Generated.cs b/Assets/Scripts/Generated/MessagePack.Generated.cs
new file mode 100644
index 000000000..f9c6de309
--- /dev/null
+++ b/Assets/Scripts/Generated/MessagePack.Generated.cs
@@ -0,0 +1,223 @@
+//
+// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
+//
+
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 168
+
+#pragma warning disable SA1200 // Using directives should be placed correctly
+#pragma warning disable SA1312 // Variable names should begin with lower-case letter
+#pragma warning disable SA1649 // File name should match first type name
+
+namespace MessagePack.Resolvers
+{
+ using System;
+ using System.Buffers;
+ using MessagePack;
+
+ public class GeneratedResolver : global::MessagePack.IFormatterResolver
+ {
+ public static readonly global::MessagePack.IFormatterResolver Instance = new GeneratedResolver();
+
+ private GeneratedResolver()
+ {
+ }
+
+ public global::MessagePack.Formatters.IMessagePackFormatter GetFormatter()
+ {
+ return FormatterCache.Formatter;
+ }
+
+ private static class FormatterCache
+ {
+ internal static readonly global::MessagePack.Formatters.IMessagePackFormatter Formatter;
+
+ static FormatterCache()
+ {
+ var f = GeneratedResolverGetFormatterHelper.GetFormatter(typeof(T));
+ if (f != null)
+ {
+ Formatter = (global::MessagePack.Formatters.IMessagePackFormatter)f;
+ }
+ }
+ }
+ }
+
+ internal static class GeneratedResolverGetFormatterHelper
+ {
+ private static readonly global::System.Collections.Generic.Dictionary lookup;
+
+ static GeneratedResolverGetFormatterHelper()
+ {
+ lookup = new global::System.Collections.Generic.Dictionary(2)
+ {
+ { typeof(global::ChatApp.Shared.MessagePackObjects.JoinRequest), 0 },
+ { typeof(global::ChatApp.Shared.MessagePackObjects.MessageResponse), 1 },
+ };
+ }
+
+ internal static object GetFormatter(Type t)
+ {
+ int key;
+ if (!lookup.TryGetValue(t, out key))
+ {
+ return null;
+ }
+
+ switch (key)
+ {
+ case 0: return new MessagePack.Formatters.ChatApp.Shared.MessagePackObjects.JoinRequestFormatter();
+ case 1: return new MessagePack.Formatters.ChatApp.Shared.MessagePackObjects.MessageResponseFormatter();
+ default: return null;
+ }
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 414
+#pragma warning restore 618
+#pragma warning restore 612
+
+#pragma warning restore SA1312 // Variable names should begin with lower-case letter
+#pragma warning restore SA1200 // Using directives should be placed correctly
+#pragma warning restore SA1649 // File name should match first type name
+
+
+
+
+//
+// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
+//
+
+#pragma warning disable 618
+#pragma warning disable 612
+#pragma warning disable 414
+#pragma warning disable 168
+
+#pragma warning disable SA1129 // Do not use default value type constructor
+#pragma warning disable SA1200 // Using directives should be placed correctly
+#pragma warning disable SA1309 // Field names should not begin with underscore
+#pragma warning disable SA1312 // Variable names should begin with lower-case letter
+#pragma warning disable SA1403 // File may only contain a single namespace
+#pragma warning disable SA1649 // File name should match first type name
+
+namespace MessagePack.Formatters.ChatApp.Shared.MessagePackObjects
+{
+ using System;
+ using System.Buffers;
+ using MessagePack;
+
+ public sealed class JoinRequestFormatter : global::MessagePack.Formatters.IMessagePackFormatter
+ {
+
+
+ public void Serialize(ref MessagePackWriter writer, global::ChatApp.Shared.MessagePackObjects.JoinRequest value, global::MessagePack.MessagePackSerializerOptions options)
+ {
+ IFormatterResolver formatterResolver = options.Resolver;
+ writer.WriteArrayHeader(2);
+ formatterResolver.GetFormatterWithVerify().Serialize(ref writer, value.RoomName, options);
+ formatterResolver.GetFormatterWithVerify().Serialize(ref writer, value.UserName, options);
+ }
+
+ public global::ChatApp.Shared.MessagePackObjects.JoinRequest Deserialize(ref MessagePackReader reader, global::MessagePack.MessagePackSerializerOptions options)
+ {
+ if (reader.TryReadNil())
+ {
+ throw new InvalidOperationException("typecode is null, struct not supported");
+ }
+
+ IFormatterResolver formatterResolver = options.Resolver;
+ var length = reader.ReadArrayHeader();
+ var __RoomName__ = default(string);
+ var __UserName__ = default(string);
+
+ for (int i = 0; i < length; i++)
+ {
+ var key = i;
+
+ switch (key)
+ {
+ case 0:
+ __RoomName__ = formatterResolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ break;
+ case 1:
+ __UserName__ = formatterResolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ break;
+ default:
+ reader.Skip();
+ break;
+ }
+ }
+
+ var ____result = new global::ChatApp.Shared.MessagePackObjects.JoinRequest();
+ ____result.RoomName = __RoomName__;
+ ____result.UserName = __UserName__;
+ return ____result;
+ }
+ }
+
+ public sealed class MessageResponseFormatter : global::MessagePack.Formatters.IMessagePackFormatter
+ {
+
+
+ public void Serialize(ref MessagePackWriter writer, global::ChatApp.Shared.MessagePackObjects.MessageResponse value, global::MessagePack.MessagePackSerializerOptions options)
+ {
+ IFormatterResolver formatterResolver = options.Resolver;
+ writer.WriteArrayHeader(2);
+ formatterResolver.GetFormatterWithVerify().Serialize(ref writer, value.UserName, options);
+ formatterResolver.GetFormatterWithVerify().Serialize(ref writer, value.Message, options);
+ }
+
+ public global::ChatApp.Shared.MessagePackObjects.MessageResponse Deserialize(ref MessagePackReader reader, global::MessagePack.MessagePackSerializerOptions options)
+ {
+ if (reader.TryReadNil())
+ {
+ throw new InvalidOperationException("typecode is null, struct not supported");
+ }
+
+ IFormatterResolver formatterResolver = options.Resolver;
+ var length = reader.ReadArrayHeader();
+ var __UserName__ = default(string);
+ var __Message__ = default(string);
+
+ for (int i = 0; i < length; i++)
+ {
+ var key = i;
+
+ switch (key)
+ {
+ case 0:
+ __UserName__ = formatterResolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ break;
+ case 1:
+ __Message__ = formatterResolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ break;
+ default:
+ reader.Skip();
+ break;
+ }
+ }
+
+ var ____result = new global::ChatApp.Shared.MessagePackObjects.MessageResponse();
+ ____result.UserName = __UserName__;
+ ____result.Message = __Message__;
+ return ____result;
+ }
+ }
+}
+
+#pragma warning restore 168
+#pragma warning restore 414
+#pragma warning restore 618
+#pragma warning restore 612
+
+#pragma warning restore SA1129 // Do not use default value type constructor
+#pragma warning restore SA1200 // Using directives should be placed correctly
+#pragma warning restore SA1309 // Field names should not begin with underscore
+#pragma warning restore SA1312 // Variable names should begin with lower-case letter
+#pragma warning restore SA1403 // File may only contain a single namespace
+#pragma warning restore SA1649 // File name should match first type name
+
diff --git a/Assets/Scripts/Generated/MessagePack.Generated.cs.meta b/Assets/Scripts/Generated/MessagePack.Generated.cs.meta
new file mode 100644
index 000000000..1758681bd
--- /dev/null
+++ b/Assets/Scripts/Generated/MessagePack.Generated.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 06622dddf17e3734bb11f4133d2427d8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/InitialSettings.cs b/Assets/Scripts/InitialSettings.cs
new file mode 100644
index 000000000..d6ede0e19
--- /dev/null
+++ b/Assets/Scripts/InitialSettings.cs
@@ -0,0 +1,24 @@
+using MessagePack;
+using MessagePack.Resolvers;
+using UnityEngine;
+
+namespace Assets.Scripts
+{
+ class InitialSettings
+ {
+ [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
+ static void RegisterResolvers()
+ {
+ // NOTE: Currently, CompositeResolver doesn't work on Unity IL2CPP build. Use StaticCompositeResolver instead of it.
+ StaticCompositeResolver.Instance.Register(
+ MagicOnion.Resolvers.MagicOnionResolver.Instance,
+ MessagePack.Resolvers.GeneratedResolver.Instance,
+ BuiltinResolver.Instance,
+ PrimitiveObjectResolver.Instance
+ );
+
+ MessagePackSerializer.DefaultOptions = MessagePackSerializer.DefaultOptions
+ .WithResolver(StaticCompositeResolver.Instance);
+ }
+ }
+}
diff --git a/Assets/Scripts/InitialSettings.cs.meta b/Assets/Scripts/InitialSettings.cs.meta
new file mode 100644
index 000000000..b033e9c5a
--- /dev/null
+++ b/Assets/Scripts/InitialSettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 642627729ca40a74d865e205a6001bb1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions.meta b/Assets/Scripts/MagicOnion.Abstractions.meta
new file mode 100644
index 000000000..4dc0b3d6f
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d10546c5ab03aee43ba1b004a61f0d8e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Client.meta b/Assets/Scripts/MagicOnion.Abstractions/Client.meta
new file mode 100644
index 000000000..350a54a85
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Client.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: aca11e9577c2fb24c9ff99ccac34dbba
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs b/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs
new file mode 100644
index 000000000..f839eda7b
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs
@@ -0,0 +1,22 @@
+using Grpc.Core;
+using MessagePack;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MagicOnion.Client
+{
+ public interface IResponseContext : IDisposable
+ {
+ Task ResponseHeadersAsync { get; }
+ Status GetStatus();
+ Metadata GetTrailers();
+ Type ResponseType { get; }
+ }
+
+ public interface IResponseContext : IResponseContext
+ {
+ Task ResponseAsync { get; }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs.meta
new file mode 100644
index 000000000..2d1c1af57
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Client/IResponseContext.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d1954ea03abc7c34fba72fdd2cd9a8bf
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs b/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs
new file mode 100644
index 000000000..91341d35b
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs
@@ -0,0 +1,132 @@
+using Grpc.Core;
+using MessagePack;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// Wrapped AsyncClientStreamingCall.
+ ///
+ public struct ClientStreamingResult : IDisposable
+ {
+ internal readonly TResponse rawValue;
+ internal readonly bool hasRawValue;
+ readonly AsyncClientStreamingCall inner;
+ readonly IClientStreamWriter requestStream;
+ readonly MessagePackSerializerOptions serializerOptions;
+
+ public ClientStreamingResult(TResponse rawValue)
+ {
+ this.hasRawValue = true;
+ this.rawValue = rawValue;
+ this.inner = null;
+ this.requestStream = null;
+ this.serializerOptions = null;
+ }
+
+ public ClientStreamingResult(AsyncClientStreamingCall inner, IClientStreamWriter requestStream, MessagePackSerializerOptions serializerOptions)
+ {
+ this.hasRawValue = false;
+ this.rawValue = default(TResponse);
+ this.inner = inner;
+ this.requestStream = requestStream;
+ this.serializerOptions = serializerOptions;
+ }
+
+ async Task Deserialize()
+ {
+ var bytes = await inner.ResponseAsync.ConfigureAwait(false);
+ return MessagePackSerializer.Deserialize(bytes, serializerOptions);
+ }
+
+ ///
+ /// Asynchronous call result.
+ ///
+ public Task ResponseAsync
+ {
+ get
+ {
+ if (hasRawValue)
+ {
+ return Task.FromResult(rawValue);
+ }
+ else
+ {
+ return Deserialize();
+ }
+ }
+ }
+
+ ///
+ /// Asynchronous access to response headers.
+ ///
+ public Task ResponseHeadersAsync
+ {
+ get
+ {
+ return this.inner.ResponseHeadersAsync;
+ }
+ }
+
+ ///
+ /// Async stream to send streaming requests.
+ ///
+ public IClientStreamWriter RequestStream
+ {
+ get
+ {
+ return this.requestStream;
+ }
+ }
+
+ ///
+ /// Allows awaiting this object directly.
+ ///
+ ///
+ public TaskAwaiter GetAwaiter()
+ {
+ return ResponseAsync.GetAwaiter();
+ }
+
+ ///
+ /// Gets the call status if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Status GetStatus()
+ {
+ return this.inner.GetStatus();
+ }
+
+ ///
+ /// Gets the call trailing metadata if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Metadata GetTrailers()
+ {
+ return this.inner.GetTrailers();
+ }
+
+ ///
+ /// Provides means to cleanup after the call.
+ /// If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything.
+ /// Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ /// As a result, all resources being used by the call should be released eventually.
+ ///
+ ///
+ /// Normally, there is no need for you to dispose the call unless you want to utilize the
+ /// "Cancel" semantics of invoking Dispose.
+ ///
+ public void Dispose()
+ {
+ if (this.inner != null)
+ {
+ this.inner.Dispose();
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs.meta
new file mode 100644
index 000000000..85a8dad32
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/ClientStreamingResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1e92d02db742a454fa25774f217806cb
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/CompilerServices.meta b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices.meta
new file mode 100644
index 000000000..8f191aa17
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cee65f2126c31d0418b29c422566e23b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs
new file mode 100644
index 000000000..c48747975
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Runtime.CompilerServices;
+using System.Security;
+
+namespace MagicOnion.CompilerServices
+{
+ public struct AsyncUnaryResultMethodBuilder
+ {
+ private AsyncTaskMethodBuilder methodBuilder;
+ private T result;
+ private bool haveResult;
+ private bool useBuilder;
+
+ public static AsyncUnaryResultMethodBuilder Create()
+ {
+ return new AsyncUnaryResultMethodBuilder() { methodBuilder = AsyncTaskMethodBuilder.Create() };
+ }
+
+ public void Start(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
+ {
+ methodBuilder.Start(ref stateMachine); // will provide the right ExecutionContext semantics
+ }
+
+ public void SetStateMachine(IAsyncStateMachine stateMachine)
+ {
+ methodBuilder.SetStateMachine(stateMachine);
+ }
+
+ public void SetResult(T result)
+ {
+ if (useBuilder)
+ {
+ methodBuilder.SetResult(result);
+ }
+ else
+ {
+ this.result = result;
+ haveResult = true;
+ }
+ }
+
+ public void SetException(Exception exception)
+ {
+ methodBuilder.SetException(exception);
+ }
+
+ public UnaryResult Task
+ {
+ get
+ {
+ if (haveResult)
+ {
+ return new UnaryResult(result);
+ }
+ else
+ {
+ useBuilder = true;
+ return new UnaryResult(methodBuilder.Task);
+ }
+ }
+ }
+
+ public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine)
+ where TAwaiter : INotifyCompletion
+ where TStateMachine : IAsyncStateMachine
+ {
+ useBuilder = true;
+ methodBuilder.AwaitOnCompleted(ref awaiter, ref stateMachine);
+ }
+
+ [SecuritySafeCritical]
+ public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine)
+ where TAwaiter : ICriticalNotifyCompletion
+ where TStateMachine : IAsyncStateMachine
+ {
+ useBuilder = true;
+ methodBuilder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs.meta
new file mode 100644
index 000000000..936f44948
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/CompilerServices/AsyncUnaryResultMethodBuilder.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 975c42469777f414fae46186971f0dc8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs b/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs
new file mode 100644
index 000000000..1d831c81a
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs
@@ -0,0 +1,95 @@
+using Grpc.Core;
+using MessagePack;
+using System;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// Wrapped AsyncDuplexStreamingCall.
+ ///
+ public struct DuplexStreamingResult : IDisposable
+ {
+ readonly AsyncDuplexStreamingCall inner;
+ readonly IClientStreamWriter requestStream;
+ readonly IAsyncStreamReader responseStream;
+
+ public DuplexStreamingResult(AsyncDuplexStreamingCall inner, IClientStreamWriter requestStream, IAsyncStreamReader responseStream, MessagePackSerializerOptions serializerOptions)
+ {
+ this.inner = inner;
+ this.requestStream = requestStream;
+ this.responseStream = responseStream;
+ }
+
+ public AsyncDuplexStreamingCall RawStreamingCall => inner;
+
+ ///
+ /// Async stream to read streaming responses.
+ ///
+ public IAsyncStreamReader ResponseStream
+ {
+ get
+ {
+ return responseStream;
+ }
+ }
+
+ ///
+ /// Async stream to send streaming requests.
+ ///
+ public IClientStreamWriter RequestStream
+ {
+ get
+ {
+ return requestStream;
+ }
+ }
+
+ ///
+ /// Asynchronous access to response headers.
+ ///
+ public Task ResponseHeadersAsync
+ {
+ get
+ {
+ return this.inner.ResponseHeadersAsync;
+ }
+ }
+
+ ///
+ /// Gets the call status if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Status GetStatus()
+ {
+ return this.inner.GetStatus();
+ }
+
+ ///
+ /// Gets the call trailing metadata if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Metadata GetTrailers()
+ {
+ return this.inner.GetTrailers();
+ }
+
+ ///
+ /// Provides means to cleanup after the call.
+ /// If the call has already finished normally (request stream has been completed and response stream has been fully read), doesn't do anything.
+ /// Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ /// As a result, all resources being used by the call should be released eventually.
+ ///
+ ///
+ /// Normally, there is no need for you to dispose the call unless you want to utilize the
+ /// "Cancel" semantics of invoking Dispose.
+ ///
+ public void Dispose()
+ {
+ if (this.inner != null)
+ {
+ this.inner.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs.meta
new file mode 100644
index 000000000..e1960e3c4
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/DuplexStreamingResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 383e96f82d4d6244b951f0fc83d49b63
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs b/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs
new file mode 100644
index 000000000..233d5f4c2
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// instruction for moc.exe, surround #if symbol with output code.
+ ///
+ [AttributeUsage(AttributeTargets.Method | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)]
+ public class GenerateDefineDebugAttribute : Attribute
+ {
+ public GenerateDefineDebugAttribute()
+ {
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs.meta
new file mode 100644
index 000000000..0b318ca66
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/GenerateDefineDebugAttribute.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ab20e13a7e0b6b644a42dbfa3b44afd3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IService.cs b/Assets/Scripts/MagicOnion.Abstractions/IService.cs
new file mode 100644
index 000000000..a2e5a3bfb
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IService.cs
@@ -0,0 +1,21 @@
+using Grpc.Core;
+using System;
+using System.Threading;
+
+namespace MagicOnion
+{
+ // used for MagicOnionEngine assembly scan for boostup analyze speed.
+ public interface IServiceMarker
+ {
+
+ }
+
+ public interface IService : IServiceMarker
+ {
+ TSelf WithOptions(CallOptions option);
+ TSelf WithHeaders(Metadata headers);
+ TSelf WithDeadline(DateTime deadline);
+ TSelf WithCancellationToken(CancellationToken cancellationToken);
+ TSelf WithHost(string host);
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IService.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/IService.cs.meta
new file mode 100644
index 000000000..beefef708
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IService.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 56677a2edb7ea644faf4846ad283b007
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs b/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs
new file mode 100644
index 000000000..abca4c5d9
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs
@@ -0,0 +1,15 @@
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ public interface IStreamingHubMarker
+ {
+ }
+
+ public interface IStreamingHub : IStreamingHubMarker, IServiceMarker
+ {
+ TSelf FireAndForget(); // if changed to get-only property, intellisense does not work on VS2017.
+ Task DisposeAsync();
+ Task WaitForDisconnect();
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs.meta
new file mode 100644
index 000000000..ccd0a48a8
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IStreamingHub.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5d0a5fcfa0834b84ea6ff4d77e478fb9
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs b/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs
new file mode 100644
index 000000000..51d77d7b9
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// Don't register on MagicOnionEngine.
+ ///
+ [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,AllowMultiple = false,Inherited = false)]
+ public class IgnoreAttribute : Attribute
+ {
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs.meta
new file mode 100644
index 000000000..01d3c6263
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/IgnoreAttribute.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0d13f2ed066fd874b8749ca248f42c51
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef b/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef
new file mode 100644
index 000000000..994b587b0
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef
@@ -0,0 +1,14 @@
+{
+ "name": "MagicOnion.Abstractions",
+ "references": [
+ "MessagePack"
+ ],
+ "optionalUnityReferences": [],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": []
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef.meta b/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef.meta
new file mode 100644
index 000000000..9c158d77e
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/MagicOnion.Abstractions.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 62b9d94cd08d5d047b266d42e8684cb8
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Server.meta b/Assets/Scripts/MagicOnion.Abstractions/Server.meta
new file mode 100644
index 000000000..b806c9bca
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Server.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c1f828ada0daa0843bfef8cc6ebda1bf
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs.meta b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs.meta
new file mode 100644
index 000000000..137710ef6
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 33588a48f556fba45b238f907a8ebc38
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs
new file mode 100644
index 000000000..0eb685db5
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MagicOnion.Server.Hubs
+{
+ [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+ public class MethodIdAttribute : Attribute
+ {
+ public readonly int MethodId;
+
+ public MethodIdAttribute(int methodId)
+ {
+ MethodId = methodId;
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs.meta
new file mode 100644
index 000000000..8377387c0
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/Server/Hubs/MethodIdAttribute.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1752261f18dd5f749b27216b7cbe81e3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs b/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs
new file mode 100644
index 000000000..668201239
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs
@@ -0,0 +1,80 @@
+using Grpc.Core;
+using MessagePack;
+using System;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// Wrapped AsyncServerStreamingCall.
+ ///
+ public struct ServerStreamingResult : IDisposable
+ {
+ readonly AsyncServerStreamingCall inner;
+ readonly IAsyncStreamReader responseStream;
+
+ public ServerStreamingResult(AsyncServerStreamingCall inner, IAsyncStreamReader responseStream, MessagePackSerializerOptions serializerOptions)
+ {
+ this.inner = inner;
+ this.responseStream = responseStream;
+ }
+
+ ///
+ /// Async stream to read streaming responses.
+ ///
+ public IAsyncStreamReader ResponseStream
+ {
+ get
+ {
+ return responseStream;
+ }
+ }
+
+ ///
+ /// Asynchronous access to response headers.
+ ///
+ public Task ResponseHeadersAsync
+ {
+ get
+ {
+ return this.inner.ResponseHeadersAsync;
+ }
+ }
+
+ ///
+ /// Gets the call status if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Status GetStatus()
+ {
+ return this.inner.GetStatus();
+ }
+
+ ///
+ /// Gets the call trailing metadata if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Metadata GetTrailers()
+ {
+ return this.inner.GetTrailers();
+ }
+
+ ///
+ /// Provides means to cleanup after the call.
+ /// If the call has already finished normally (response stream has been fully read), doesn't do anything.
+ /// Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ /// As a result, all resources being used by the call should be released eventually.
+ ///
+ ///
+ /// Normally, there is no need for you to dispose the call unless you want to utilize the
+ /// "Cancel" semantics of invoking Dispose.
+ ///
+ public void Dispose()
+ {
+ if (this.inner != null)
+ {
+ this.inner.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs.meta
new file mode 100644
index 000000000..720b34519
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/ServerStreamingResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 46a21c751ab9a4f4caf74e806bfe2bea
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs b/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs
new file mode 100644
index 000000000..1dee9f3f3
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs
@@ -0,0 +1,163 @@
+using Grpc.Core;
+using MagicOnion.Client;
+using MagicOnion.CompilerServices; // require this using in AsyncMethodBuilder
+using System;
+using System.Runtime.CompilerServices;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ ///
+ /// Wrapped AsyncUnaryCall.
+ ///
+#if NON_UNITY || (CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)))
+ [AsyncMethodBuilder(typeof(AsyncUnaryResultMethodBuilder<>))]
+#endif
+ public struct UnaryResult
+ {
+ internal readonly bool hasRawValue; // internal
+ internal readonly TResponse rawValue; // internal
+ internal readonly Task rawTaskValue; // internal
+
+ readonly Task> response;
+
+ public UnaryResult(TResponse rawValue)
+ {
+ this.hasRawValue = true;
+ this.rawValue = rawValue;
+ this.rawTaskValue = null;
+ this.response = null;
+ }
+
+ public UnaryResult(Task rawTaskValue)
+ {
+ this.hasRawValue = true;
+ this.rawValue = default(TResponse);
+ this.rawTaskValue = rawTaskValue;
+ this.response = null;
+ }
+
+ public UnaryResult(Task> response)
+ {
+ this.hasRawValue = false;
+ this.rawValue = default(TResponse);
+ this.rawTaskValue = null;
+ this.response = response;
+ }
+
+ ///
+ /// Asynchronous call result.
+ ///
+ public Task ResponseAsync
+ {
+ get
+ {
+ if (!hasRawValue)
+ {
+ return UnwrapResponse();
+ }
+ else if (rawTaskValue != null)
+ {
+ return rawTaskValue;
+ }
+ else
+ {
+ return Task.FromResult(rawValue);
+ }
+ }
+ }
+
+ ///
+ /// Asynchronous access to response headers.
+ ///
+ public Task ResponseHeadersAsync
+ {
+ get
+ {
+ return UnwrapResponseHeaders();
+ }
+ }
+
+ async Task UnwrapResponse()
+ {
+ var ctx = await response.ConfigureAwait(false);
+ return await ctx.ResponseAsync.ConfigureAwait(false);
+ }
+
+ async Task UnwrapResponseHeaders()
+ {
+ var ctx = await response.ConfigureAwait(false);
+ return await ctx.ResponseHeadersAsync.ConfigureAwait(false);
+ }
+
+ async void UnwrapDispose()
+ {
+ try
+ {
+ var ctx = await response.ConfigureAwait(false);
+ ctx.Dispose();
+ }
+ catch
+ {
+ }
+ }
+
+ IResponseContext TryUnwrap()
+ {
+ if (!response.IsCompleted)
+ {
+ throw new InvalidOperationException("UnaryResult request is not yet completed, please await before call this.");
+ }
+
+ return response.Result;
+ }
+
+ ///
+ /// Allows awaiting this object directly.
+ ///
+ public TaskAwaiter GetAwaiter()
+ {
+ return ResponseAsync.GetAwaiter();
+ }
+
+ ///
+ /// Gets the call status if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Status GetStatus()
+ {
+ return TryUnwrap().GetStatus();
+ }
+
+ ///
+ /// Gets the call trailing metadata if the call has already finished.
+ /// Throws InvalidOperationException otherwise.
+ ///
+ public Metadata GetTrailers()
+ {
+ return TryUnwrap().GetTrailers();
+ }
+
+ ///
+ /// Provides means to cleanup after the call.
+ /// If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything.
+ /// Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
+ /// As a result, all resources being used by the call should be released eventually.
+ ///
+ ///
+ /// Normally, there is no need for you to dispose the call unless you want to utilize the
+ /// "Cancel" semantics of invoking Dispose.
+ ///
+ public void Dispose()
+ {
+ if (!response.IsCompleted)
+ {
+ UnwrapDispose();
+ }
+ else
+ {
+ response.Result.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs.meta b/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs.meta
new file mode 100644
index 000000000..74faf56bd
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Abstractions/UnaryResult.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cc0fe0c16ad63fd489a131a76e925b08
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Unity.meta b/Assets/Scripts/MagicOnion.Unity.meta
new file mode 100644
index 000000000..b29f3eee6
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5ae2da7b7f80f014d9b6b4a9fd333eb1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs b/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs
new file mode 100644
index 000000000..0a79e520f
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs
@@ -0,0 +1,19 @@
+using Grpc.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace MagicOnion
+{
+ public static class ChannelExtensions
+ {
+ ///
+ /// Safety way for subscribe streaming events.
+ ///
+ public static void RegisterStreamingSubscription(this Channel channel, IDisposable subscription)
+ {
+ channel.ShutdownToken.Register(() => subscription.Dispose());
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs.meta b/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs.meta
new file mode 100644
index 000000000..5f149ce92
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/ChannelExtensions.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 88d6659672dcc9e408775f1fcaa6dea3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef b/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef
new file mode 100644
index 000000000..22efeb994
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef
@@ -0,0 +1,15 @@
+{
+ "name": "MagicOnion.Unity",
+ "references": [
+ "MagicOnion.Abstractions",
+ "MagicOnion"
+ ],
+ "optionalUnityReferences": [],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": []
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef.meta b/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef.meta
new file mode 100644
index 000000000..54059868b
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/MagicOnion.Unity.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 350d0af80fb7b7947a59de66ab477547
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs b/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs
new file mode 100644
index 000000000..5b17c4ca5
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs
@@ -0,0 +1,157 @@
+using Grpc.Core.Logging;
+using System;
+
+namespace MagicOnion
+{
+ public class UnityDebugLogger : ILogger
+ {
+ readonly Type forType;
+ readonly string forTypeString;
+ readonly bool errorToWarn = true; // default is true(gRPC internal log show to warn)
+
+ public UnityDebugLogger()
+ : this(null)
+ {
+ }
+
+ public UnityDebugLogger(bool errorToWarn)
+ : this(null)
+ {
+ this.errorToWarn = errorToWarn;
+ }
+
+ protected UnityDebugLogger(Type forType)
+ {
+ this.forType = forType;
+ if (forType != null)
+ {
+ var namespaceStr = forType.Namespace ?? "";
+ if (namespaceStr.Length > 0)
+ {
+ namespaceStr += ".";
+ }
+ this.forTypeString = namespaceStr + forType.Name + " ";
+ }
+ else
+ {
+ this.forTypeString = "";
+ }
+ }
+
+ ///
+ /// Returns a logger associated with the specified type.
+ ///
+ public virtual ILogger ForType()
+ {
+ if (typeof(T) == forType)
+ {
+ return this;
+ }
+ return new UnityDebugLogger(typeof(T));
+ }
+
+ /// Logs a message with severity Debug.
+ public void Debug(string message)
+ {
+ UnityEngine.Debug.Log(BuildMessage(message));
+ }
+
+ /// Logs a formatted message with severity Debug.
+ public void Debug(string format, params object[] formatArgs)
+ {
+ UnityEngine.Debug.Log(BuildMessage(format, formatArgs));
+ }
+
+ /// Logs a message with severity Info.
+ public void Info(string message)
+ {
+ UnityEngine.Debug.Log(BuildMessage(message));
+ }
+
+ /// Logs a formatted message with severity Info.
+ public void Info(string format, params object[] formatArgs)
+ {
+ UnityEngine.Debug.Log(BuildMessage(format, formatArgs));
+ }
+
+ /// Logs a message with severity Warning.
+ public void Warning(string message)
+ {
+ UnityEngine.Debug.LogWarning(BuildMessage(message));
+ }
+
+ /// Logs a formatted message with severity Warning.
+ public void Warning(string format, params object[] formatArgs)
+ {
+ UnityEngine.Debug.LogWarning(BuildMessage(format, formatArgs));
+ }
+
+ /// Logs a message and an associated exception with severity Warning.
+ public void Warning(Exception exception, string message)
+ {
+ Warning(message + " " + exception);
+ }
+
+ /// Logs a message with severity Error.
+ public void Error(string message)
+ {
+ if (errorToWarn)
+ {
+ UnityEngine.Debug.LogWarning(BuildMessage(message));
+ }
+ else
+ {
+ UnityEngine.Debug.LogError(BuildMessage(message));
+ }
+ }
+
+ /// Logs a formatted message with severity Error.
+ public void Error(string format, params object[] formatArgs)
+ {
+ if (errorToWarn)
+ {
+ UnityEngine.Debug.LogWarning(BuildMessage(format, formatArgs));
+ }
+ else
+ {
+ UnityEngine.Debug.LogError(BuildMessage(format, formatArgs));
+ }
+ }
+
+ /// Logs a message and an associated exception with severity Error.
+ public void Error(Exception exception, string message)
+ {
+ Error(message + " " + exception);
+ }
+
+ /// Gets the type associated with this logger.
+ protected Type AssociatedType
+ {
+ get { return forType; }
+ }
+
+ string BuildMessage(string message)
+ {
+ if (forType != null)
+ {
+ return forTypeString + message;
+ }
+ else
+ {
+ return message;
+ }
+ }
+
+ string BuildMessage(string format, object[] args)
+ {
+ if (forType != null)
+ {
+ return forTypeString + string.Format(format, args);
+ }
+ else
+ {
+ return string.Format(format, args);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs.meta b/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs.meta
new file mode 100644
index 000000000..728e9ab29
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.Unity/UnityDebugLogger.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5a9b20988ba163244a107c806f58c14f
+timeCreated: 1482380673
+licenseType: Pro
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion.meta b/Assets/Scripts/MagicOnion.meta
new file mode 100644
index 000000000..ac68c5c69
--- /dev/null
+++ b/Assets/Scripts/MagicOnion.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f6943e9ecc1ad0b40a72d928039e3205
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion/AsyncLock.cs b/Assets/Scripts/MagicOnion/AsyncLock.cs
new file mode 100644
index 000000000..67aae46b5
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/AsyncLock.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ public class AsyncLock
+ {
+ readonly SemaphoreSlim semaphore;
+
+#if NON_UNITY
+ public static readonly ValueTask EmptyLock = new ValueTask(new LockReleaser(null));
+#endif
+
+ public AsyncLock()
+ {
+ this.semaphore = new SemaphoreSlim(1, 1);
+ }
+
+#if NON_UNITY
+ public async ValueTask LockAsync()
+#else
+ public async Task LockAsync()
+#endif
+ {
+ await semaphore.WaitAsync().ConfigureAwait(false);
+ return new LockReleaser(semaphore);
+ }
+
+ public struct LockReleaser : IDisposable
+ {
+ readonly SemaphoreSlim semaphore;
+
+ public LockReleaser(SemaphoreSlim semaphore)
+ {
+ this.semaphore = semaphore;
+ }
+
+ public void Dispose()
+ {
+ semaphore?.Release();
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion/AsyncLock.cs.meta b/Assets/Scripts/MagicOnion/AsyncLock.cs.meta
new file mode 100644
index 000000000..c550f033d
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/AsyncLock.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9a1fdda349d00b84596da99fbda0426d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs b/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs
new file mode 100644
index 000000000..b5e519973
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs
@@ -0,0 +1,35 @@
+using Grpc.Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MagicOnion
+{
+ public static class AsyncStreamReaderExtensions
+ {
+ public static async Task ForEachAsync(this IAsyncStreamReader stream, Action action, CancellationToken cancellation = default(CancellationToken))
+ {
+ using (stream as IDisposable)
+ {
+ while (!cancellation.IsCancellationRequested && await stream.MoveNext(cancellation))
+ {
+ action(stream.Current);
+ }
+ }
+ }
+
+ public static async Task ForEachAsync(this IAsyncStreamReader stream, Func asyncAction, CancellationToken cancellation = default(CancellationToken))
+ {
+ using (stream as IDisposable)
+ {
+ while (!cancellation.IsCancellationRequested && await stream.MoveNext(cancellation))
+ {
+ await asyncAction(stream.Current);
+ }
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs.meta b/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs.meta
new file mode 100644
index 000000000..174ca9deb
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/AsyncStreamReaderExtensions.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eccd314ac5c4f71499ebad65fd6d3ecf
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion/Client.meta b/Assets/Scripts/MagicOnion/Client.meta
new file mode 100644
index 000000000..577dc994f
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/Client.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f41f5b00e235ac44d8d3aaea561952a3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion/Client/ClientFilter.cs b/Assets/Scripts/MagicOnion/Client/ClientFilter.cs
new file mode 100644
index 000000000..8559a04d2
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/Client/ClientFilter.cs
@@ -0,0 +1,213 @@
+using Grpc.Core;
+using MessagePack;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MagicOnion.Client
+{
+ public interface IClientFilter
+ {
+ ValueTask SendAsync(RequestContext context, Func> next);
+ }
+
+ public abstract class RequestContext
+ {
+ static readonly Func DefaultMutator = xs => xs;
+
+ public string MethodPath { get; }
+ public CallOptions CallOptions { get; }
+ public Type ResponseType { get; }
+ public abstract Type RequestType { get; }
+ public Func RequestMutator { get; private set; }
+ public Func ResponseMutator { get; private set; }
+
+ Dictionary items;
+ public IDictionary Items
+ {
+ get
+ {
+ if (items == null)
+ {
+ items = new Dictionary();
+ }
+ return items;
+ }
+ }
+
+ // internal use to avoid lambda capture.
+ internal MagicOnionClientBase Client { get; }
+ internal IClientFilter[] Filters { get; }
+ internal Func RequestMethod { get; }
+
+ internal RequestContext(MagicOnionClientBase client, string methodPath, CallOptions callOptions, Type responseType, IClientFilter[] filters, Func requestMethod)
+ {
+ this.Client = client;
+ this.MethodPath = methodPath;
+ this.CallOptions = callOptions;
+ this.ResponseType = responseType;
+ this.Filters = filters;
+ this.RequestMethod = requestMethod;
+ this.RequestMutator = DefaultMutator;
+ this.ResponseMutator = DefaultMutator;
+ }
+
+ public void SetRequestMutator(Func mutator)
+ {
+ this.RequestMutator = mutator;
+ }
+
+ public void SetResponseMutator(Func mutator)
+ {
+ this.ResponseMutator = mutator;
+ }
+ }
+
+ public class RequestContext : RequestContext
+ {
+ public T Request { get; }
+ public override Type RequestType => typeof(T);
+
+ public RequestContext(T request, MagicOnionClientBase client, string methodPath, CallOptions callOptions, Type responseType, IClientFilter[] filters, Func requestMethod)
+ : base(client, methodPath, callOptions, responseType, filters, requestMethod)
+ {
+ this.Request = request;
+ }
+ }
+
+ public abstract class ResponseContext : IResponseContext
+ {
+ static readonly Func DefaultMutator = xs => xs;
+
+ public abstract Task ResponseHeadersAsync { get; }
+ public abstract Status GetStatus();
+ public abstract Metadata GetTrailers();
+ public abstract void Dispose();
+ public abstract Type ResponseType { get; }
+ public Func ResponseMutator { get; private set; }
+
+ public abstract Task WaitResponseAsync();
+
+ public ResponseContext As()
+ {
+ return this as ResponseContext;
+ }
+
+ public Task GetResponseAs()
+ {
+ var t = this as ResponseContext;
+ if (t == null) return Task.FromResult(default(T));
+
+ return t.ResponseAsync;
+ }
+
+ public ResponseContext()
+ {
+ this.ResponseMutator = DefaultMutator;
+ }
+
+ public void SetResponseMutator(Func mutator)
+ {
+ this.ResponseMutator = mutator;
+ }
+ }
+
+ public sealed class ResponseContext : ResponseContext, IResponseContext
+ {
+ readonly AsyncUnaryCall inner;
+ readonly MessagePackSerializerOptions serializerOptions;
+ readonly bool isMock;
+ bool deserialized;
+
+ T responseObject; // cache value.
+
+ // mock
+ readonly Metadata trailers;
+ readonly Metadata responseHeaders;
+ readonly Status status;
+
+ public ResponseContext(AsyncUnaryCall inner, MessagePackSerializerOptions serializerOptions)
+ : base()
+ {
+ this.isMock = false;
+ this.inner = inner;
+ this.serializerOptions = serializerOptions;
+ }
+
+ public ResponseContext(T responseObject)
+ : this(responseObject, new Metadata(), new Metadata(), Status.DefaultSuccess)
+ {
+ }
+
+ public ResponseContext(T responseObject, Metadata trailers, Metadata responseHeaders, Status status)
+ : base()
+ {
+ this.isMock = true;
+ this.responseObject = responseObject;
+ this.trailers = trailers;
+ this.responseHeaders = responseHeaders;
+ this.status = status;
+ }
+
+ async Task Deserialize()
+ {
+ if (deserialized)
+ {
+ return responseObject;
+ }
+ else
+ {
+ var bytes = await inner.ResponseAsync.ConfigureAwait(false);
+ responseObject = MessagePackSerializer.Deserialize(this.ResponseMutator(bytes), serializerOptions);
+ deserialized = true;
+ return responseObject;
+ }
+ }
+
+ public Task ResponseAsync => !isMock ? Deserialize() : Task.FromResult(responseObject);
+
+ public override async Task WaitResponseAsync()
+ {
+ await ResponseAsync;
+ return this;
+ }
+
+ public override Type ResponseType => typeof(T);
+
+ public override Task ResponseHeadersAsync => !isMock ? inner.ResponseHeadersAsync : Task.FromResult(responseHeaders);
+
+ public override void Dispose()
+ {
+ if (!isMock)
+ {
+ inner.Dispose();
+ }
+ }
+
+ public override Status GetStatus()
+ {
+ return !isMock ? inner.GetStatus() : status;
+ }
+
+ public override Metadata GetTrailers()
+ {
+ return !isMock ? inner.GetTrailers() : trailers;
+ }
+
+ public ResponseContext WithNewResult(T result)
+ {
+ if (isMock)
+ {
+ return new ResponseContext(result, trailers, responseHeaders, status);
+ }
+ else
+ {
+ var newContext = new ResponseContext(inner, serializerOptions);
+ newContext.deserialized = true;
+ newContext.responseObject = result;
+ return newContext;
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/MagicOnion/Client/ClientFilter.cs.meta b/Assets/Scripts/MagicOnion/Client/ClientFilter.cs.meta
new file mode 100644
index 000000000..043460c04
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/Client/ClientFilter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d0190394f8c415b4b84aa1b95b993369
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/MagicOnion/Client/DynamicClientBuilder.cs b/Assets/Scripts/MagicOnion/Client/DynamicClientBuilder.cs
new file mode 100644
index 000000000..aac28db06
--- /dev/null
+++ b/Assets/Scripts/MagicOnion/Client/DynamicClientBuilder.cs
@@ -0,0 +1,628 @@
+#if NON_UNITY || !NET_STANDARD_2_0
+
+using Grpc.Core;
+using MagicOnion.Utils;
+using MessagePack;
+using System;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MagicOnion.Client
+{
+#if ENABLE_SAVE_ASSEMBLY
+ public
+#else
+ internal
+#endif
+ static class DynamicClientAssemblyHolder
+ {
+ public const string ModuleName = "MagicOnion.Client.DynamicClient";
+
+ readonly static DynamicAssembly assembly;
+ public static DynamicAssembly Assembly { get { return assembly; } }
+
+ static DynamicClientAssemblyHolder()
+ {
+ assembly = new DynamicAssembly(ModuleName);
+ }
+
+#if ENABLE_SAVE_ASSEMBLY
+
+ public static AssemblyBuilder Save()
+ {
+ return assembly.Save();
+ }
+
+#endif
+ }
+
+#if ENABLE_SAVE_ASSEMBLY
+ public
+#else
+ internal
+#endif
+ static class DynamicClientBuilder
+ where T : IService
+ {
+ public static readonly Type ClientType;
+ static readonly Type bytesMethod = typeof(Method<,>).MakeGenericType(new[] { typeof(byte[]), typeof(byte[]) });
+ static readonly FieldInfo throughMarshaller = typeof(MagicOnionMarshallers).GetField("ThroughMarshaller", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
+ static readonly FieldInfo nilBytes = typeof(MagicOnionMarshallers).GetField("UnsafeNilBytes", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
+ static readonly MethodInfo callMessagePackSerialize = typeof(MessagePackSerializer).GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
+ .First(x => x.Name == "Serialize" && x.GetParameters().Length == 3 && x.ReturnType == typeof(byte[]));
+ static readonly MethodInfo callCancellationTokenNone = typeof(CancellationToken).GetProperty("None", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).GetGetMethod();
+
+ static DynamicClientBuilder()
+ {
+ var t = typeof(T);
+ var ti = t.GetTypeInfo();
+ if (!ti.IsInterface) throw new Exception("Client Proxy only allows interface. Type:" + ti.Name);
+
+ var asm = DynamicClientAssemblyHolder.Assembly;
+ var methodDefinitions = SearchDefinitions(t);
+
+ var parentType = typeof(MagicOnionClientBase<>).MakeGenericType(t);
+ var typeBuilder = asm.DefineType($"{DynamicClientAssemblyHolder.ModuleName}.{ti.FullName}Client", TypeAttributes.Public, parentType, new Type[] { t });
+
+ // Set `IgnoreAttribute` to the generated client type. Hides generated-types from building MagicOnion service definitions.
+ typeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(IgnoreAttribute).GetConstructor(Array.Empty()), Array.Empty