From f3926c5c6a90f1f134f10f97efbaca5a94c02c0d Mon Sep 17 00:00:00 2001 From: Tim Burks Date: Tue, 30 May 2017 13:38:12 -0700 Subject: [PATCH] Change access level for generated classes and methods from "public" to "internal". "public" is replaced by a template parameter which is currently hard-coded to "internal". --- Examples/Datastore/PackageManager/RUNME | 2 - Examples/Echo/Generated/echo.client.pb.swift | 50 +++++++++---------- Examples/Echo/Generated/echo.pb.swift | 36 ++++++------- Examples/Echo/Generated/echo.server.pb.swift | 44 ++++++++-------- Examples/Echo/RUNME | 2 +- .../Sources/protoc-gen-swiftgrpc/main.swift | 2 +- .../protoc-gen-swiftgrpc/templates.swift | 20 ++++---- .../Templates/client-call-bidistreaming.swift | 12 ++--- .../client-call-clientstreaming.swift | 8 +-- .../client-call-serverstreaming.swift | 6 +-- Plugin/Templates/client-call-unary.swift | 2 +- Plugin/Templates/client.pb.swift | 22 ++++---- .../server-session-bidistreaming.swift | 8 +-- .../server-session-clientstreaming.swift | 6 +-- .../server-session-serverstreaming.swift | 4 +- Plugin/Templates/server-session-unary.swift | 2 +- Plugin/Templates/server.pb.swift | 24 ++++----- README.md | 24 --------- 18 files changed, 124 insertions(+), 150 deletions(-) diff --git a/Examples/Datastore/PackageManager/RUNME b/Examples/Datastore/PackageManager/RUNME index 324ebf0b6..719b67625 100755 --- a/Examples/Datastore/PackageManager/RUNME +++ b/Examples/Datastore/PackageManager/RUNME @@ -16,8 +16,6 @@ protoc \ googleapis/google/type/latlng.proto \ -Igoogleapis \ --swift_out=googleapis \ - --swift_opt=Visibility=Public \ - --plugin=$HOME/local/bin/protoc-gen-swift \ --swiftgrpc_out=Sources # move swift files to this directory diff --git a/Examples/Echo/Generated/echo.client.pb.swift b/Examples/Echo/Generated/echo.client.pb.swift index 6445af2b9..25bd8d92c 100644 --- a/Examples/Echo/Generated/echo.client.pb.swift +++ b/Examples/Echo/Generated/echo.client.pb.swift @@ -44,14 +44,14 @@ import Dispatch import gRPC /// Type for errors thrown from generated client code. -public enum Echo_EchoClientError : Error { +internal enum Echo_EchoClientError : Error { case endOfStream case invalidMessageReceived case error(c: CallResult) } /// Get (Unary) -public class Echo_EchoGetCall { +internal class Echo_EchoGetCall { private var call : Call /// Create a call. @@ -101,7 +101,7 @@ public class Echo_EchoGetCall { } /// Expand (Server Streaming) -public class Echo_EchoExpandCall { +internal class Echo_EchoExpandCall { private var call : Call /// Create a call. @@ -123,7 +123,7 @@ public class Echo_EchoExpandCall { } /// Call this to wait for a result. Blocking. - public func receive() throws -> Echo_EchoResponse { + internal func receive() throws -> Echo_EchoResponse { var returnError : Echo_EchoClientError? var returnResponse : Echo_EchoResponse! let sem = DispatchSemaphore(value: 0) @@ -142,7 +142,7 @@ public class Echo_EchoExpandCall { } /// Call this to wait for a result. Nonblocking. - public func receive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) throws { + internal func receive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) throws { do { try call.receiveMessage() {(responseData) in if let responseData = responseData { @@ -160,7 +160,7 @@ public class Echo_EchoExpandCall { } /// Collect (Client Streaming) -public class Echo_EchoCollectCall { +internal class Echo_EchoCollectCall { private var call : Call /// Create a call. @@ -176,13 +176,13 @@ public class Echo_EchoCollectCall { } /// Call this to send each message in the request stream. Nonblocking. - public func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws { + internal func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws { let messageData = try message.serializedData() try call.sendMessage(data:messageData, errorHandler:errorHandler) } /// Call this to close the connection and wait for a response. Blocking. - public func closeAndReceive() throws -> Echo_EchoResponse { + internal func closeAndReceive() throws -> Echo_EchoResponse { var returnError : Echo_EchoClientError? var returnResponse : Echo_EchoResponse! let sem = DispatchSemaphore(value: 0) @@ -203,7 +203,7 @@ public class Echo_EchoCollectCall { } /// Call this to close the connection and wait for a response. Nonblocking. - public func closeAndReceive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) + internal func closeAndReceive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) throws { do { try call.receiveMessage() {(responseData) in @@ -222,7 +222,7 @@ public class Echo_EchoCollectCall { } /// Update (Bidirectional Streaming) -public class Echo_EchoUpdateCall { +internal class Echo_EchoUpdateCall { private var call : Call /// Create a call. @@ -238,7 +238,7 @@ public class Echo_EchoUpdateCall { } /// Call this to wait for a result. Blocking. - public func receive() throws -> Echo_EchoResponse { + internal func receive() throws -> Echo_EchoResponse { var returnError : Echo_EchoClientError? var returnMessage : Echo_EchoResponse! let sem = DispatchSemaphore(value: 0) @@ -257,7 +257,7 @@ public class Echo_EchoUpdateCall { } /// Call this to wait for a result. Nonblocking. - public func receive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) throws { + internal func receive(completion:@escaping (Echo_EchoResponse?, Echo_EchoClientError?)->()) throws { do { try call.receiveMessage() {(data) in if let data = data { @@ -274,13 +274,13 @@ public class Echo_EchoUpdateCall { } /// Call this to send each message in the request stream. - public func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws { + internal func send(_ message:Echo_EchoRequest, errorHandler:@escaping (Error)->()) throws { let messageData = try message.serializedData() try call.sendMessage(data:messageData, errorHandler:errorHandler) } /// Call this to close the sending connection. Blocking. - public func closeSend() throws { + internal func closeSend() throws { let sem = DispatchSemaphore(value: 0) try closeSend() { sem.signal() @@ -289,7 +289,7 @@ public class Echo_EchoUpdateCall { } /// Call this to close the sending connection. Nonblocking. - public func closeSend(completion:@escaping ()->()) throws { + internal func closeSend(completion:@escaping ()->()) throws { try call.close() { completion() } @@ -297,16 +297,16 @@ public class Echo_EchoUpdateCall { } /// Call methods of this class to make API calls. -public class Echo_EchoService { +internal class Echo_EchoService { private var channel: Channel /// This metadata will be sent with all requests. - public var metadata : Metadata + internal var metadata : Metadata /// This property allows the service host name to be overridden. /// For example, it can be used to make calls to "localhost:8080" /// appear to be to "example.com". - public var host : String { + internal var host : String { get { return self.channel.host } @@ -316,27 +316,27 @@ public class Echo_EchoService { } /// Create a client that makes insecure connections. - public init(address: String) { + internal init(address: String) { gRPC.initialize() channel = Channel(address:address) metadata = Metadata() } /// Create a client that makes secure connections. - public init(address: String, certificates: String?, host: String?) { + internal init(address: String, certificates: String?, host: String?) { gRPC.initialize() channel = Channel(address:address, certificates:certificates, host:host) metadata = Metadata() } /// Synchronous. Unary. - public func get(_ request: Echo_EchoRequest) + internal func get(_ request: Echo_EchoRequest) throws -> Echo_EchoResponse { return try Echo_EchoGetCall(channel).run(request:request, metadata:metadata) } /// Asynchronous. Unary. - public func get(_ request: Echo_EchoRequest, + internal func get(_ request: Echo_EchoRequest, completion: @escaping (Echo_EchoResponse?, CallResult)->()) throws -> Echo_EchoGetCall { @@ -347,7 +347,7 @@ public class Echo_EchoService { /// Asynchronous. Server-streaming. /// Send the initial message. /// Use methods on the returned object to get streamed responses. - public func expand(_ request: Echo_EchoRequest, completion: @escaping (CallResult)->()) + internal func expand(_ request: Echo_EchoRequest, completion: @escaping (CallResult)->()) throws -> Echo_EchoExpandCall { return try Echo_EchoExpandCall(channel).start(request:request, metadata:metadata, completion:completion) @@ -355,7 +355,7 @@ public class Echo_EchoService { /// Asynchronous. Client-streaming. /// Use methods on the returned object to stream messages and /// to close the connection and wait for a final response. - public func collect(completion: @escaping (CallResult)->()) + internal func collect(completion: @escaping (CallResult)->()) throws -> Echo_EchoCollectCall { return try Echo_EchoCollectCall(channel).start(metadata:metadata, completion:completion) @@ -363,7 +363,7 @@ public class Echo_EchoService { /// Asynchronous. Bidirectional-streaming. /// Use methods on the returned object to stream messages, /// to wait for replies, and to close the connection. - public func update(completion: @escaping (CallResult)->()) + internal func update(completion: @escaping (CallResult)->()) throws -> Echo_EchoUpdateCall { return try Echo_EchoUpdateCall(channel).start(metadata:metadata, completion:completion) diff --git a/Examples/Echo/Generated/echo.pb.swift b/Examples/Echo/Generated/echo.pb.swift index 3b30d70d6..9ab2df4c9 100644 --- a/Examples/Echo/Generated/echo.pb.swift +++ b/Examples/Echo/Generated/echo.pb.swift @@ -33,17 +33,17 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _1 } -public struct Echo_EchoRequest: SwiftProtobuf.Message { - public static let protoMessageName: String = _protobuf_package + ".EchoRequest" +struct Echo_EchoRequest: SwiftProtobuf.Message { + static let protoMessageName: String = _protobuf_package + ".EchoRequest" /// The text of a message to be echoed. - public var text: String = String() + var text: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { switch fieldNumber { case 1: try decoder.decodeSingularStringField(value: &self.text) @@ -52,7 +52,7 @@ public struct Echo_EchoRequest: SwiftProtobuf.Message { } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.text.isEmpty { try visitor.visitSingularStringField(value: self.text, fieldNumber: 1) } @@ -60,17 +60,17 @@ public struct Echo_EchoRequest: SwiftProtobuf.Message { } } -public struct Echo_EchoResponse: SwiftProtobuf.Message { - public static let protoMessageName: String = _protobuf_package + ".EchoResponse" +struct Echo_EchoResponse: SwiftProtobuf.Message { + static let protoMessageName: String = _protobuf_package + ".EchoResponse" /// The text of an echo response. - public var text: String = String() + var text: String = String() - public var unknownFields = SwiftProtobuf.UnknownStorage() + var unknownFields = SwiftProtobuf.UnknownStorage() - public init() {} + init() {} - public mutating func decodeMessage(decoder: inout D) throws { + mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { switch fieldNumber { case 1: try decoder.decodeSingularStringField(value: &self.text) @@ -79,7 +79,7 @@ public struct Echo_EchoResponse: SwiftProtobuf.Message { } } - public func traverse(visitor: inout V) throws { + func traverse(visitor: inout V) throws { if !self.text.isEmpty { try visitor.visitSingularStringField(value: self.text, fieldNumber: 1) } @@ -92,11 +92,11 @@ public struct Echo_EchoResponse: SwiftProtobuf.Message { fileprivate let _protobuf_package = "echo" extension Echo_EchoRequest: SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "text"), ] - public func _protobuf_generated_isEqualTo(other: Echo_EchoRequest) -> Bool { + func _protobuf_generated_isEqualTo(other: Echo_EchoRequest) -> Bool { if self.text != other.text {return false} if unknownFields != other.unknownFields {return false} return true @@ -104,11 +104,11 @@ extension Echo_EchoRequest: SwiftProtobuf._MessageImplementationBase, SwiftProto } extension Echo_EchoResponse: SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - public static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "text"), ] - public func _protobuf_generated_isEqualTo(other: Echo_EchoResponse) -> Bool { + func _protobuf_generated_isEqualTo(other: Echo_EchoResponse) -> Bool { if self.text != other.text {return false} if unknownFields != other.unknownFields {return false} return true diff --git a/Examples/Echo/Generated/echo.server.pb.swift b/Examples/Echo/Generated/echo.server.pb.swift index f95a88553..b093fe235 100644 --- a/Examples/Echo/Generated/echo.server.pb.swift +++ b/Examples/Echo/Generated/echo.server.pb.swift @@ -44,12 +44,12 @@ import Dispatch import gRPC /// Type for errors thrown from generated server code. -public enum Echo_EchoServerError : Error { +internal enum Echo_EchoServerError : Error { case endOfStream } /// To build a server, implement a class that conforms to this protocol. -public protocol Echo_EchoProvider { +internal protocol Echo_EchoProvider { func get(request : Echo_EchoRequest, session : Echo_EchoGetSession) throws -> Echo_EchoResponse func expand(request : Echo_EchoRequest, session : Echo_EchoExpandSession) throws func collect(session : Echo_EchoCollectSession) throws @@ -57,14 +57,14 @@ public protocol Echo_EchoProvider { } /// Common properties available in each service session. -public class Echo_EchoSession { +internal class Echo_EchoSession { fileprivate var handler : gRPC.Handler - public var requestMetadata : Metadata { return handler.requestMetadata } + internal var requestMetadata : Metadata { return handler.requestMetadata } - public var statusCode : Int = 0 - public var statusMessage : String = "OK" - public var initialMetadata : Metadata = Metadata() - public var trailingMetadata : Metadata = Metadata() + internal var statusCode : Int = 0 + internal var statusMessage : String = "OK" + internal var initialMetadata : Metadata = Metadata() + internal var trailingMetadata : Metadata = Metadata() fileprivate init(handler:gRPC.Handler) { self.handler = handler @@ -72,7 +72,7 @@ public class Echo_EchoSession { } // Get (Unary) -public class Echo_EchoGetSession : Echo_EchoSession { +internal class Echo_EchoGetSession : Echo_EchoSession { private var provider : Echo_EchoProvider /// Create a session. @@ -97,7 +97,7 @@ public class Echo_EchoGetSession : Echo_EchoSession { } // Expand (Server Streaming) -public class Echo_EchoExpandSession : Echo_EchoSession { +internal class Echo_EchoExpandSession : Echo_EchoSession { private var provider : Echo_EchoProvider /// Create a session. @@ -107,7 +107,7 @@ public class Echo_EchoExpandSession : Echo_EchoSession { } /// Send a message. Nonblocking. - public func send(_ response: Echo_EchoResponse) throws { + internal func send(_ response: Echo_EchoResponse) throws { try handler.sendResponse(message:response.serializedData()) {} } @@ -139,7 +139,7 @@ public class Echo_EchoExpandSession : Echo_EchoSession { } // Collect (Client Streaming) -public class Echo_EchoCollectSession : Echo_EchoSession { +internal class Echo_EchoCollectSession : Echo_EchoSession { private var provider : Echo_EchoProvider /// Create a session. @@ -149,7 +149,7 @@ public class Echo_EchoCollectSession : Echo_EchoSession { } /// Receive a message. Blocks until a message is received or the client closes the connection. - public func receive() throws -> Echo_EchoRequest { + internal func receive() throws -> Echo_EchoRequest { let sem = DispatchSemaphore(value: 0) var requestMessage : Echo_EchoRequest? try self.handler.receiveMessage() {(requestData) in @@ -166,7 +166,7 @@ public class Echo_EchoCollectSession : Echo_EchoSession { } /// Send a response and close the connection. - public func sendAndClose(_ response: Echo_EchoResponse) throws { + internal func sendAndClose(_ response: Echo_EchoResponse) throws { try self.handler.sendResponse(message:response.serializedData(), statusCode:self.statusCode, statusMessage:self.statusMessage, @@ -188,7 +188,7 @@ public class Echo_EchoCollectSession : Echo_EchoSession { } // Update (Bidirectional Streaming) -public class Echo_EchoUpdateSession : Echo_EchoSession { +internal class Echo_EchoUpdateSession : Echo_EchoSession { private var provider : Echo_EchoProvider /// Create a session. @@ -198,7 +198,7 @@ public class Echo_EchoUpdateSession : Echo_EchoSession { } /// Receive a message. Blocks until a message is received or the client closes the connection. - public func receive() throws -> Echo_EchoRequest { + internal func receive() throws -> Echo_EchoRequest { let sem = DispatchSemaphore(value: 0) var requestMessage : Echo_EchoRequest? try self.handler.receiveMessage() {(requestData) in @@ -220,12 +220,12 @@ public class Echo_EchoUpdateSession : Echo_EchoSession { } /// Send a message. Nonblocking. - public func send(_ response: Echo_EchoResponse) throws { + internal func send(_ response: Echo_EchoResponse) throws { try handler.sendResponse(message:response.serializedData()) {} } /// Close a connection. Blocks until the connection is closed. - public func close() throws { + internal func close() throws { let sem = DispatchSemaphore(value: 0) try self.handler.sendStatus(statusCode:self.statusCode, statusMessage:self.statusMessage, @@ -251,13 +251,13 @@ public class Echo_EchoUpdateSession : Echo_EchoSession { /// Main server for generated service -public class Echo_EchoServer { +internal class Echo_EchoServer { private var address: String private var server: gRPC.Server private var provider: Echo_EchoProvider? /// Create a server that accepts insecure connections. - public init(address:String, + internal init(address:String, provider:Echo_EchoProvider) { gRPC.initialize() self.address = address @@ -266,7 +266,7 @@ public class Echo_EchoServer { } /// Create a server that accepts secure connections. - public init?(address:String, + internal init?(address:String, certificateURL:URL, keyURL:URL, provider:Echo_EchoProvider) { @@ -283,7 +283,7 @@ public class Echo_EchoServer { } /// Start the server. - public func start(queue:DispatchQueue = DispatchQueue.global()) { + internal func start(queue:DispatchQueue = DispatchQueue.global()) { guard let provider = self.provider else { assert(false) // the server requires a provider } diff --git a/Examples/Echo/RUNME b/Examples/Echo/RUNME index cc5b4c0a5..c3db72e31 100644 --- a/Examples/Echo/RUNME +++ b/Examples/Echo/RUNME @@ -2,4 +2,4 @@ # # Use this to run the swift-proto generator # -protoc echo.proto --swift_out=. --swift_opt=Visibility=Public --plugin=$HOME/local/bin/protoc-gen-swift +protoc echo.proto --swift_out=./Generated diff --git a/Plugin/Sources/protoc-gen-swiftgrpc/main.swift b/Plugin/Sources/protoc-gen-swiftgrpc/main.swift index 65aada89e..79fffc5e4 100644 --- a/Plugin/Sources/protoc-gen-swiftgrpc/main.swift +++ b/Plugin/Sources/protoc-gen-swiftgrpc/main.swift @@ -105,7 +105,7 @@ func main() throws { if file.service.count > 0 { // generate separate implementation files for client and server - let context : [String:Any] = ["file": file] + let context : [String:Any] = ["file": file, "access": "internal"] do { let clientFileName = package + ".client.pb.swift" diff --git a/Plugin/Sources/protoc-gen-swiftgrpc/templates.swift b/Plugin/Sources/protoc-gen-swiftgrpc/templates.swift index fb084dcc1..a428c96f8 100644 --- a/Plugin/Sources/protoc-gen-swiftgrpc/templates.swift +++ b/Plugin/Sources/protoc-gen-swiftgrpc/templates.swift @@ -37,25 +37,25 @@ func loadTemplates() -> [String:String] { var templates : [String:String] = [:] - templates["client-call-bidistreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChCaWRpcmVjdGlvbmFsIFN0cmVhbWluZykKcHVibGljIGNsYXNzIHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICBwcml2YXRlIHZhciBjYWxsIDogQ2FsbAoKICAvLy8gQ3JlYXRlIGEgY2FsbC4KICBmaWxlcHJpdmF0ZSBpbml0KF8gY2hhbm5lbDogQ2hhbm5lbCkgewogICAgc2VsZi5jYWxsID0gY2hhbm5lbC5tYWtlQ2FsbCgie3sgLnxwYXRoOmZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzdGFydCBhIGNhbGwuIE5vbmJsb2NraW5nLgogIGZpbGVwcml2YXRlIGZ1bmMgc3RhcnQobWV0YWRhdGE6TWV0YWRhdGEsIGNvbXBsZXRpb246QGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICB0cnkgc2VsZi5jYWxsLnN0YXJ0KC5iaWRpU3RyZWFtaW5nLCBtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogICAgICByZXR1cm4gc2VsZgogIH0KCiAgLy8vIENhbGwgdGhpcyB0byB3YWl0IGZvciBhIHJlc3VsdC4gQmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgcmVjZWl2ZSgpIHRocm93cyAtPiB7eyBtZXRob2R8b3V0cHV0IH19IHsKICAgIHZhciByZXR1cm5FcnJvciA6IHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PwogICAgdmFyIHJldHVybk1lc3NhZ2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgcmVjZWl2ZSgpIHtyZXNwb25zZSwgZXJyb3IgaW4KICAgICAgICByZXR1cm5NZXNzYWdlID0gcmVzcG9uc2UKICAgICAgICByZXR1cm5FcnJvciA9IGVycm9yCiAgICAgICAgc2VtLnNpZ25hbCgpCiAgICAgIH0KICAgICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgfQogICAgaWYgbGV0IHJldHVybkVycm9yID0gcmV0dXJuRXJyb3IgewogICAgICB0aHJvdyByZXR1cm5FcnJvcgogICAgfQogICAgcmV0dXJuIHJldHVybk1lc3NhZ2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gd2FpdCBmb3IgYSByZXN1bHQuIE5vbmJsb2NraW5nLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoY29tcGxldGlvbjpAZXNjYXBpbmcgKHt7IG1ldGhvZHxvdXRwdXQgfX0/LCB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fT8pLT4oKSkgdGhyb3dzIHsKICAgIGRvIHsKICAgICAgdHJ5IGNhbGwucmVjZWl2ZU1lc3NhZ2UoKSB7KGRhdGEpIGluCiAgICAgICAgaWYgbGV0IGRhdGEgPSBkYXRhIHsKICAgICAgICAgIGlmIGxldCByZXR1cm5NZXNzYWdlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOmRhdGEpIHsKICAgICAgICAgICAgY29tcGxldGlvbihyZXR1cm5NZXNzYWdlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZCkKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19LmVuZE9mU3RyZWFtKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzZW5kIGVhY2ggbWVzc2FnZSBpbiB0aGUgcmVxdWVzdCBzdHJlYW0uCiAgcHVibGljIGZ1bmMgc2VuZChfIG1lc3NhZ2U6e3sgbWV0aG9kfGlucHV0IH19LCBlcnJvckhhbmRsZXI6QGVzY2FwaW5nIChFcnJvciktPigpKSB0aHJvd3MgewogICAgbGV0IG1lc3NhZ2VEYXRhID0gdHJ5IG1lc3NhZ2Uuc2VyaWFsaXplZERhdGEoKQogICAgdHJ5IGNhbGwuc2VuZE1lc3NhZ2UoZGF0YTptZXNzYWdlRGF0YSwgZXJyb3JIYW5kbGVyOmVycm9ySGFuZGxlcikKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gY2xvc2UgdGhlIHNlbmRpbmcgY29ubmVjdGlvbi4gQmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgY2xvc2VTZW5kKCkgdGhyb3dzIHsKICAgIGxldCBzZW0gPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKICAgIHRyeSBjbG9zZVNlbmQoKSB7CiAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgc2VuZGluZyBjb25uZWN0aW9uLiBOb25ibG9ja2luZy4KICBwdWJsaWMgZnVuYyBjbG9zZVNlbmQoY29tcGxldGlvbjpAZXNjYXBpbmcgKCktPigpKSB0aHJvd3MgewogICAgdHJ5IGNhbGwuY2xvc2UoKSB7CiAgICAgIGNvbXBsZXRpb24oKQogICAgfQogIH0KfQo=" + templates["client-call-bidistreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChCaWRpcmVjdGlvbmFsIFN0cmVhbWluZykKe3sgYWNjZXNzIH19IGNsYXNzIHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICBwcml2YXRlIHZhciBjYWxsIDogQ2FsbAoKICAvLy8gQ3JlYXRlIGEgY2FsbC4KICBmaWxlcHJpdmF0ZSBpbml0KF8gY2hhbm5lbDogQ2hhbm5lbCkgewogICAgc2VsZi5jYWxsID0gY2hhbm5lbC5tYWtlQ2FsbCgie3sgLnxwYXRoOmZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzdGFydCBhIGNhbGwuIE5vbmJsb2NraW5nLgogIGZpbGVwcml2YXRlIGZ1bmMgc3RhcnQobWV0YWRhdGE6TWV0YWRhdGEsIGNvbXBsZXRpb246QGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICB0cnkgc2VsZi5jYWxsLnN0YXJ0KC5iaWRpU3RyZWFtaW5nLCBtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogICAgICByZXR1cm4gc2VsZgogIH0KCiAgLy8vIENhbGwgdGhpcyB0byB3YWl0IGZvciBhIHJlc3VsdC4gQmxvY2tpbmcuCiAge3sgYWNjZXNzIH19IGZ1bmMgcmVjZWl2ZSgpIHRocm93cyAtPiB7eyBtZXRob2R8b3V0cHV0IH19IHsKICAgIHZhciByZXR1cm5FcnJvciA6IHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PwogICAgdmFyIHJldHVybk1lc3NhZ2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgcmVjZWl2ZSgpIHtyZXNwb25zZSwgZXJyb3IgaW4KICAgICAgICByZXR1cm5NZXNzYWdlID0gcmVzcG9uc2UKICAgICAgICByZXR1cm5FcnJvciA9IGVycm9yCiAgICAgICAgc2VtLnNpZ25hbCgpCiAgICAgIH0KICAgICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgfQogICAgaWYgbGV0IHJldHVybkVycm9yID0gcmV0dXJuRXJyb3IgewogICAgICB0aHJvdyByZXR1cm5FcnJvcgogICAgfQogICAgcmV0dXJuIHJldHVybk1lc3NhZ2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gd2FpdCBmb3IgYSByZXN1bHQuIE5vbmJsb2NraW5nLgogIHt7IGFjY2VzcyB9fSBmdW5jIHJlY2VpdmUoY29tcGxldGlvbjpAZXNjYXBpbmcgKHt7IG1ldGhvZHxvdXRwdXQgfX0/LCB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fT8pLT4oKSkgdGhyb3dzIHsKICAgIGRvIHsKICAgICAgdHJ5IGNhbGwucmVjZWl2ZU1lc3NhZ2UoKSB7KGRhdGEpIGluCiAgICAgICAgaWYgbGV0IGRhdGEgPSBkYXRhIHsKICAgICAgICAgIGlmIGxldCByZXR1cm5NZXNzYWdlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOmRhdGEpIHsKICAgICAgICAgICAgY29tcGxldGlvbihyZXR1cm5NZXNzYWdlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZCkKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19LmVuZE9mU3RyZWFtKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzZW5kIGVhY2ggbWVzc2FnZSBpbiB0aGUgcmVxdWVzdCBzdHJlYW0uCiAge3sgYWNjZXNzIH19IGZ1bmMgc2VuZChfIG1lc3NhZ2U6e3sgbWV0aG9kfGlucHV0IH19LCBlcnJvckhhbmRsZXI6QGVzY2FwaW5nIChFcnJvciktPigpKSB0aHJvd3MgewogICAgbGV0IG1lc3NhZ2VEYXRhID0gdHJ5IG1lc3NhZ2Uuc2VyaWFsaXplZERhdGEoKQogICAgdHJ5IGNhbGwuc2VuZE1lc3NhZ2UoZGF0YTptZXNzYWdlRGF0YSwgZXJyb3JIYW5kbGVyOmVycm9ySGFuZGxlcikKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gY2xvc2UgdGhlIHNlbmRpbmcgY29ubmVjdGlvbi4gQmxvY2tpbmcuCiAge3sgYWNjZXNzIH19IGZ1bmMgY2xvc2VTZW5kKCkgdGhyb3dzIHsKICAgIGxldCBzZW0gPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKICAgIHRyeSBjbG9zZVNlbmQoKSB7CiAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgc2VuZGluZyBjb25uZWN0aW9uLiBOb25ibG9ja2luZy4KICB7eyBhY2Nlc3MgfX0gZnVuYyBjbG9zZVNlbmQoY29tcGxldGlvbjpAZXNjYXBpbmcgKCktPigpKSB0aHJvd3MgewogICAgdHJ5IGNhbGwuY2xvc2UoKSB7CiAgICAgIGNvbXBsZXRpb24oKQogICAgfQogIH0KfQo=" - templates["client-call-clientstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChDbGllbnQgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSIpCiAgfQoKICAvLy8gQ2FsbCB0aGlzIHRvIHN0YXJ0IGEgY2FsbC4gTm9uYmxvY2tpbmcuCiAgZmlsZXByaXZhdGUgZnVuYyBzdGFydChtZXRhZGF0YTpNZXRhZGF0YSwgY29tcGxldGlvbjpAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgICAgIHRyeSBzZWxmLmNhbGwuc3RhcnQoLmNsaWVudFN0cmVhbWluZywgbWV0YWRhdGE6bWV0YWRhdGEsIGNvbXBsZXRpb246Y29tcGxldGlvbikKICAgICAgcmV0dXJuIHNlbGYKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gc2VuZCBlYWNoIG1lc3NhZ2UgaW4gdGhlIHJlcXVlc3Qgc3RyZWFtLiBOb25ibG9ja2luZy4KICBwdWJsaWMgZnVuYyBzZW5kKF8gbWVzc2FnZTp7eyBtZXRob2R8aW5wdXQgfX0sIGVycm9ySGFuZGxlcjpAZXNjYXBpbmcgKEVycm9yKS0+KCkpIHRocm93cyB7CiAgICBsZXQgbWVzc2FnZURhdGEgPSB0cnkgbWVzc2FnZS5zZXJpYWxpemVkRGF0YSgpCiAgICB0cnkgY2FsbC5zZW5kTWVzc2FnZShkYXRhOm1lc3NhZ2VEYXRhLCBlcnJvckhhbmRsZXI6ZXJyb3JIYW5kbGVyKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgd2FpdCBmb3IgYSByZXNwb25zZS4gQmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgY2xvc2VBbmRSZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgdmFyIHJldHVybkVycm9yIDoge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0/CiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgY2xvc2VBbmRSZWNlaXZlKCkge3Jlc3BvbnNlLCBlcnJvciBpbgogICAgICAgIHJldHVyblJlc3BvbnNlID0gcmVzcG9uc2UKICAgICAgICByZXR1cm5FcnJvciA9IGVycm9yCiAgICAgICAgc2VtLnNpZ25hbCgpCiAgICAgIH0KICAgICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgIHRocm93IGVycm9yCiAgICB9CiAgICBpZiBsZXQgcmV0dXJuRXJyb3IgPSByZXR1cm5FcnJvciB7CiAgICAgIHRocm93IHJldHVybkVycm9yCiAgICB9CiAgICByZXR1cm4gcmV0dXJuUmVzcG9uc2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuIE5vbmJsb2NraW5nLgogIHB1YmxpYyBmdW5jIGNsb3NlQW5kUmVjZWl2ZShjb21wbGV0aW9uOkBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PyktPigpKQogICAgdGhyb3dzIHsKICAgICAgZG8gewogICAgICAgIHRyeSBjYWxsLnJlY2VpdmVNZXNzYWdlKCkgeyhyZXNwb25zZURhdGEpIGluCiAgICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhLAogICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB0cnk/IHt7IG1ldGhvZHxvdXRwdXQgfX0oc2VyaWFsaXplZERhdGE6cmVzcG9uc2VEYXRhKSB7CiAgICAgICAgICAgIGNvbXBsZXRpb24ocmVzcG9uc2UsIG5pbCkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbXBsZXRpb24obmlsLCB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fS5pbnZhbGlkTWVzc2FnZVJlY2VpdmVkKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cnkgY2FsbC5jbG9zZShjb21wbGV0aW9uOnt9KQogICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICB0aHJvdyBlcnJvcgogICAgICB9CiAgfQp9Cg==" + templates["client-call-clientstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChDbGllbnQgU3RyZWFtaW5nKQp7eyBhY2Nlc3MgfX0gY2xhc3Mge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSIpCiAgfQoKICAvLy8gQ2FsbCB0aGlzIHRvIHN0YXJ0IGEgY2FsbC4gTm9uYmxvY2tpbmcuCiAgZmlsZXByaXZhdGUgZnVuYyBzdGFydChtZXRhZGF0YTpNZXRhZGF0YSwgY29tcGxldGlvbjpAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgICAgIHRyeSBzZWxmLmNhbGwuc3RhcnQoLmNsaWVudFN0cmVhbWluZywgbWV0YWRhdGE6bWV0YWRhdGEsIGNvbXBsZXRpb246Y29tcGxldGlvbikKICAgICAgcmV0dXJuIHNlbGYKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gc2VuZCBlYWNoIG1lc3NhZ2UgaW4gdGhlIHJlcXVlc3Qgc3RyZWFtLiBOb25ibG9ja2luZy4KICB7eyBhY2Nlc3MgfX0gZnVuYyBzZW5kKF8gbWVzc2FnZTp7eyBtZXRob2R8aW5wdXQgfX0sIGVycm9ySGFuZGxlcjpAZXNjYXBpbmcgKEVycm9yKS0+KCkpIHRocm93cyB7CiAgICBsZXQgbWVzc2FnZURhdGEgPSB0cnkgbWVzc2FnZS5zZXJpYWxpemVkRGF0YSgpCiAgICB0cnkgY2FsbC5zZW5kTWVzc2FnZShkYXRhOm1lc3NhZ2VEYXRhLCBlcnJvckhhbmRsZXI6ZXJyb3JIYW5kbGVyKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgd2FpdCBmb3IgYSByZXNwb25zZS4gQmxvY2tpbmcuCiAge3sgYWNjZXNzIH19IGZ1bmMgY2xvc2VBbmRSZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgdmFyIHJldHVybkVycm9yIDoge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0/CiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgY2xvc2VBbmRSZWNlaXZlKCkge3Jlc3BvbnNlLCBlcnJvciBpbgogICAgICAgIHJldHVyblJlc3BvbnNlID0gcmVzcG9uc2UKICAgICAgICByZXR1cm5FcnJvciA9IGVycm9yCiAgICAgICAgc2VtLnNpZ25hbCgpCiAgICAgIH0KICAgICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgIHRocm93IGVycm9yCiAgICB9CiAgICBpZiBsZXQgcmV0dXJuRXJyb3IgPSByZXR1cm5FcnJvciB7CiAgICAgIHRocm93IHJldHVybkVycm9yCiAgICB9CiAgICByZXR1cm4gcmV0dXJuUmVzcG9uc2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuIE5vbmJsb2NraW5nLgogIHt7IGFjY2VzcyB9fSBmdW5jIGNsb3NlQW5kUmVjZWl2ZShjb21wbGV0aW9uOkBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PyktPigpKQogICAgdGhyb3dzIHsKICAgICAgZG8gewogICAgICAgIHRyeSBjYWxsLnJlY2VpdmVNZXNzYWdlKCkgeyhyZXNwb25zZURhdGEpIGluCiAgICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhLAogICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB0cnk/IHt7IG1ldGhvZHxvdXRwdXQgfX0oc2VyaWFsaXplZERhdGE6cmVzcG9uc2VEYXRhKSB7CiAgICAgICAgICAgIGNvbXBsZXRpb24ocmVzcG9uc2UsIG5pbCkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbXBsZXRpb24obmlsLCB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fS5pbnZhbGlkTWVzc2FnZVJlY2VpdmVkKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cnkgY2FsbC5jbG9zZShjb21wbGV0aW9uOnt9KQogICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICB0aHJvdyBlcnJvcgogICAgICB9CiAgfQp9Cg==" - templates["client-call-serverstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChTZXJ2ZXIgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSIpCiAgfQoKICAvLy8gQ2FsbCB0aGlzIG9uY2Ugd2l0aCB0aGUgbWVzc2FnZSB0byBzZW5kLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoQ2FsbFJlc3VsdCkgLT4gKCkpCiAgICB0aHJvd3MgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICBsZXQgcmVxdWVzdERhdGEgPSB0cnkgcmVxdWVzdC5zZXJpYWxpemVkRGF0YSgpCiAgICAgIHRyeSBjYWxsLnN0YXJ0KC5zZXJ2ZXJTdHJlYW1pbmcsCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOnJlcXVlc3REYXRhLAogICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uOmNvbXBsZXRpb24pCiAgICAgIHJldHVybiBzZWxmCiAgfQoKICAvLy8gQ2FsbCB0aGlzIHRvIHdhaXQgZm9yIGEgcmVzdWx0LiBCbG9ja2luZy4KICBwdWJsaWMgZnVuYyByZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgdmFyIHJldHVybkVycm9yIDoge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0/CiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgcmVjZWl2ZSgpIHtyZXNwb25zZSwgZXJyb3IgaW4KICAgICAgICByZXR1cm5SZXNwb25zZSA9IHJlc3BvbnNlCiAgICAgICAgcmV0dXJuRXJyb3IgPSBlcnJvcgogICAgICAgIHNlbS5zaWduYWwoKQogICAgICB9CiAgICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIH0KICAgIGlmIGxldCByZXR1cm5FcnJvciA9IHJldHVybkVycm9yIHsKICAgICAgdGhyb3cgcmV0dXJuRXJyb3IKICAgIH0KICAgIHJldHVybiByZXR1cm5SZXNwb25zZQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byB3YWl0IGZvciBhIHJlc3VsdC4gTm9uYmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgcmVjZWl2ZShjb21wbGV0aW9uOkBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PyktPigpKSB0aHJvd3MgewogICAgZG8gewogICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsocmVzcG9uc2VEYXRhKSBpbgogICAgICAgIGlmIGxldCByZXNwb25zZURhdGEgPSByZXNwb25zZURhdGEgewogICAgICAgICAgaWYgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgICBjb21wbGV0aW9uKHJlc3BvbnNlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZCkKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19LmVuZE9mU3RyZWFtKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=" + templates["client-call-serverstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChTZXJ2ZXIgU3RyZWFtaW5nKQp7eyBhY2Nlc3MgfX0gY2xhc3Mge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSIpCiAgfQoKICAvLy8gQ2FsbCB0aGlzIG9uY2Ugd2l0aCB0aGUgbWVzc2FnZSB0byBzZW5kLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoQ2FsbFJlc3VsdCkgLT4gKCkpCiAgICB0aHJvd3MgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICBsZXQgcmVxdWVzdERhdGEgPSB0cnkgcmVxdWVzdC5zZXJpYWxpemVkRGF0YSgpCiAgICAgIHRyeSBjYWxsLnN0YXJ0KC5zZXJ2ZXJTdHJlYW1pbmcsCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOnJlcXVlc3REYXRhLAogICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uOmNvbXBsZXRpb24pCiAgICAgIHJldHVybiBzZWxmCiAgfQoKICAvLy8gQ2FsbCB0aGlzIHRvIHdhaXQgZm9yIGEgcmVzdWx0LiBCbG9ja2luZy4KICB7eyBhY2Nlc3MgfX0gZnVuYyByZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgdmFyIHJldHVybkVycm9yIDoge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0/CiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgcmVjZWl2ZSgpIHtyZXNwb25zZSwgZXJyb3IgaW4KICAgICAgICByZXR1cm5SZXNwb25zZSA9IHJlc3BvbnNlCiAgICAgICAgcmV0dXJuRXJyb3IgPSBlcnJvcgogICAgICAgIHNlbS5zaWduYWwoKQogICAgICB9CiAgICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIH0KICAgIGlmIGxldCByZXR1cm5FcnJvciA9IHJldHVybkVycm9yIHsKICAgICAgdGhyb3cgcmV0dXJuRXJyb3IKICAgIH0KICAgIHJldHVybiByZXR1cm5SZXNwb25zZQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byB3YWl0IGZvciBhIHJlc3VsdC4gTm9uYmxvY2tpbmcuCiAge3sgYWNjZXNzIH19IGZ1bmMgcmVjZWl2ZShjb21wbGV0aW9uOkBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19PyktPigpKSB0aHJvd3MgewogICAgZG8gewogICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsocmVzcG9uc2VEYXRhKSBpbgogICAgICAgIGlmIGxldCByZXNwb25zZURhdGEgPSByZXNwb25zZURhdGEgewogICAgICAgICAgaWYgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgICBjb21wbGV0aW9uKHJlc3BvbnNlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZCkKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIHt7IC58Y2xpZW50ZXJyb3I6ZmlsZSxzZXJ2aWNlIH19LmVuZE9mU3RyZWFtKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=" - templates["client-call-unary.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChVbmFyeSkKcHVibGljIGNsYXNzIHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICBwcml2YXRlIHZhciBjYWxsIDogQ2FsbAoKICAvLy8gQ3JlYXRlIGEgY2FsbC4KICBmaWxlcHJpdmF0ZSBpbml0KF8gY2hhbm5lbDogQ2hhbm5lbCkgewogICAgc2VsZi5jYWxsID0gY2hhbm5lbC5tYWtlQ2FsbCgie3sgLnxwYXRoOmZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIFJ1biB0aGUgY2FsbC4gQmxvY2tzIHVudGlsIHRoZSByZXBseSBpcyByZWNlaXZlZC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihyZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IE1ldGFkYXRhKSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fSB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB2YXIgcmV0dXJuQ2FsbFJlc3VsdCA6IENhbGxSZXN1bHQhCiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19PwogICAgXyA9IHRyeSBzdGFydChyZXF1ZXN0OnJlcXVlc3QsIG1ldGFkYXRhOm1ldGFkYXRhKSB7cmVzcG9uc2UsIGNhbGxSZXN1bHQgaW4KICAgICAgcmV0dXJuUmVzcG9uc2UgPSByZXNwb25zZQogICAgICByZXR1cm5DYWxsUmVzdWx0ID0gY2FsbFJlc3VsdAogICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIGlmIGxldCByZXR1cm5SZXNwb25zZSA9IHJldHVyblJlc3BvbnNlIHsKICAgICAgcmV0dXJuIHJldHVyblJlc3BvbnNlCiAgICB9IGVsc2UgewogICAgICB0aHJvdyB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fS5lcnJvcihjOiByZXR1cm5DYWxsUmVzdWx0KQogICAgfQogIH0KCiAgLy8vIFN0YXJ0IHRoZSBjYWxsLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CgogICAgICBsZXQgcmVxdWVzdERhdGEgPSB0cnkgcmVxdWVzdC5zZXJpYWxpemVkRGF0YSgpCiAgICAgIHRyeSBjYWxsLnN0YXJ0KC51bmFyeSwKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6cmVxdWVzdERhdGEpCiAgICAgIHsoY2FsbFJlc3VsdCkgaW4KICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gY2FsbFJlc3VsdC5yZXN1bHREYXRhLAogICAgICAgICAgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgY29tcGxldGlvbihyZXNwb25zZSwgY2FsbFJlc3VsdCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIGNhbGxSZXN1bHQpCiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzZWxmCiAgfQp9Cg==" + templates["client-call-unary.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChVbmFyeSkKe3sgYWNjZXNzIH19IGNsYXNzIHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICBwcml2YXRlIHZhciBjYWxsIDogQ2FsbAoKICAvLy8gQ3JlYXRlIGEgY2FsbC4KICBmaWxlcHJpdmF0ZSBpbml0KF8gY2hhbm5lbDogQ2hhbm5lbCkgewogICAgc2VsZi5jYWxsID0gY2hhbm5lbC5tYWtlQ2FsbCgie3sgLnxwYXRoOmZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIFJ1biB0aGUgY2FsbC4gQmxvY2tzIHVudGlsIHRoZSByZXBseSBpcyByZWNlaXZlZC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihyZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IE1ldGFkYXRhKSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fSB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB2YXIgcmV0dXJuQ2FsbFJlc3VsdCA6IENhbGxSZXN1bHQhCiAgICB2YXIgcmV0dXJuUmVzcG9uc2UgOiB7eyBtZXRob2R8b3V0cHV0IH19PwogICAgXyA9IHRyeSBzdGFydChyZXF1ZXN0OnJlcXVlc3QsIG1ldGFkYXRhOm1ldGFkYXRhKSB7cmVzcG9uc2UsIGNhbGxSZXN1bHQgaW4KICAgICAgcmV0dXJuUmVzcG9uc2UgPSByZXNwb25zZQogICAgICByZXR1cm5DYWxsUmVzdWx0ID0gY2FsbFJlc3VsdAogICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIGlmIGxldCByZXR1cm5SZXNwb25zZSA9IHJldHVyblJlc3BvbnNlIHsKICAgICAgcmV0dXJuIHJldHVyblJlc3BvbnNlCiAgICB9IGVsc2UgewogICAgICB0aHJvdyB7eyAufGNsaWVudGVycm9yOmZpbGUsc2VydmljZSB9fS5lcnJvcihjOiByZXR1cm5DYWxsUmVzdWx0KQogICAgfQogIH0KCiAgLy8vIFN0YXJ0IHRoZSBjYWxsLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CgogICAgICBsZXQgcmVxdWVzdERhdGEgPSB0cnkgcmVxdWVzdC5zZXJpYWxpemVkRGF0YSgpCiAgICAgIHRyeSBjYWxsLnN0YXJ0KC51bmFyeSwKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6cmVxdWVzdERhdGEpCiAgICAgIHsoY2FsbFJlc3VsdCkgaW4KICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gY2FsbFJlc3VsdC5yZXN1bHREYXRhLAogICAgICAgICAgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgY29tcGxldGlvbihyZXNwb25zZSwgY2FsbFJlc3VsdCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29tcGxldGlvbihuaWwsIGNhbGxSZXN1bHQpCiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzZWxmCiAgfQp9Cg==" - templates["client.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IGZpbGUubmFtZSB9fQogKgogKi8KCi8qCiAqCiAqIENvcHlyaWdodCAyMDE3LCBHb29nbGUgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6CiAqCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogZGlzdHJpYnV0aW9uLgogKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICovCgppbXBvcnQgRm91bmRhdGlvbgppbXBvcnQgRGlzcGF0Y2gKaW1wb3J0IGdSUEMKLy8teyUgZm9yIHNlcnZpY2UgaW4gZmlsZS5zZXJ2aWNlICV9CgovLy8gVHlwZSBmb3IgZXJyb3JzIHRocm93biBmcm9tIGdlbmVyYXRlZCBjbGllbnQgY29kZS4KcHVibGljIGVudW0ge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQogIGNhc2UgaW52YWxpZE1lc3NhZ2VSZWNlaXZlZAogIGNhc2UgZXJyb3IoYzogQ2FsbFJlc3VsdCkKfQoKLy8teyUgZm9yIG1ldGhvZCBpbiBzZXJ2aWNlLm1ldGhvZCAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtdW5hcnkuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLXNlcnZlcnN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtY2xpZW50c3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLWJpZGlzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGVuZGZvciAlfQovLy8gQ2FsbCBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdG8gbWFrZSBBUEkgY2FsbHMuCnB1YmxpYyBjbGFzcyB7eyAufHNlcnZpY2VjbGFzczpmaWxlLHNlcnZpY2UgfX0gewogIHByaXZhdGUgdmFyIGNoYW5uZWw6IENoYW5uZWwKCiAgLy8vIFRoaXMgbWV0YWRhdGEgd2lsbCBiZSBzZW50IHdpdGggYWxsIHJlcXVlc3RzLgogIHB1YmxpYyB2YXIgbWV0YWRhdGEgOiBNZXRhZGF0YQoKICAvLy8gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHNlcnZpY2UgaG9zdCBuYW1lIHRvIGJlIG92ZXJyaWRkZW4uCiAgLy8vIEZvciBleGFtcGxlLCBpdCBjYW4gYmUgdXNlZCB0byBtYWtlIGNhbGxzIHRvICJsb2NhbGhvc3Q6ODA4MCIKICAvLy8gYXBwZWFyIHRvIGJlIHRvICJleGFtcGxlLmNvbSIuCiAgcHVibGljIHZhciBob3N0IDogU3RyaW5nIHsKICAgIGdldCB7CiAgICAgIHJldHVybiBzZWxmLmNoYW5uZWwuaG9zdAogICAgfQogICAgc2V0IHsKICAgICAgc2VsZi5jaGFubmVsLmhvc3QgPSBuZXdWYWx1ZQogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIGluc2VjdXJlIGNvbm5lY3Rpb25zLgogIHB1YmxpYyBpbml0KGFkZHJlc3M6IFN0cmluZykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcykKICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoKQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIHNlY3VyZSBjb25uZWN0aW9ucy4KICBwdWJsaWMgaW5pdChhZGRyZXNzOiBTdHJpbmcsIGNlcnRpZmljYXRlczogU3RyaW5nPywgaG9zdDogU3RyaW5nPykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcywgY2VydGlmaWNhdGVzOmNlcnRpZmljYXRlcywgaG9zdDpob3N0KQogICAgbWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAgfQoKICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIFN5bmNocm9ub3VzLiBVbmFyeS4KICBwdWJsaWMgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oXyByZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0pCiAgICB0aHJvd3MKICAgIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnJ1bihyZXF1ZXN0OnJlcXVlc3QsIG1ldGFkYXRhOm1ldGFkYXRhKQogIH0KICAvLy8gQXN5bmNocm9ub3VzLiBVbmFyeS4KICBwdWJsaWMgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oXyByZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0sCiAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KHJlcXVlc3Q6cmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIEFzeW5jaHJvbm91cy4gU2VydmVyLXN0cmVhbWluZy4KICAvLy8gU2VuZCB0aGUgaW5pdGlhbCBtZXNzYWdlLgogIC8vLyBVc2UgbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIGdldCBzdHJlYW1lZCByZXNwb25zZXMuCiAgcHVibGljIGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KF8gcmVxdWVzdDoge3sgbWV0aG9kfGlucHV0IH19LCBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KHJlcXVlc3Q6cmVxdWVzdCwgbWV0YWRhdGE6bWV0YWRhdGEsIGNvbXBsZXRpb246Y29tcGxldGlvbikKICB9CiAgLy8teyUgZW5kaWYgJX0KICAvLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBub3QgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQogIC8vLyBBc3luY2hyb25vdXMuIENsaWVudC1zdHJlYW1pbmcuCiAgLy8vIFVzZSBtZXRob2RzIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc3RyZWFtIG1lc3NhZ2VzIGFuZAogIC8vLyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgd2FpdCBmb3IgYSBmaW5hbCByZXNwb25zZS4KICBwdWJsaWMgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oY29tcGxldGlvbjogQGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MKICAgIC0+IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICAvLy8gQXN5bmNocm9ub3VzLiBCaWRpcmVjdGlvbmFsLXN0cmVhbWluZy4KICAvLy8gVXNlIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIG9iamVjdCB0byBzdHJlYW0gbWVzc2FnZXMsCiAgLy8vIHRvIHdhaXQgZm9yIHJlcGxpZXMsIGFuZCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbi4KICBwdWJsaWMgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oY29tcGxldGlvbjogQGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MKICAgIC0+IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGVuZGZvciAlfQp9Ci8vLXslIGVuZGZvciAlfQo=" + templates["client.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IGZpbGUubmFtZSB9fQogKgogKi8KCi8qCiAqCiAqIENvcHlyaWdodCAyMDE3LCBHb29nbGUgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6CiAqCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogZGlzdHJpYnV0aW9uLgogKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICovCgppbXBvcnQgRm91bmRhdGlvbgppbXBvcnQgRGlzcGF0Y2gKaW1wb3J0IGdSUEMKLy8teyUgZm9yIHNlcnZpY2UgaW4gZmlsZS5zZXJ2aWNlICV9CgovLy8gVHlwZSBmb3IgZXJyb3JzIHRocm93biBmcm9tIGdlbmVyYXRlZCBjbGllbnQgY29kZS4Ke3sgYWNjZXNzIH19IGVudW0ge3sgLnxjbGllbnRlcnJvcjpmaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQogIGNhc2UgaW52YWxpZE1lc3NhZ2VSZWNlaXZlZAogIGNhc2UgZXJyb3IoYzogQ2FsbFJlc3VsdCkKfQoKLy8teyUgZm9yIG1ldGhvZCBpbiBzZXJ2aWNlLm1ldGhvZCAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtdW5hcnkuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLXNlcnZlcnN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtY2xpZW50c3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLWJpZGlzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGVuZGZvciAlfQovLy8gQ2FsbCBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdG8gbWFrZSBBUEkgY2FsbHMuCnt7IGFjY2VzcyB9fSBjbGFzcyB7eyAufHNlcnZpY2VjbGFzczpmaWxlLHNlcnZpY2UgfX0gewogIHByaXZhdGUgdmFyIGNoYW5uZWw6IENoYW5uZWwKCiAgLy8vIFRoaXMgbWV0YWRhdGEgd2lsbCBiZSBzZW50IHdpdGggYWxsIHJlcXVlc3RzLgogIHt7IGFjY2VzcyB9fSB2YXIgbWV0YWRhdGEgOiBNZXRhZGF0YQoKICAvLy8gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHNlcnZpY2UgaG9zdCBuYW1lIHRvIGJlIG92ZXJyaWRkZW4uCiAgLy8vIEZvciBleGFtcGxlLCBpdCBjYW4gYmUgdXNlZCB0byBtYWtlIGNhbGxzIHRvICJsb2NhbGhvc3Q6ODA4MCIKICAvLy8gYXBwZWFyIHRvIGJlIHRvICJleGFtcGxlLmNvbSIuCiAge3sgYWNjZXNzIH19IHZhciBob3N0IDogU3RyaW5nIHsKICAgIGdldCB7CiAgICAgIHJldHVybiBzZWxmLmNoYW5uZWwuaG9zdAogICAgfQogICAgc2V0IHsKICAgICAgc2VsZi5jaGFubmVsLmhvc3QgPSBuZXdWYWx1ZQogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIGluc2VjdXJlIGNvbm5lY3Rpb25zLgogIHt7IGFjY2VzcyB9fSBpbml0KGFkZHJlc3M6IFN0cmluZykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcykKICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoKQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIHNlY3VyZSBjb25uZWN0aW9ucy4KICB7eyBhY2Nlc3MgfX0gaW5pdChhZGRyZXNzOiBTdHJpbmcsIGNlcnRpZmljYXRlczogU3RyaW5nPywgaG9zdDogU3RyaW5nPykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcywgY2VydGlmaWNhdGVzOmNlcnRpZmljYXRlcywgaG9zdDpob3N0KQogICAgbWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAgfQoKICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIFN5bmNocm9ub3VzLiBVbmFyeS4KICB7eyBhY2Nlc3MgfX0gZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oXyByZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0pCiAgICB0aHJvd3MKICAgIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnJ1bihyZXF1ZXN0OnJlcXVlc3QsIG1ldGFkYXRhOm1ldGFkYXRhKQogIH0KICAvLy8gQXN5bmNocm9ub3VzLiBVbmFyeS4KICB7eyBhY2Nlc3MgfX0gZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oXyByZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0sCiAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KHJlcXVlc3Q6cmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIEFzeW5jaHJvbm91cy4gU2VydmVyLXN0cmVhbWluZy4KICAvLy8gU2VuZCB0aGUgaW5pdGlhbCBtZXNzYWdlLgogIC8vLyBVc2UgbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIGdldCBzdHJlYW1lZCByZXNwb25zZXMuCiAge3sgYWNjZXNzIH19IGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KF8gcmVxdWVzdDoge3sgbWV0aG9kfGlucHV0IH19LCBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOmZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KHJlcXVlc3Q6cmVxdWVzdCwgbWV0YWRhdGE6bWV0YWRhdGEsIGNvbXBsZXRpb246Y29tcGxldGlvbikKICB9CiAgLy8teyUgZW5kaWYgJX0KICAvLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBub3QgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQogIC8vLyBBc3luY2hyb25vdXMuIENsaWVudC1zdHJlYW1pbmcuCiAgLy8vIFVzZSBtZXRob2RzIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc3RyZWFtIG1lc3NhZ2VzIGFuZAogIC8vLyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgd2FpdCBmb3IgYSBmaW5hbCByZXNwb25zZS4KICB7eyBhY2Nlc3MgfX0gZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oY29tcGxldGlvbjogQGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MKICAgIC0+IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICAvLy8gQXN5bmNocm9ub3VzLiBCaWRpcmVjdGlvbmFsLXN0cmVhbWluZy4KICAvLy8gVXNlIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIG9iamVjdCB0byBzdHJlYW0gbWVzc2FnZXMsCiAgLy8vIHRvIHdhaXQgZm9yIHJlcGxpZXMsIGFuZCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbi4KICB7eyBhY2Nlc3MgfX0gZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oY29tcGxldGlvbjogQGVzY2FwaW5nIChDYWxsUmVzdWx0KS0+KCkpCiAgICB0aHJvd3MKICAgIC0+IHt7IC58Y2FsbDpmaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGVuZGZvciAlfQp9Ci8vLXslIGVuZGZvciAlfQo=" - templates["server-session-bidistreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKEJpZGlyZWN0aW9uYWwgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0gOiB7eyAufHNlcnZpY2U6ZmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgc3VwZXIuaW5pdChoYW5kbGVyOmhhbmRsZXIpCiAgfQoKICAvLy8gUmVjZWl2ZSBhIG1lc3NhZ2UuIEJsb2NrcyB1bnRpbCBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgb3IgdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCiAgcHVibGljIGZ1bmMgcmVjZWl2ZSgpIHRocm93cyAtPiB7eyBtZXRob2R8aW5wdXQgfX0gewogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgdmFyIHJlcXVlc3RNZXNzYWdlIDoge3sgbWV0aG9kfGlucHV0IH19PwogICAgdHJ5IHNlbGYuaGFuZGxlci5yZWNlaXZlTWVzc2FnZSgpIHsocmVxdWVzdERhdGEpIGluCiAgICAgIGlmIGxldCByZXF1ZXN0RGF0YSA9IHJlcXVlc3REYXRhIHsKICAgICAgICBkbyB7CiAgICAgICAgICByZXF1ZXN0TWVzc2FnZSA9IHRyeSB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3IgXChlcnJvcikiKQogICAgICAgIH0KICAgICAgfQogICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIGlmIGxldCByZXF1ZXN0TWVzc2FnZSA9IHJlcXVlc3RNZXNzYWdlIHsKICAgICAgcmV0dXJuIHJlcXVlc3RNZXNzYWdlCiAgICB9IGVsc2UgewogICAgICB0aHJvdyB7eyAufHNlcnZlcmVycm9yOmZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbQogICAgfQogIH0KCiAgLy8vIFNlbmQgYSBtZXNzYWdlLiBOb25ibG9ja2luZy4KICBwdWJsaWMgZnVuYyBzZW5kKF8gcmVzcG9uc2U6IHt7IG1ldGhvZHxvdXRwdXQgfX0pIHRocm93cyB7CiAgICB0cnkgaGFuZGxlci5zZW5kUmVzcG9uc2UobWVzc2FnZTpyZXNwb25zZS5zZXJpYWxpemVkRGF0YSgpKSB7fQogIH0KCiAgLy8vIENsb3NlIGEgY29ubmVjdGlvbi4gQmxvY2tzIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICBwdWJsaWMgZnVuYyBjbG9zZSgpIHRocm93cyB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB0cnkgc2VsZi5oYW5kbGVyLnNlbmRTdGF0dXMoc3RhdHVzQ29kZTpzZWxmLnN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogIH0KCiAgLy8vIFJ1biB0aGUgc2Vzc2lvbi4gSW50ZXJuYWwuCiAgZmlsZXByaXZhdGUgZnVuYyBydW4ocXVldWU6RGlzcGF0Y2hRdWV1ZSkgdGhyb3dzIHsKICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZE1ldGFkYXRhKGluaXRpYWxNZXRhZGF0YTppbml0aWFsTWV0YWRhdGEpIHsKICAgICAgcXVldWUuYXN5bmMgewogICAgICAgIGRvIHsKICAgICAgICAgIHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uOnNlbGYpCiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3IgXChlcnJvcikiKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=" + templates["server-session-bidistreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKEJpZGlyZWN0aW9uYWwgU3RyZWFtaW5nKQp7eyBhY2Nlc3MgfX0gY2xhc3Mge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0gOiB7eyAufHNlcnZpY2U6ZmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgc3VwZXIuaW5pdChoYW5kbGVyOmhhbmRsZXIpCiAgfQoKICAvLy8gUmVjZWl2ZSBhIG1lc3NhZ2UuIEJsb2NrcyB1bnRpbCBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgb3IgdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCiAge3sgYWNjZXNzIH19IGZ1bmMgcmVjZWl2ZSgpIHRocm93cyAtPiB7eyBtZXRob2R8aW5wdXQgfX0gewogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgdmFyIHJlcXVlc3RNZXNzYWdlIDoge3sgbWV0aG9kfGlucHV0IH19PwogICAgdHJ5IHNlbGYuaGFuZGxlci5yZWNlaXZlTWVzc2FnZSgpIHsocmVxdWVzdERhdGEpIGluCiAgICAgIGlmIGxldCByZXF1ZXN0RGF0YSA9IHJlcXVlc3REYXRhIHsKICAgICAgICBkbyB7CiAgICAgICAgICByZXF1ZXN0TWVzc2FnZSA9IHRyeSB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3IgXChlcnJvcikiKQogICAgICAgIH0KICAgICAgfQogICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIGlmIGxldCByZXF1ZXN0TWVzc2FnZSA9IHJlcXVlc3RNZXNzYWdlIHsKICAgICAgcmV0dXJuIHJlcXVlc3RNZXNzYWdlCiAgICB9IGVsc2UgewogICAgICB0aHJvdyB7eyAufHNlcnZlcmVycm9yOmZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbQogICAgfQogIH0KCiAgLy8vIFNlbmQgYSBtZXNzYWdlLiBOb25ibG9ja2luZy4KICB7eyBhY2Nlc3MgfX0gZnVuYyBzZW5kKF8gcmVzcG9uc2U6IHt7IG1ldGhvZHxvdXRwdXQgfX0pIHRocm93cyB7CiAgICB0cnkgaGFuZGxlci5zZW5kUmVzcG9uc2UobWVzc2FnZTpyZXNwb25zZS5zZXJpYWxpemVkRGF0YSgpKSB7fQogIH0KCiAgLy8vIENsb3NlIGEgY29ubmVjdGlvbi4gQmxvY2tzIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICB7eyBhY2Nlc3MgfX0gZnVuYyBjbG9zZSgpIHRocm93cyB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB0cnkgc2VsZi5oYW5kbGVyLnNlbmRTdGF0dXMoc3RhdHVzQ29kZTpzZWxmLnN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogIH0KCiAgLy8vIFJ1biB0aGUgc2Vzc2lvbi4gSW50ZXJuYWwuCiAgZmlsZXByaXZhdGUgZnVuYyBydW4ocXVldWU6RGlzcGF0Y2hRdWV1ZSkgdGhyb3dzIHsKICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZE1ldGFkYXRhKGluaXRpYWxNZXRhZGF0YTppbml0aWFsTWV0YWRhdGEpIHsKICAgICAgcXVldWUuYXN5bmMgewogICAgICAgIGRvIHsKICAgICAgICAgIHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uOnNlbGYpCiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3IgXChlcnJvcikiKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=" - templates["server-session-clientstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKENsaWVudCBTdHJlYW1pbmcpCnB1YmxpYyBjbGFzcyB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBwcml2YXRlIHZhciBwcm92aWRlciA6IHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBSZWNlaXZlIGEgbWVzc2FnZS4gQmxvY2tzIHVudGlsIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBvciB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KICBwdWJsaWMgZnVuYyByZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxpbnB1dCB9fSB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB2YXIgcmVxdWVzdE1lc3NhZ2UgOiB7eyBtZXRob2R8aW5wdXQgfX0/CiAgICB0cnkgc2VsZi5oYW5kbGVyLnJlY2VpdmVNZXNzYWdlKCkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIHJlcXVlc3RNZXNzYWdlID0gdHJ5PyB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgIH0KICAgICAgc2VtLnNpZ25hbCgpCiAgICB9CiAgICBfID0gc2VtLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCiAgICBpZiByZXF1ZXN0TWVzc2FnZSA9PSBuaWwgewogICAgICB0aHJvdyB7eyAufHNlcnZlcmVycm9yOmZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbQogICAgfQogICAgcmV0dXJuIHJlcXVlc3RNZXNzYWdlIQogIH0KCiAgLy8vIFNlbmQgYSByZXNwb25zZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCiAgcHVibGljIGZ1bmMgc2VuZEFuZENsb3NlKF8gcmVzcG9uc2U6IHt7IG1ldGhvZHxvdXRwdXQgfX0pIHRocm93cyB7CiAgICB0cnkgc2VsZi5oYW5kbGVyLnNlbmRSZXNwb25zZShtZXNzYWdlOnJlc3BvbnNlLnNlcmlhbGl6ZWREYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOnNlbGYuc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6c2VsZi5zdGF0dXNNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpCiAgfQoKICAvLy8gUnVuIHRoZSBzZXNzaW9uLiBJbnRlcm5hbC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihxdWV1ZTpEaXNwYXRjaFF1ZXVlKSB0aHJvd3MgewogICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kTWV0YWRhdGEoaW5pdGlhbE1ldGFkYXRhOmluaXRpYWxNZXRhZGF0YSkgewogICAgICBxdWV1ZS5hc3luYyB7CiAgICAgICAgZG8gewogICAgICAgICAgdHJ5IHNlbGYucHJvdmlkZXIue3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHNlc3Npb246c2VsZikKICAgICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICAgIHByaW50KCJlcnJvciBcKGVycm9yKSIpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Cg==" + templates["server-session-clientstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKENsaWVudCBTdHJlYW1pbmcpCnt7IGFjY2VzcyB9fSBjbGFzcyB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBwcml2YXRlIHZhciBwcm92aWRlciA6IHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBSZWNlaXZlIGEgbWVzc2FnZS4gQmxvY2tzIHVudGlsIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBvciB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KICB7eyBhY2Nlc3MgfX0gZnVuYyByZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxpbnB1dCB9fSB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB2YXIgcmVxdWVzdE1lc3NhZ2UgOiB7eyBtZXRob2R8aW5wdXQgfX0/CiAgICB0cnkgc2VsZi5oYW5kbGVyLnJlY2VpdmVNZXNzYWdlKCkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIHJlcXVlc3RNZXNzYWdlID0gdHJ5PyB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgIH0KICAgICAgc2VtLnNpZ25hbCgpCiAgICB9CiAgICBfID0gc2VtLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCiAgICBpZiByZXF1ZXN0TWVzc2FnZSA9PSBuaWwgewogICAgICB0aHJvdyB7eyAufHNlcnZlcmVycm9yOmZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbQogICAgfQogICAgcmV0dXJuIHJlcXVlc3RNZXNzYWdlIQogIH0KCiAgLy8vIFNlbmQgYSByZXNwb25zZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCiAge3sgYWNjZXNzIH19IGZ1bmMgc2VuZEFuZENsb3NlKF8gcmVzcG9uc2U6IHt7IG1ldGhvZHxvdXRwdXQgfX0pIHRocm93cyB7CiAgICB0cnkgc2VsZi5oYW5kbGVyLnNlbmRSZXNwb25zZShtZXNzYWdlOnJlc3BvbnNlLnNlcmlhbGl6ZWREYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOnNlbGYuc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6c2VsZi5zdGF0dXNNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpCiAgfQoKICAvLy8gUnVuIHRoZSBzZXNzaW9uLiBJbnRlcm5hbC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihxdWV1ZTpEaXNwYXRjaFF1ZXVlKSB0aHJvd3MgewogICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kTWV0YWRhdGEoaW5pdGlhbE1ldGFkYXRhOmluaXRpYWxNZXRhZGF0YSkgewogICAgICBxdWV1ZS5hc3luYyB7CiAgICAgICAgZG8gewogICAgICAgICAgdHJ5IHNlbGYucHJvdmlkZXIue3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHNlc3Npb246c2VsZikKICAgICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICAgIHByaW50KCJlcnJvciBcKGVycm9yKSIpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Cg==" - templates["server-session-serverstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFNlcnZlciBTdHJlYW1pbmcpCnB1YmxpYyBjbGFzcyB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBwcml2YXRlIHZhciBwcm92aWRlciA6IHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBTZW5kIGEgbWVzc2FnZS4gTm9uYmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgc2VuZChfIHJlc3BvbnNlOiB7eyBtZXRob2R8b3V0cHV0IH19KSB0aHJvd3MgewogICAgdHJ5IGhhbmRsZXIuc2VuZFJlc3BvbnNlKG1lc3NhZ2U6cmVzcG9uc2Uuc2VyaWFsaXplZERhdGEoKSkge30KICB9CgogIC8vLyBSdW4gdGhlIHNlc3Npb24uIEludGVybmFsLgogIGZpbGVwcml2YXRlIGZ1bmMgcnVuKHF1ZXVlOkRpc3BhdGNoUXVldWUpIHRocm93cyB7CiAgICB0cnkgc2VsZi5oYW5kbGVyLnJlY2VpdmVNZXNzYWdlKGluaXRpYWxNZXRhZGF0YTppbml0aWFsTWV0YWRhdGEpIHsocmVxdWVzdERhdGEpIGluCiAgICAgIGlmIGxldCByZXF1ZXN0RGF0YSA9IHJlcXVlc3REYXRhIHsKICAgICAgICBkbyB7CiAgICAgICAgICBsZXQgcmVxdWVzdE1lc3NhZ2UgPSB0cnkge3sgbWV0aG9kfGlucHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlcXVlc3REYXRhKQogICAgICAgICAgLy8gdG8ga2VlcCBwcm92aWRlcnMgZnJvbSBibG9ja2luZyB0aGUgc2VydmVyIHRocmVhZCwKICAgICAgICAgIC8vIHdlIGRpc3BhdGNoIHRoZW0gdG8gYW5vdGhlciBxdWV1ZS4KICAgICAgICAgIHF1ZXVlLmFzeW5jIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0OnJlcXVlc3RNZXNzYWdlLCBzZXNzaW9uOiBzZWxmKQogICAgICAgICAgICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZFN0YXR1cyhzdGF0dXNDb2RlOnNlbGYuc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nTWV0YWRhdGE6c2VsZi50cmFpbGluZ01ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uOnt9KQogICAgICAgICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICAgICAgICBwcmludCgiZXJyb3I6IFwoZXJyb3IpIikKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGxldCBlcnJvcikgewogICAgICAgICAgcHJpbnQoImVycm9yOiBcKGVycm9yKSIpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Cg==" + templates["server-session-serverstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFNlcnZlciBTdHJlYW1pbmcpCnt7IGFjY2VzcyB9fSBjbGFzcyB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBwcml2YXRlIHZhciBwcm92aWRlciA6IHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBTZW5kIGEgbWVzc2FnZS4gTm9uYmxvY2tpbmcuCiAge3sgYWNjZXNzIH19IGZ1bmMgc2VuZChfIHJlc3BvbnNlOiB7eyBtZXRob2R8b3V0cHV0IH19KSB0aHJvd3MgewogICAgdHJ5IGhhbmRsZXIuc2VuZFJlc3BvbnNlKG1lc3NhZ2U6cmVzcG9uc2Uuc2VyaWFsaXplZERhdGEoKSkge30KICB9CgogIC8vLyBSdW4gdGhlIHNlc3Npb24uIEludGVybmFsLgogIGZpbGVwcml2YXRlIGZ1bmMgcnVuKHF1ZXVlOkRpc3BhdGNoUXVldWUpIHRocm93cyB7CiAgICB0cnkgc2VsZi5oYW5kbGVyLnJlY2VpdmVNZXNzYWdlKGluaXRpYWxNZXRhZGF0YTppbml0aWFsTWV0YWRhdGEpIHsocmVxdWVzdERhdGEpIGluCiAgICAgIGlmIGxldCByZXF1ZXN0RGF0YSA9IHJlcXVlc3REYXRhIHsKICAgICAgICBkbyB7CiAgICAgICAgICBsZXQgcmVxdWVzdE1lc3NhZ2UgPSB0cnkge3sgbWV0aG9kfGlucHV0IH19KHNlcmlhbGl6ZWREYXRhOnJlcXVlc3REYXRhKQogICAgICAgICAgLy8gdG8ga2VlcCBwcm92aWRlcnMgZnJvbSBibG9ja2luZyB0aGUgc2VydmVyIHRocmVhZCwKICAgICAgICAgIC8vIHdlIGRpc3BhdGNoIHRoZW0gdG8gYW5vdGhlciBxdWV1ZS4KICAgICAgICAgIHF1ZXVlLmFzeW5jIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0OnJlcXVlc3RNZXNzYWdlLCBzZXNzaW9uOiBzZWxmKQogICAgICAgICAgICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZFN0YXR1cyhzdGF0dXNDb2RlOnNlbGYuc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nTWV0YWRhdGE6c2VsZi50cmFpbGluZ01ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uOnt9KQogICAgICAgICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICAgICAgICBwcmludCgiZXJyb3I6IFwoZXJyb3IpIikKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGxldCBlcnJvcikgewogICAgICAgICAgcHJpbnQoImVycm9yOiBcKGVycm9yKSIpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Cg==" - templates["server-session-unary.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFVuYXJ5KQpwdWJsaWMgY2xhc3Mge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0gOiB7eyAufHNlcnZpY2U6ZmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgc3VwZXIuaW5pdChoYW5kbGVyOmhhbmRsZXIpCiAgfQoKICAvLy8gUnVuIHRoZSBzZXNzaW9uLiBJbnRlcm5hbC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihxdWV1ZTpEaXNwYXRjaFF1ZXVlKSB0aHJvd3MgewogICAgdHJ5IGhhbmRsZXIucmVjZWl2ZU1lc3NhZ2UoaW5pdGlhbE1ldGFkYXRhOmluaXRpYWxNZXRhZGF0YSkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIGxldCByZXF1ZXN0TWVzc2FnZSA9IHRyeSB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgICAgbGV0IHJlcGx5TWVzc2FnZSA9IHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0OnJlcXVlc3RNZXNzYWdlLCBzZXNzaW9uOiBzZWxmKQogICAgICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZFJlc3BvbnNlKG1lc3NhZ2U6cmVwbHlNZXNzYWdlLnNlcmlhbGl6ZWREYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTpzZWxmLnN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpCiAgICAgIH0KICAgIH0KICB9Cn0K" + templates["server-session-unary.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFVuYXJ5KQp7eyBhY2Nlc3MgfX0gY2xhc3Mge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0gOiB7eyAufHNlcnZpY2U6ZmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgc3VwZXIuaW5pdChoYW5kbGVyOmhhbmRsZXIpCiAgfQoKICAvLy8gUnVuIHRoZSBzZXNzaW9uLiBJbnRlcm5hbC4KICBmaWxlcHJpdmF0ZSBmdW5jIHJ1bihxdWV1ZTpEaXNwYXRjaFF1ZXVlKSB0aHJvd3MgewogICAgdHJ5IGhhbmRsZXIucmVjZWl2ZU1lc3NhZ2UoaW5pdGlhbE1ldGFkYXRhOmluaXRpYWxNZXRhZGF0YSkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIGxldCByZXF1ZXN0TWVzc2FnZSA9IHRyeSB7eyBtZXRob2R8aW5wdXQgfX0oc2VyaWFsaXplZERhdGE6cmVxdWVzdERhdGEpCiAgICAgICAgbGV0IHJlcGx5TWVzc2FnZSA9IHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0OnJlcXVlc3RNZXNzYWdlLCBzZXNzaW9uOiBzZWxmKQogICAgICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZFJlc3BvbnNlKG1lc3NhZ2U6cmVwbHlNZXNzYWdlLnNlcmlhbGl6ZWREYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTpzZWxmLnN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTpzZWxmLnN0YXR1c01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEpCiAgICAgIH0KICAgIH0KICB9Cn0K" - templates["server.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IGZpbGUubmFtZSB9fQogKgogKi8KCi8qCiAqCiAqIENvcHlyaWdodCAyMDE3LCBHb29nbGUgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6CiAqCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogZGlzdHJpYnV0aW9uLgogKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICovCgppbXBvcnQgRm91bmRhdGlvbgppbXBvcnQgRGlzcGF0Y2gKaW1wb3J0IGdSUEMKLy8teyUgZm9yIHNlcnZpY2UgaW4gZmlsZS5zZXJ2aWNlICV9CgovLy8gVHlwZSBmb3IgZXJyb3JzIHRocm93biBmcm9tIGdlbmVyYXRlZCBzZXJ2ZXIgY29kZS4KcHVibGljIGVudW0ge3sgLnxzZXJ2ZXJlcnJvcjpmaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQp9CgovLy8gVG8gYnVpbGQgYSBzZXJ2ZXIsIGltcGxlbWVudCBhIGNsYXNzIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBwcm90b2NvbC4KcHVibGljIHByb3RvY29sIHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19IHsKICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0ocmVxdWVzdCA6IHt7IG1ldGhvZHxpbnB1dCB9fSwgc2Vzc2lvbiA6IHt7IC58c2Vzc2lvbjpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fQogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0IDoge3sgbWV0aG9kfGlucHV0IH19LCBzZXNzaW9uIDoge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uIDoge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQogIGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHNlc3Npb24gOiB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSkgdGhyb3dzCiAgLy8teyUgZW5kaWYgJX0KICAvLy17JSBlbmRmb3IgJX0KfQoKLy8vIENvbW1vbiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiBlYWNoIHNlcnZpY2Ugc2Vzc2lvbi4KcHVibGljIGNsYXNzIHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBmaWxlcHJpdmF0ZSB2YXIgaGFuZGxlciA6IGdSUEMuSGFuZGxlcgogIHB1YmxpYyB2YXIgcmVxdWVzdE1ldGFkYXRhIDogTWV0YWRhdGEgeyByZXR1cm4gaGFuZGxlci5yZXF1ZXN0TWV0YWRhdGEgfQoKICBwdWJsaWMgdmFyIHN0YXR1c0NvZGUgOiBJbnQgPSAwCiAgcHVibGljIHZhciBzdGF0dXNNZXNzYWdlIDogU3RyaW5nID0gIk9LIgogIHB1YmxpYyB2YXIgaW5pdGlhbE1ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAgcHVibGljIHZhciB0cmFpbGluZ01ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIpIHsKICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKICB9Cn0KCi8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLXVuYXJ5LnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1zZXJ2ZXJzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLWNsaWVudHN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1iaWRpc3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBlbmRmb3IgJX0KCi8vLyBNYWluIHNlcnZlciBmb3IgZ2VuZXJhdGVkIHNlcnZpY2UKcHVibGljIGNsYXNzIHt7IC58c2VydmVyOmZpbGUsc2VydmljZSB9fSB7CiAgcHJpdmF0ZSB2YXIgYWRkcmVzczogU3RyaW5nCiAgcHJpdmF0ZSB2YXIgc2VydmVyOiBnUlBDLlNlcnZlcgogIHByaXZhdGUgdmFyIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fT8KCiAgLy8vIENyZWF0ZSBhIHNlcnZlciB0aGF0IGFjY2VwdHMgaW5zZWN1cmUgY29ubmVjdGlvbnMuCiAgcHVibGljIGluaXQoYWRkcmVzczpTdHJpbmcsCiAgICAgICAgICAgICAgcHJvdmlkZXI6e3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIGdSUEMuaW5pdGlhbGl6ZSgpCiAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCiAgICBzZWxmLnByb3ZpZGVyID0gcHJvdmlkZXIKICAgIHNlbGYuc2VydmVyID0gZ1JQQy5TZXJ2ZXIoYWRkcmVzczphZGRyZXNzKQogIH0KCiAgLy8vIENyZWF0ZSBhIHNlcnZlciB0aGF0IGFjY2VwdHMgc2VjdXJlIGNvbm5lY3Rpb25zLgogIHB1YmxpYyBpbml0PyhhZGRyZXNzOlN0cmluZywKICAgICAgICAgICAgICAgY2VydGlmaWNhdGVVUkw6VVJMLAogICAgICAgICAgICAgICBrZXlVUkw6VVJMLAogICAgICAgICAgICAgICBwcm92aWRlcjp7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIHNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgZ3VhcmQKICAgICAgbGV0IGNlcnRpZmljYXRlID0gdHJ5PyBTdHJpbmcoY29udGVudHNPZjogY2VydGlmaWNhdGVVUkwsIGVuY29kaW5nOiAudXRmOCksCiAgICAgIGxldCBrZXkgPSB0cnk/IFN0cmluZyhjb250ZW50c09mOiBrZXlVUkwsIGVuY29kaW5nOiAudXRmOCkKICAgICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG5pbAogICAgfQogICAgc2VsZi5zZXJ2ZXIgPSBnUlBDLlNlcnZlcihhZGRyZXNzOmFkZHJlc3MsIGtleTprZXksIGNlcnRzOmNlcnRpZmljYXRlKQogIH0KCiAgLy8vIFN0YXJ0IHRoZSBzZXJ2ZXIuCiAgcHVibGljIGZ1bmMgc3RhcnQocXVldWU6RGlzcGF0Y2hRdWV1ZSA9IERpc3BhdGNoUXVldWUuZ2xvYmFsKCkpIHsKICAgIGd1YXJkIGxldCBwcm92aWRlciA9IHNlbGYucHJvdmlkZXIgZWxzZSB7CiAgICAgIGFzc2VydChmYWxzZSkgLy8gdGhlIHNlcnZlciByZXF1aXJlcyBhIHByb3ZpZGVyCiAgICB9CiAgICBzZXJ2ZXIucnVuIHsoaGFuZGxlcikgaW4KICAgICAgcHJpbnQoIlNlcnZlciByZWNlaXZlZCByZXF1ZXN0IHRvICIgKyBoYW5kbGVyLmhvc3QKICAgICAgICArICIgY2FsbGluZyAiICsgaGFuZGxlci5tZXRob2QKICAgICAgICArICIgZnJvbSAiICsgaGFuZGxlci5jYWxsZXIKICAgICAgICArICIgd2l0aCAiICsgU3RyaW5nKGRlc2NyaWJpbmc6aGFuZGxlci5yZXF1ZXN0TWV0YWRhdGEpICkKCiAgICAgIGRvIHsKICAgICAgICBzd2l0Y2ggaGFuZGxlci5tZXRob2QgewogICAgICAgIC8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KICAgICAgICBjYXNlICJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSI6CiAgICAgICAgICB0cnkge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0oaGFuZGxlcjpoYW5kbGVyLCBwcm92aWRlcjpwcm92aWRlcikucnVuKHF1ZXVlOnF1ZXVlKQogICAgICAgIC8vLXslIGVuZGZvciAlfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBicmVhayAvLyBoYW5kbGUgdW5rbm93biByZXF1ZXN0cwogICAgICAgIH0KICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgcHJpbnQoIlNlcnZlciBlcnJvcjogXChlcnJvcikiKQogICAgICB9CiAgICB9CiAgfQp9Ci8vLXslIGVuZGZvciAlfQo=" + templates["server.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IGZpbGUubmFtZSB9fQogKgogKi8KCi8qCiAqCiAqIENvcHlyaWdodCAyMDE3LCBHb29nbGUgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6CiAqCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogZGlzdHJpYnV0aW9uLgogKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICoKICovCgppbXBvcnQgRm91bmRhdGlvbgppbXBvcnQgRGlzcGF0Y2gKaW1wb3J0IGdSUEMKLy8teyUgZm9yIHNlcnZpY2UgaW4gZmlsZS5zZXJ2aWNlICV9CgovLy8gVHlwZSBmb3IgZXJyb3JzIHRocm93biBmcm9tIGdlbmVyYXRlZCBzZXJ2ZXIgY29kZS4Ke3sgYWNjZXNzIH19IGVudW0ge3sgLnxzZXJ2ZXJlcnJvcjpmaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQp9CgovLy8gVG8gYnVpbGQgYSBzZXJ2ZXIsIGltcGxlbWVudCBhIGNsYXNzIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBwcm90b2NvbC4Ke3sgYWNjZXNzIH19IHByb3RvY29sIHt7IC58cHJvdmlkZXI6ZmlsZSxzZXJ2aWNlIH19IHsKICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0ocmVxdWVzdCA6IHt7IG1ldGhvZHxpbnB1dCB9fSwgc2Vzc2lvbiA6IHt7IC58c2Vzc2lvbjpmaWxlLHNlcnZpY2UsbWV0aG9kIH19KSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fQogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0IDoge3sgbWV0aG9kfGlucHV0IH19LCBzZXNzaW9uIDoge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uIDoge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQogIGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHNlc3Npb24gOiB7eyAufHNlc3Npb246ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSkgdGhyb3dzCiAgLy8teyUgZW5kaWYgJX0KICAvLy17JSBlbmRmb3IgJX0KfQoKLy8vIENvbW1vbiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiBlYWNoIHNlcnZpY2Ugc2Vzc2lvbi4Ke3sgYWNjZXNzIH19IGNsYXNzIHt7IC58c2VydmljZTpmaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBmaWxlcHJpdmF0ZSB2YXIgaGFuZGxlciA6IGdSUEMuSGFuZGxlcgogIHt7IGFjY2VzcyB9fSB2YXIgcmVxdWVzdE1ldGFkYXRhIDogTWV0YWRhdGEgeyByZXR1cm4gaGFuZGxlci5yZXF1ZXN0TWV0YWRhdGEgfQoKICB7eyBhY2Nlc3MgfX0gdmFyIHN0YXR1c0NvZGUgOiBJbnQgPSAwCiAge3sgYWNjZXNzIH19IHZhciBzdGF0dXNNZXNzYWdlIDogU3RyaW5nID0gIk9LIgogIHt7IGFjY2VzcyB9fSB2YXIgaW5pdGlhbE1ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAge3sgYWNjZXNzIH19IHZhciB0cmFpbGluZ01ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIpIHsKICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKICB9Cn0KCi8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLXVuYXJ5LnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1zZXJ2ZXJzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLWNsaWVudHN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1iaWRpc3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBlbmRmb3IgJX0KCi8vLyBNYWluIHNlcnZlciBmb3IgZ2VuZXJhdGVkIHNlcnZpY2UKe3sgYWNjZXNzIH19IGNsYXNzIHt7IC58c2VydmVyOmZpbGUsc2VydmljZSB9fSB7CiAgcHJpdmF0ZSB2YXIgYWRkcmVzczogU3RyaW5nCiAgcHJpdmF0ZSB2YXIgc2VydmVyOiBnUlBDLlNlcnZlcgogIHByaXZhdGUgdmFyIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fT8KCiAgLy8vIENyZWF0ZSBhIHNlcnZlciB0aGF0IGFjY2VwdHMgaW5zZWN1cmUgY29ubmVjdGlvbnMuCiAge3sgYWNjZXNzIH19IGluaXQoYWRkcmVzczpTdHJpbmcsCiAgICAgICAgICAgICAgcHJvdmlkZXI6e3sgLnxwcm92aWRlcjpmaWxlLHNlcnZpY2UgfX0pIHsKICAgIGdSUEMuaW5pdGlhbGl6ZSgpCiAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCiAgICBzZWxmLnByb3ZpZGVyID0gcHJvdmlkZXIKICAgIHNlbGYuc2VydmVyID0gZ1JQQy5TZXJ2ZXIoYWRkcmVzczphZGRyZXNzKQogIH0KCiAgLy8vIENyZWF0ZSBhIHNlcnZlciB0aGF0IGFjY2VwdHMgc2VjdXJlIGNvbm5lY3Rpb25zLgogIHt7IGFjY2VzcyB9fSBpbml0PyhhZGRyZXNzOlN0cmluZywKICAgICAgICAgICAgICAgY2VydGlmaWNhdGVVUkw6VVJMLAogICAgICAgICAgICAgICBrZXlVUkw6VVJMLAogICAgICAgICAgICAgICBwcm92aWRlcjp7eyAufHByb3ZpZGVyOmZpbGUsc2VydmljZSB9fSkgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIHNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKICAgIHNlbGYucHJvdmlkZXIgPSBwcm92aWRlcgogICAgZ3VhcmQKICAgICAgbGV0IGNlcnRpZmljYXRlID0gdHJ5PyBTdHJpbmcoY29udGVudHNPZjogY2VydGlmaWNhdGVVUkwsIGVuY29kaW5nOiAudXRmOCksCiAgICAgIGxldCBrZXkgPSB0cnk/IFN0cmluZyhjb250ZW50c09mOiBrZXlVUkwsIGVuY29kaW5nOiAudXRmOCkKICAgICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG5pbAogICAgfQogICAgc2VsZi5zZXJ2ZXIgPSBnUlBDLlNlcnZlcihhZGRyZXNzOmFkZHJlc3MsIGtleTprZXksIGNlcnRzOmNlcnRpZmljYXRlKQogIH0KCiAgLy8vIFN0YXJ0IHRoZSBzZXJ2ZXIuCiAge3sgYWNjZXNzIH19IGZ1bmMgc3RhcnQocXVldWU6RGlzcGF0Y2hRdWV1ZSA9IERpc3BhdGNoUXVldWUuZ2xvYmFsKCkpIHsKICAgIGd1YXJkIGxldCBwcm92aWRlciA9IHNlbGYucHJvdmlkZXIgZWxzZSB7CiAgICAgIGFzc2VydChmYWxzZSkgLy8gdGhlIHNlcnZlciByZXF1aXJlcyBhIHByb3ZpZGVyCiAgICB9CiAgICBzZXJ2ZXIucnVuIHsoaGFuZGxlcikgaW4KICAgICAgcHJpbnQoIlNlcnZlciByZWNlaXZlZCByZXF1ZXN0IHRvICIgKyBoYW5kbGVyLmhvc3QKICAgICAgICArICIgY2FsbGluZyAiICsgaGFuZGxlci5tZXRob2QKICAgICAgICArICIgZnJvbSAiICsgaGFuZGxlci5jYWxsZXIKICAgICAgICArICIgd2l0aCAiICsgU3RyaW5nKGRlc2NyaWJpbmc6aGFuZGxlci5yZXF1ZXN0TWV0YWRhdGEpICkKCiAgICAgIGRvIHsKICAgICAgICBzd2l0Y2ggaGFuZGxlci5tZXRob2QgewogICAgICAgIC8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KICAgICAgICBjYXNlICJ7eyAufHBhdGg6ZmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSI6CiAgICAgICAgICB0cnkge3sgLnxzZXNzaW9uOmZpbGUsc2VydmljZSxtZXRob2QgfX0oaGFuZGxlcjpoYW5kbGVyLCBwcm92aWRlcjpwcm92aWRlcikucnVuKHF1ZXVlOnF1ZXVlKQogICAgICAgIC8vLXslIGVuZGZvciAlfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBicmVhayAvLyBoYW5kbGUgdW5rbm93biByZXF1ZXN0cwogICAgICAgIH0KICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgcHJpbnQoIlNlcnZlciBlcnJvcjogXChlcnJvcikiKQogICAgICB9CiAgICB9CiAgfQp9Ci8vLXslIGVuZGZvciAlfQo=" return templates } diff --git a/Plugin/Templates/client-call-bidistreaming.swift b/Plugin/Templates/client-call-bidistreaming.swift index 6b4332656..23c5303b6 100644 --- a/Plugin/Templates/client-call-bidistreaming.swift +++ b/Plugin/Templates/client-call-bidistreaming.swift @@ -1,5 +1,5 @@ /// {{ method.name }} (Bidirectional Streaming) -public class {{ .|call:file,service,method }} { +{{ access }} class {{ .|call:file,service,method }} { private var call : Call /// Create a call. @@ -15,7 +15,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to wait for a result. Blocking. - public func receive() throws -> {{ method|output }} { + {{ access }} func receive() throws -> {{ method|output }} { var returnError : {{ .|clienterror:file,service }}? var returnMessage : {{ method|output }}! let sem = DispatchSemaphore(value: 0) @@ -34,7 +34,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to wait for a result. Nonblocking. - public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws { + {{ access }} func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws { do { try call.receiveMessage() {(data) in if let data = data { @@ -51,13 +51,13 @@ public class {{ .|call:file,service,method }} { } /// Call this to send each message in the request stream. - public func send(_ message:{{ method|input }}, errorHandler:@escaping (Error)->()) throws { + {{ access }} func send(_ message:{{ method|input }}, errorHandler:@escaping (Error)->()) throws { let messageData = try message.serializedData() try call.sendMessage(data:messageData, errorHandler:errorHandler) } /// Call this to close the sending connection. Blocking. - public func closeSend() throws { + {{ access }} func closeSend() throws { let sem = DispatchSemaphore(value: 0) try closeSend() { sem.signal() @@ -66,7 +66,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to close the sending connection. Nonblocking. - public func closeSend(completion:@escaping ()->()) throws { + {{ access }} func closeSend(completion:@escaping ()->()) throws { try call.close() { completion() } diff --git a/Plugin/Templates/client-call-clientstreaming.swift b/Plugin/Templates/client-call-clientstreaming.swift index cbb56fa93..d13f77c0b 100644 --- a/Plugin/Templates/client-call-clientstreaming.swift +++ b/Plugin/Templates/client-call-clientstreaming.swift @@ -1,5 +1,5 @@ /// {{ method.name }} (Client Streaming) -public class {{ .|call:file,service,method }} { +{{ access }} class {{ .|call:file,service,method }} { private var call : Call /// Create a call. @@ -15,13 +15,13 @@ public class {{ .|call:file,service,method }} { } /// Call this to send each message in the request stream. Nonblocking. - public func send(_ message:{{ method|input }}, errorHandler:@escaping (Error)->()) throws { + {{ access }} func send(_ message:{{ method|input }}, errorHandler:@escaping (Error)->()) throws { let messageData = try message.serializedData() try call.sendMessage(data:messageData, errorHandler:errorHandler) } /// Call this to close the connection and wait for a response. Blocking. - public func closeAndReceive() throws -> {{ method|output }} { + {{ access }} func closeAndReceive() throws -> {{ method|output }} { var returnError : {{ .|clienterror:file,service }}? var returnResponse : {{ method|output }}! let sem = DispatchSemaphore(value: 0) @@ -42,7 +42,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to close the connection and wait for a response. Nonblocking. - public func closeAndReceive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) + {{ access }} func closeAndReceive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws { do { try call.receiveMessage() {(responseData) in diff --git a/Plugin/Templates/client-call-serverstreaming.swift b/Plugin/Templates/client-call-serverstreaming.swift index 2c8333aea..88f485e49 100644 --- a/Plugin/Templates/client-call-serverstreaming.swift +++ b/Plugin/Templates/client-call-serverstreaming.swift @@ -1,5 +1,5 @@ /// {{ method.name }} (Server Streaming) -public class {{ .|call:file,service,method }} { +{{ access }} class {{ .|call:file,service,method }} { private var call : Call /// Create a call. @@ -21,7 +21,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to wait for a result. Blocking. - public func receive() throws -> {{ method|output }} { + {{ access }} func receive() throws -> {{ method|output }} { var returnError : {{ .|clienterror:file,service }}? var returnResponse : {{ method|output }}! let sem = DispatchSemaphore(value: 0) @@ -40,7 +40,7 @@ public class {{ .|call:file,service,method }} { } /// Call this to wait for a result. Nonblocking. - public func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws { + {{ access }} func receive(completion:@escaping ({{ method|output }}?, {{ .|clienterror:file,service }}?)->()) throws { do { try call.receiveMessage() {(responseData) in if let responseData = responseData { diff --git a/Plugin/Templates/client-call-unary.swift b/Plugin/Templates/client-call-unary.swift index 7c1e08a2a..dcdb65199 100644 --- a/Plugin/Templates/client-call-unary.swift +++ b/Plugin/Templates/client-call-unary.swift @@ -1,5 +1,5 @@ /// {{ method.name }} (Unary) -public class {{ .|call:file,service,method }} { +{{ access }} class {{ .|call:file,service,method }} { private var call : Call /// Create a call. diff --git a/Plugin/Templates/client.pb.swift b/Plugin/Templates/client.pb.swift index 2ee232be4..5ca84cdac 100644 --- a/Plugin/Templates/client.pb.swift +++ b/Plugin/Templates/client.pb.swift @@ -45,7 +45,7 @@ import gRPC //-{% for service in file.service %} /// Type for errors thrown from generated client code. -public enum {{ .|clienterror:file,service }} : Error { +{{ access }} enum {{ .|clienterror:file,service }} : Error { case endOfStream case invalidMessageReceived case error(c: CallResult) @@ -66,16 +66,16 @@ public enum {{ .|clienterror:file,service }} : Error { //-{% endif %} //-{% endfor %} /// Call methods of this class to make API calls. -public class {{ .|serviceclass:file,service }} { +{{ access }} class {{ .|serviceclass:file,service }} { private var channel: Channel /// This metadata will be sent with all requests. - public var metadata : Metadata + {{ access }} var metadata : Metadata /// This property allows the service host name to be overridden. /// For example, it can be used to make calls to "localhost:8080" /// appear to be to "example.com". - public var host : String { + {{ access }} var host : String { get { return self.channel.host } @@ -85,14 +85,14 @@ public class {{ .|serviceclass:file,service }} { } /// Create a client that makes insecure connections. - public init(address: String) { + {{ access }} init(address: String) { gRPC.initialize() channel = Channel(address:address) metadata = Metadata() } /// Create a client that makes secure connections. - public init(address: String, certificates: String?, host: String?) { + {{ access }} init(address: String, certificates: String?, host: String?) { gRPC.initialize() channel = Channel(address:address, certificates:certificates, host:host) metadata = Metadata() @@ -101,13 +101,13 @@ public class {{ .|serviceclass:file,service }} { //-{% for method in service.method %} //-{% if not method.clientStreaming and not method.serverStreaming %} /// Synchronous. Unary. - public func {{ method.name|lowercase }}(_ request: {{ method|input }}) + {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }}) throws -> {{ method|output }} { return try {{ .|call:file,service,method }}(channel).run(request:request, metadata:metadata) } /// Asynchronous. Unary. - public func {{ method.name|lowercase }}(_ request: {{ method|input }}, + {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }}, completion: @escaping ({{ method|output }}?, CallResult)->()) throws -> {{ .|call:file,service,method }} { @@ -120,7 +120,7 @@ public class {{ .|serviceclass:file,service }} { /// Asynchronous. Server-streaming. /// Send the initial message. /// Use methods on the returned object to get streamed responses. - public func {{ method.name|lowercase }}(_ request: {{ method|input }}, completion: @escaping (CallResult)->()) + {{ access }} func {{ method.name|lowercase }}(_ request: {{ method|input }}, completion: @escaping (CallResult)->()) throws -> {{ .|call:file,service,method }} { return try {{ .|call:file,service,method }}(channel).start(request:request, metadata:metadata, completion:completion) @@ -130,7 +130,7 @@ public class {{ .|serviceclass:file,service }} { /// Asynchronous. Client-streaming. /// Use methods on the returned object to stream messages and /// to close the connection and wait for a final response. - public func {{ method.name|lowercase }}(completion: @escaping (CallResult)->()) + {{ access }} func {{ method.name|lowercase }}(completion: @escaping (CallResult)->()) throws -> {{ .|call:file,service,method }} { return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion) @@ -140,7 +140,7 @@ public class {{ .|serviceclass:file,service }} { /// Asynchronous. Bidirectional-streaming. /// Use methods on the returned object to stream messages, /// to wait for replies, and to close the connection. - public func {{ method.name|lowercase }}(completion: @escaping (CallResult)->()) + {{ access }} func {{ method.name|lowercase }}(completion: @escaping (CallResult)->()) throws -> {{ .|call:file,service,method }} { return try {{ .|call:file,service,method }}(channel).start(metadata:metadata, completion:completion) diff --git a/Plugin/Templates/server-session-bidistreaming.swift b/Plugin/Templates/server-session-bidistreaming.swift index daf338960..75ef66df8 100644 --- a/Plugin/Templates/server-session-bidistreaming.swift +++ b/Plugin/Templates/server-session-bidistreaming.swift @@ -1,5 +1,5 @@ // {{ method.name }} (Bidirectional Streaming) -public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { +{{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { private var provider : {{ .|provider:file,service }} /// Create a session. @@ -9,7 +9,7 @@ public class {{ .|session:file,service,method }} : {{ .|service:file,service }}S } /// Receive a message. Blocks until a message is received or the client closes the connection. - public func receive() throws -> {{ method|input }} { + {{ access }} func receive() throws -> {{ method|input }} { let sem = DispatchSemaphore(value: 0) var requestMessage : {{ method|input }}? try self.handler.receiveMessage() {(requestData) in @@ -31,12 +31,12 @@ public class {{ .|session:file,service,method }} : {{ .|service:file,service }}S } /// Send a message. Nonblocking. - public func send(_ response: {{ method|output }}) throws { + {{ access }} func send(_ response: {{ method|output }}) throws { try handler.sendResponse(message:response.serializedData()) {} } /// Close a connection. Blocks until the connection is closed. - public func close() throws { + {{ access }} func close() throws { let sem = DispatchSemaphore(value: 0) try self.handler.sendStatus(statusCode:self.statusCode, statusMessage:self.statusMessage, diff --git a/Plugin/Templates/server-session-clientstreaming.swift b/Plugin/Templates/server-session-clientstreaming.swift index 78956db16..56d59d226 100644 --- a/Plugin/Templates/server-session-clientstreaming.swift +++ b/Plugin/Templates/server-session-clientstreaming.swift @@ -1,5 +1,5 @@ // {{ method.name }} (Client Streaming) -public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { +{{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { private var provider : {{ .|provider:file,service }} /// Create a session. @@ -9,7 +9,7 @@ public class {{ .|session:file,service,method }} : {{ .|service:file,service }}S } /// Receive a message. Blocks until a message is received or the client closes the connection. - public func receive() throws -> {{ method|input }} { + {{ access }} func receive() throws -> {{ method|input }} { let sem = DispatchSemaphore(value: 0) var requestMessage : {{ method|input }}? try self.handler.receiveMessage() {(requestData) in @@ -26,7 +26,7 @@ public class {{ .|session:file,service,method }} : {{ .|service:file,service }}S } /// Send a response and close the connection. - public func sendAndClose(_ response: {{ method|output }}) throws { + {{ access }} func sendAndClose(_ response: {{ method|output }}) throws { try self.handler.sendResponse(message:response.serializedData(), statusCode:self.statusCode, statusMessage:self.statusMessage, diff --git a/Plugin/Templates/server-session-serverstreaming.swift b/Plugin/Templates/server-session-serverstreaming.swift index 925ad1070..97fd76593 100644 --- a/Plugin/Templates/server-session-serverstreaming.swift +++ b/Plugin/Templates/server-session-serverstreaming.swift @@ -1,5 +1,5 @@ // {{ method.name }} (Server Streaming) -public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { +{{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { private var provider : {{ .|provider:file,service }} /// Create a session. @@ -9,7 +9,7 @@ public class {{ .|session:file,service,method }} : {{ .|service:file,service }}S } /// Send a message. Nonblocking. - public func send(_ response: {{ method|output }}) throws { + {{ access }} func send(_ response: {{ method|output }}) throws { try handler.sendResponse(message:response.serializedData()) {} } diff --git a/Plugin/Templates/server-session-unary.swift b/Plugin/Templates/server-session-unary.swift index 6330667fc..fde8afe8e 100644 --- a/Plugin/Templates/server-session-unary.swift +++ b/Plugin/Templates/server-session-unary.swift @@ -1,5 +1,5 @@ // {{ method.name }} (Unary) -public class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { +{{ access }} class {{ .|session:file,service,method }} : {{ .|service:file,service }}Session { private var provider : {{ .|provider:file,service }} /// Create a session. diff --git a/Plugin/Templates/server.pb.swift b/Plugin/Templates/server.pb.swift index 84a9258cf..b7fbb62b4 100644 --- a/Plugin/Templates/server.pb.swift +++ b/Plugin/Templates/server.pb.swift @@ -45,12 +45,12 @@ import gRPC //-{% for service in file.service %} /// Type for errors thrown from generated server code. -public enum {{ .|servererror:file,service }} : Error { +{{ access }} enum {{ .|servererror:file,service }} : Error { case endOfStream } /// To build a server, implement a class that conforms to this protocol. -public protocol {{ .|provider:file,service }} { +{{ access }} protocol {{ .|provider:file,service }} { //-{% for method in service.method %} //-{% if not method.clientStreaming and not method.serverStreaming %} func {{ method.name|lowercase }}(request : {{ method|input }}, session : {{ .|session:file,service,method }}) throws -> {{ method|output }} @@ -68,14 +68,14 @@ public protocol {{ .|provider:file,service }} { } /// Common properties available in each service session. -public class {{ .|service:file,service }}Session { +{{ access }} class {{ .|service:file,service }}Session { fileprivate var handler : gRPC.Handler - public var requestMetadata : Metadata { return handler.requestMetadata } + {{ access }} var requestMetadata : Metadata { return handler.requestMetadata } - public var statusCode : Int = 0 - public var statusMessage : String = "OK" - public var initialMetadata : Metadata = Metadata() - public var trailingMetadata : Metadata = Metadata() + {{ access }} var statusCode : Int = 0 + {{ access }} var statusMessage : String = "OK" + {{ access }} var initialMetadata : Metadata = Metadata() + {{ access }} var trailingMetadata : Metadata = Metadata() fileprivate init(handler:gRPC.Handler) { self.handler = handler @@ -98,13 +98,13 @@ public class {{ .|service:file,service }}Session { //-{% endfor %} /// Main server for generated service -public class {{ .|server:file,service }} { +{{ access }} class {{ .|server:file,service }} { private var address: String private var server: gRPC.Server private var provider: {{ .|provider:file,service }}? /// Create a server that accepts insecure connections. - public init(address:String, + {{ access }} init(address:String, provider:{{ .|provider:file,service }}) { gRPC.initialize() self.address = address @@ -113,7 +113,7 @@ public class {{ .|server:file,service }} { } /// Create a server that accepts secure connections. - public init?(address:String, + {{ access }} init?(address:String, certificateURL:URL, keyURL:URL, provider:{{ .|provider:file,service }}) { @@ -130,7 +130,7 @@ public class {{ .|server:file,service }} { } /// Start the server. - public func start(queue:DispatchQueue = DispatchQueue.global()) { + {{ access }} func start(queue:DispatchQueue = DispatchQueue.global()) { guard let provider = self.provider else { assert(false) // the server requires a provider } diff --git a/README.md b/README.md index dac98c35a..2681029f0 100644 --- a/README.md +++ b/README.md @@ -61,21 +61,11 @@ search path. Invoke them with commands like the following: protoc \ --swift_out=. \ - --swift_opt=Visibility=Public \ - --plugin=` - - protoc \ --swiftgrpc_out=. By convention the `--swift_out` option invokes the `protoc-gen-swift` plugin and `--swiftgrpc_out` invokes `protoc-gen-swiftgrpc`. -The `--swift_opt` flag passes an option to `protoc-gen-swift` that -makes message classes public, which is necessary to use them with -gRPC. The `--plugin` option is only needed by older versions of -`protoc` that are unable to find the plugin binaries when options -are specified. - ### Building your project Most `grpc-swift` development is done with the Swift Package Manager. @@ -124,20 +114,6 @@ testing with the following versions: - Swift 3.1 (swiftlang-802.0.53 clang-802.0.42) - swift-protobuf 0.9.901 -Also, please note that recent changes to swift-proto cause generated structs -to have the "internal" access level. To allow them to be used in the -public interfaces generated by the grpc-swift plugin, please generate -your proto structs with the following protoc options: - - protoc \ - --swift_out=. \ - --swift_opt=Visibility=Public \ - --plugin=` - -More details on the `Visibility` option are [here](https://github.com/apple/swift-protobuf/blob/master/Documentation/PLUGIN.md#generation-option-visibility---visibility-of-generated-types). -Due to limitations in `protoc`, the `--plugin` option must be used to -specify the path to `protoc-gen-swift` whever the `--swift_opt` flag is used. - ## License grpc-swift is released under the same license as