# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: poc.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='poc.proto',
  package='poc',
  syntax='proto3',
  serialized_pb=_b('\n\tpoc.proto\x12\x03poc\"\"\n\x06Params\x12\n\n\x02ip\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\t\"\x14\n\x04Logs\x12\x0c\n\x04line\x18\x01 \x01(\t27\n\x08Notebook\x12+\n\rStartNotebook\x12\x0b.poc.Params\x1a\t.poc.Logs\"\x00\x30\x01\x42\x36\n\x1bio.grpc.examples.routeguideB\x0fRouteGuideProtoP\x01\xa2\x02\x03RTGb\x06proto3')
)




_PARAMS = _descriptor.Descriptor(
  name='Params',
  full_name='poc.Params',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='ip', full_name='poc.Params.ip', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='port', full_name='poc.Params.port', index=1,
      number=2, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=18,
  serialized_end=52,
)


_LOGS = _descriptor.Descriptor(
  name='Logs',
  full_name='poc.Logs',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='line', full_name='poc.Logs.line', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=_b("").decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=54,
  serialized_end=74,
)

DESCRIPTOR.message_types_by_name['Params'] = _PARAMS
DESCRIPTOR.message_types_by_name['Logs'] = _LOGS
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

Params = _reflection.GeneratedProtocolMessageType('Params', (_message.Message,), dict(
  DESCRIPTOR = _PARAMS,
  __module__ = 'poc_pb2'
  # @@protoc_insertion_point(class_scope:poc.Params)
  ))
_sym_db.RegisterMessage(Params)

Logs = _reflection.GeneratedProtocolMessageType('Logs', (_message.Message,), dict(
  DESCRIPTOR = _LOGS,
  __module__ = 'poc_pb2'
  # @@protoc_insertion_point(class_scope:poc.Logs)
  ))
_sym_db.RegisterMessage(Logs)


DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.routeguideB\017RouteGuideProtoP\001\242\002\003RTG'))

_NOTEBOOK = _descriptor.ServiceDescriptor(
  name='Notebook',
  full_name='poc.Notebook',
  file=DESCRIPTOR,
  index=0,
  options=None,
  serialized_start=76,
  serialized_end=131,
  methods=[
  _descriptor.MethodDescriptor(
    name='StartNotebook',
    full_name='poc.Notebook.StartNotebook',
    index=0,
    containing_service=None,
    input_type=_PARAMS,
    output_type=_LOGS,
    options=None,
  ),
])
_sym_db.RegisterServiceDescriptor(_NOTEBOOK)

DESCRIPTOR.services_by_name['Notebook'] = _NOTEBOOK

# @@protoc_insertion_point(module_scope)
