
// Generated from /workspace/millet-porridge-III/grammar/GoParser.g4 by ANTLR 4.9.3


#include "GoParserListener.h"

#include "GoParser.h"


using namespace antlrcpp;
using namespace antlr4;

GoParser::GoParser(TokenStream *input) : Parser(input) {
  _interpreter = new atn::ParserATNSimulator(this, _atn, _decisionToDFA, _sharedContextCache);
}

GoParser::~GoParser() {
  delete _interpreter;
}

std::string GoParser::getGrammarFileName() const {
  return "GoParser.g4";
}

const std::vector<std::string>& GoParser::getRuleNames() const {
  return _ruleNames;
}

dfa::Vocabulary& GoParser::getVocabulary() const {
  return _vocabulary;
}


//----------------- SourceFileContext ------------------------------------------------------------------

GoParser::SourceFileContext::SourceFileContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::PackageClauseContext* GoParser::SourceFileContext::packageClause() {
  return getRuleContext<GoParser::PackageClauseContext>(0);
}

tree::TerminalNode* GoParser::SourceFileContext::EOF() {
  return getToken(GoParser::EOF, 0);
}

std::vector<GoParser::EossContext *> GoParser::SourceFileContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::SourceFileContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}

std::vector<GoParser::ImportDeclContext *> GoParser::SourceFileContext::importDecl() {
  return getRuleContexts<GoParser::ImportDeclContext>();
}

GoParser::ImportDeclContext* GoParser::SourceFileContext::importDecl(size_t i) {
  return getRuleContext<GoParser::ImportDeclContext>(i);
}

std::vector<GoParser::FunctionDeclContext *> GoParser::SourceFileContext::functionDecl() {
  return getRuleContexts<GoParser::FunctionDeclContext>();
}

GoParser::FunctionDeclContext* GoParser::SourceFileContext::functionDecl(size_t i) {
  return getRuleContext<GoParser::FunctionDeclContext>(i);
}

std::vector<GoParser::MethodDeclContext *> GoParser::SourceFileContext::methodDecl() {
  return getRuleContexts<GoParser::MethodDeclContext>();
}

GoParser::MethodDeclContext* GoParser::SourceFileContext::methodDecl(size_t i) {
  return getRuleContext<GoParser::MethodDeclContext>(i);
}

std::vector<GoParser::DeclarationContext *> GoParser::SourceFileContext::declaration() {
  return getRuleContexts<GoParser::DeclarationContext>();
}

GoParser::DeclarationContext* GoParser::SourceFileContext::declaration(size_t i) {
  return getRuleContext<GoParser::DeclarationContext>(i);
}


size_t GoParser::SourceFileContext::getRuleIndex() const {
  return GoParser::RuleSourceFile;
}

void GoParser::SourceFileContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSourceFile(this);
}

void GoParser::SourceFileContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSourceFile(this);
}

GoParser::SourceFileContext* GoParser::sourceFile() {
  SourceFileContext *_localctx = _tracker.createInstance<SourceFileContext>(_ctx, getState());
  enterRule(_localctx, 0, GoParser::RuleSourceFile);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(198);
    packageClause();
    setState(202);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::SEMI)
      | (1ULL << GoParser::HUANHANG)
      | (1ULL << GoParser::HUANHANGG)
      | (1ULL << GoParser::EOSSS))) != 0)) {
      setState(199);
      eoss();
      setState(204);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(214);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::IMPORT) {
      setState(205);
      importDecl();
      setState(209);
      _errHandler->sync(this);
      _la = _input->LA(1);
      while ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::SEMI)
        | (1ULL << GoParser::HUANHANG)
        | (1ULL << GoParser::HUANHANGG)
        | (1ULL << GoParser::EOSSS))) != 0)) {
        setState(206);
        eoss();
        setState(211);
        _errHandler->sync(this);
        _la = _input->LA(1);
      }
      setState(216);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(230);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::VAR))) != 0)) {
      setState(220);
      _errHandler->sync(this);
      switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 3, _ctx)) {
      case 1: {
        setState(217);
        functionDecl();
        break;
      }

      case 2: {
        setState(218);
        methodDecl();
        break;
      }

      case 3: {
        setState(219);
        declaration();
        break;
      }

      default:
        break;
      }
      setState(225);
      _errHandler->sync(this);
      _la = _input->LA(1);
      while ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::SEMI)
        | (1ULL << GoParser::HUANHANG)
        | (1ULL << GoParser::HUANHANGG)
        | (1ULL << GoParser::EOSSS))) != 0)) {
        setState(222);
        eoss();
        setState(227);
        _errHandler->sync(this);
        _la = _input->LA(1);
      }
      setState(232);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(233);
    match(GoParser::EOF);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- PackageClauseContext ------------------------------------------------------------------

GoParser::PackageClauseContext::PackageClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::PackageClauseContext::PACKAGE() {
  return getToken(GoParser::PACKAGE, 0);
}

tree::TerminalNode* GoParser::PackageClauseContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::PackageClauseContext::getRuleIndex() const {
  return GoParser::RulePackageClause;
}

void GoParser::PackageClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterPackageClause(this);
}

void GoParser::PackageClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitPackageClause(this);
}

GoParser::PackageClauseContext* GoParser::packageClause() {
  PackageClauseContext *_localctx = _tracker.createInstance<PackageClauseContext>(_ctx, getState());
  enterRule(_localctx, 2, GoParser::RulePackageClause);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(235);
    match(GoParser::PACKAGE);
    setState(236);
    antlrcpp::downCast<PackageClauseContext *>(_localctx)->packageName = match(GoParser::IDENTIFIER);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ImportDeclContext ------------------------------------------------------------------

GoParser::ImportDeclContext::ImportDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ImportDeclContext::IMPORT() {
  return getToken(GoParser::IMPORT, 0);
}

std::vector<GoParser::ImportSpecContext *> GoParser::ImportDeclContext::importSpec() {
  return getRuleContexts<GoParser::ImportSpecContext>();
}

GoParser::ImportSpecContext* GoParser::ImportDeclContext::importSpec(size_t i) {
  return getRuleContext<GoParser::ImportSpecContext>(i);
}

tree::TerminalNode* GoParser::ImportDeclContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::ImportDeclContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

std::vector<GoParser::EossContext *> GoParser::ImportDeclContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::ImportDeclContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::ImportDeclContext::getRuleIndex() const {
  return GoParser::RuleImportDecl;
}

void GoParser::ImportDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterImportDecl(this);
}

void GoParser::ImportDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitImportDecl(this);
}

GoParser::ImportDeclContext* GoParser::importDecl() {
  ImportDeclContext *_localctx = _tracker.createInstance<ImportDeclContext>(_ctx, getState());
  enterRule(_localctx, 4, GoParser::RuleImportDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(238);
    match(GoParser::IMPORT);
    setState(250);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::IDENTIFIER:
      case GoParser::DOT:
      case GoParser::RAW_STRING_LIT:
      case GoParser::INTERPRETED_STRING_LIT: {
        setState(239);
        importSpec();
        break;
      }

      case GoParser::L_PAREN: {
        setState(240);
        match(GoParser::L_PAREN);
        setState(246);
        _errHandler->sync(this);
        _la = _input->LA(1);
        while (((((_la - 27) & ~ 0x3fULL) == 0) &&
          ((1ULL << (_la - 27)) & ((1ULL << (GoParser::IDENTIFIER - 27))
          | (1ULL << (GoParser::DOT - 27))
          | (1ULL << (GoParser::RAW_STRING_LIT - 27))
          | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 27)))) != 0)) {
          setState(241);
          importSpec();
          setState(242);
          eoss();
          setState(248);
          _errHandler->sync(this);
          _la = _input->LA(1);
        }
        setState(249);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ImportSpecContext ------------------------------------------------------------------

GoParser::ImportSpecContext::ImportSpecContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ImportPathContext* GoParser::ImportSpecContext::importPath() {
  return getRuleContext<GoParser::ImportPathContext>(0);
}

tree::TerminalNode* GoParser::ImportSpecContext::DOT() {
  return getToken(GoParser::DOT, 0);
}

tree::TerminalNode* GoParser::ImportSpecContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::ImportSpecContext::getRuleIndex() const {
  return GoParser::RuleImportSpec;
}

void GoParser::ImportSpecContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterImportSpec(this);
}

void GoParser::ImportSpecContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitImportSpec(this);
}

GoParser::ImportSpecContext* GoParser::importSpec() {
  ImportSpecContext *_localctx = _tracker.createInstance<ImportSpecContext>(_ctx, getState());
  enterRule(_localctx, 6, GoParser::RuleImportSpec);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(253);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::IDENTIFIER

    || _la == GoParser::DOT) {
      setState(252);
      antlrcpp::downCast<ImportSpecContext *>(_localctx)->alias = _input->LT(1);
      _la = _input->LA(1);
      if (!(_la == GoParser::IDENTIFIER

      || _la == GoParser::DOT)) {
        antlrcpp::downCast<ImportSpecContext *>(_localctx)->alias = _errHandler->recoverInline(this);
      }
      else {
        _errHandler->reportMatch(this);
        consume();
      }
    }
    setState(255);
    importPath();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ImportPathContext ------------------------------------------------------------------

GoParser::ImportPathContext::ImportPathContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::String_Context* GoParser::ImportPathContext::string_() {
  return getRuleContext<GoParser::String_Context>(0);
}


size_t GoParser::ImportPathContext::getRuleIndex() const {
  return GoParser::RuleImportPath;
}

void GoParser::ImportPathContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterImportPath(this);
}

void GoParser::ImportPathContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitImportPath(this);
}

GoParser::ImportPathContext* GoParser::importPath() {
  ImportPathContext *_localctx = _tracker.createInstance<ImportPathContext>(_ctx, getState());
  enterRule(_localctx, 8, GoParser::RuleImportPath);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(257);
    string_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- DeclarationContext ------------------------------------------------------------------

GoParser::DeclarationContext::DeclarationContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ConstDeclContext* GoParser::DeclarationContext::constDecl() {
  return getRuleContext<GoParser::ConstDeclContext>(0);
}

GoParser::TypeDeclContext* GoParser::DeclarationContext::typeDecl() {
  return getRuleContext<GoParser::TypeDeclContext>(0);
}

GoParser::VarDeclContext* GoParser::DeclarationContext::varDecl() {
  return getRuleContext<GoParser::VarDeclContext>(0);
}


size_t GoParser::DeclarationContext::getRuleIndex() const {
  return GoParser::RuleDeclaration;
}

void GoParser::DeclarationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterDeclaration(this);
}

void GoParser::DeclarationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitDeclaration(this);
}

GoParser::DeclarationContext* GoParser::declaration() {
  DeclarationContext *_localctx = _tracker.createInstance<DeclarationContext>(_ctx, getState());
  enterRule(_localctx, 10, GoParser::RuleDeclaration);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(262);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::CONST: {
        enterOuterAlt(_localctx, 1);
        setState(259);
        constDecl();
        break;
      }

      case GoParser::TYPE: {
        enterOuterAlt(_localctx, 2);
        setState(260);
        typeDecl();
        break;
      }

      case GoParser::VAR: {
        enterOuterAlt(_localctx, 3);
        setState(261);
        varDecl();
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ConstDeclContext ------------------------------------------------------------------

GoParser::ConstDeclContext::ConstDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ConstDeclContext::CONST() {
  return getToken(GoParser::CONST, 0);
}

std::vector<GoParser::ConstSpecContext *> GoParser::ConstDeclContext::constSpec() {
  return getRuleContexts<GoParser::ConstSpecContext>();
}

GoParser::ConstSpecContext* GoParser::ConstDeclContext::constSpec(size_t i) {
  return getRuleContext<GoParser::ConstSpecContext>(i);
}

tree::TerminalNode* GoParser::ConstDeclContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::ConstDeclContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

std::vector<GoParser::EossContext *> GoParser::ConstDeclContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::ConstDeclContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::ConstDeclContext::getRuleIndex() const {
  return GoParser::RuleConstDecl;
}

void GoParser::ConstDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterConstDecl(this);
}

void GoParser::ConstDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitConstDecl(this);
}

GoParser::ConstDeclContext* GoParser::constDecl() {
  ConstDeclContext *_localctx = _tracker.createInstance<ConstDeclContext>(_ctx, getState());
  enterRule(_localctx, 12, GoParser::RuleConstDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(264);
    match(GoParser::CONST);
    setState(276);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::IDENTIFIER: {
        setState(265);
        constSpec();
        break;
      }

      case GoParser::L_PAREN: {
        setState(266);
        match(GoParser::L_PAREN);
        setState(272);
        _errHandler->sync(this);
        _la = _input->LA(1);
        while (_la == GoParser::IDENTIFIER) {
          setState(267);
          constSpec();
          setState(268);
          eoss();
          setState(274);
          _errHandler->sync(this);
          _la = _input->LA(1);
        }
        setState(275);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ConstSpecContext ------------------------------------------------------------------

GoParser::ConstSpecContext::ConstSpecContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::IdentifierListContext* GoParser::ConstSpecContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

tree::TerminalNode* GoParser::ConstSpecContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}

GoParser::ExpressionListContext* GoParser::ConstSpecContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}

GoParser::Type_Context* GoParser::ConstSpecContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}


size_t GoParser::ConstSpecContext::getRuleIndex() const {
  return GoParser::RuleConstSpec;
}

void GoParser::ConstSpecContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterConstSpec(this);
}

void GoParser::ConstSpecContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitConstSpec(this);
}

GoParser::ConstSpecContext* GoParser::constSpec() {
  ConstSpecContext *_localctx = _tracker.createInstance<ConstSpecContext>(_ctx, getState());
  enterRule(_localctx, 14, GoParser::RuleConstSpec);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(278);
    identifierList();
    setState(284);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 13, _ctx)) {
    case 1: {
      setState(280);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if (((((_la - 3) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 3)) & ((1ULL << (GoParser::FUNC - 3))
        | (1ULL << (GoParser::INTERFACE - 3))
        | (1ULL << (GoParser::MAP - 3))
        | (1ULL << (GoParser::STRUCT - 3))
        | (1ULL << (GoParser::CHAN - 3))
        | (1ULL << (GoParser::IDENTIFIER - 3))
        | (1ULL << (GoParser::L_PAREN - 3))
        | (1ULL << (GoParser::L_BRACKET - 3))
        | (1ULL << (GoParser::STAR - 3))
        | (1ULL << (GoParser::RECEIVE - 3)))) != 0)) {
        setState(279);
        type_();
      }
      setState(282);
      match(GoParser::ASSIGN);
      setState(283);
      expressionList();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- IdentifierListContext ------------------------------------------------------------------

GoParser::IdentifierListContext::IdentifierListContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<tree::TerminalNode *> GoParser::IdentifierListContext::IDENTIFIER() {
  return getTokens(GoParser::IDENTIFIER);
}

tree::TerminalNode* GoParser::IdentifierListContext::IDENTIFIER(size_t i) {
  return getToken(GoParser::IDENTIFIER, i);
}

std::vector<tree::TerminalNode *> GoParser::IdentifierListContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::IdentifierListContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::IdentifierListContext::getRuleIndex() const {
  return GoParser::RuleIdentifierList;
}

void GoParser::IdentifierListContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterIdentifierList(this);
}

void GoParser::IdentifierListContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitIdentifierList(this);
}

GoParser::IdentifierListContext* GoParser::identifierList() {
  IdentifierListContext *_localctx = _tracker.createInstance<IdentifierListContext>(_ctx, getState());
  enterRule(_localctx, 16, GoParser::RuleIdentifierList);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(286);
    match(GoParser::IDENTIFIER);
    setState(291);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::COMMA) {
      setState(287);
      match(GoParser::COMMA);
      setState(288);
      match(GoParser::IDENTIFIER);
      setState(293);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExpressionListContext ------------------------------------------------------------------

GoParser::ExpressionListContext::ExpressionListContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::ExpressionContext *> GoParser::ExpressionListContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::ExpressionListContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

std::vector<tree::TerminalNode *> GoParser::ExpressionListContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::ExpressionListContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::ExpressionListContext::getRuleIndex() const {
  return GoParser::RuleExpressionList;
}

void GoParser::ExpressionListContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterExpressionList(this);
}

void GoParser::ExpressionListContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitExpressionList(this);
}

GoParser::ExpressionListContext* GoParser::expressionList() {
  ExpressionListContext *_localctx = _tracker.createInstance<ExpressionListContext>(_ctx, getState());
  enterRule(_localctx, 18, GoParser::RuleExpressionList);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    size_t alt;
    enterOuterAlt(_localctx, 1);
    setState(294);
    expression(0);
    setState(299);
    _errHandler->sync(this);
    alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 15, _ctx);
    while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) {
      if (alt == 1) {
        setState(295);
        match(GoParser::COMMA);
        setState(296);
        expression(0); 
      }
      setState(301);
      _errHandler->sync(this);
      alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 15, _ctx);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeDeclContext ------------------------------------------------------------------

GoParser::TypeDeclContext::TypeDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::TypeDeclContext::TYPE() {
  return getToken(GoParser::TYPE, 0);
}

std::vector<GoParser::TypeSpecContext *> GoParser::TypeDeclContext::typeSpec() {
  return getRuleContexts<GoParser::TypeSpecContext>();
}

GoParser::TypeSpecContext* GoParser::TypeDeclContext::typeSpec(size_t i) {
  return getRuleContext<GoParser::TypeSpecContext>(i);
}

tree::TerminalNode* GoParser::TypeDeclContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::TypeDeclContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

std::vector<GoParser::EossContext *> GoParser::TypeDeclContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::TypeDeclContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::TypeDeclContext::getRuleIndex() const {
  return GoParser::RuleTypeDecl;
}

void GoParser::TypeDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeDecl(this);
}

void GoParser::TypeDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeDecl(this);
}

GoParser::TypeDeclContext* GoParser::typeDecl() {
  TypeDeclContext *_localctx = _tracker.createInstance<TypeDeclContext>(_ctx, getState());
  enterRule(_localctx, 20, GoParser::RuleTypeDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(302);
    match(GoParser::TYPE);
    setState(314);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::IDENTIFIER: {
        setState(303);
        typeSpec();
        break;
      }

      case GoParser::L_PAREN: {
        setState(304);
        match(GoParser::L_PAREN);
        setState(310);
        _errHandler->sync(this);
        _la = _input->LA(1);
        while (_la == GoParser::IDENTIFIER) {
          setState(305);
          typeSpec();
          setState(306);
          eoss();
          setState(312);
          _errHandler->sync(this);
          _la = _input->LA(1);
        }
        setState(313);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeSpecContext ------------------------------------------------------------------

GoParser::TypeSpecContext::TypeSpecContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::TypeSpecContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

GoParser::Type_Context* GoParser::TypeSpecContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

tree::TerminalNode* GoParser::TypeSpecContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}


size_t GoParser::TypeSpecContext::getRuleIndex() const {
  return GoParser::RuleTypeSpec;
}

void GoParser::TypeSpecContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeSpec(this);
}

void GoParser::TypeSpecContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeSpec(this);
}

GoParser::TypeSpecContext* GoParser::typeSpec() {
  TypeSpecContext *_localctx = _tracker.createInstance<TypeSpecContext>(_ctx, getState());
  enterRule(_localctx, 22, GoParser::RuleTypeSpec);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(316);
    match(GoParser::IDENTIFIER);
    setState(318);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::ASSIGN) {
      setState(317);
      match(GoParser::ASSIGN);
    }
    setState(320);
    type_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- FunctionDeclContext ------------------------------------------------------------------

GoParser::FunctionDeclContext::FunctionDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::FunctionDeclContext::FUNC() {
  return getToken(GoParser::FUNC, 0);
}

tree::TerminalNode* GoParser::FunctionDeclContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

GoParser::SignatureContext* GoParser::FunctionDeclContext::signature() {
  return getRuleContext<GoParser::SignatureContext>(0);
}

GoParser::BlockContext* GoParser::FunctionDeclContext::block() {
  return getRuleContext<GoParser::BlockContext>(0);
}


size_t GoParser::FunctionDeclContext::getRuleIndex() const {
  return GoParser::RuleFunctionDecl;
}

void GoParser::FunctionDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterFunctionDecl(this);
}

void GoParser::FunctionDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitFunctionDecl(this);
}

GoParser::FunctionDeclContext* GoParser::functionDecl() {
  FunctionDeclContext *_localctx = _tracker.createInstance<FunctionDeclContext>(_ctx, getState());
  enterRule(_localctx, 24, GoParser::RuleFunctionDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(322);
    match(GoParser::FUNC);
    setState(323);
    match(GoParser::IDENTIFIER);

    setState(324);
    signature();
    setState(326);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::L_CURLY) {
      setState(325);
      block();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- MethodDeclContext ------------------------------------------------------------------

GoParser::MethodDeclContext::MethodDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::MethodDeclContext::FUNC() {
  return getToken(GoParser::FUNC, 0);
}

GoParser::ReceiverContext* GoParser::MethodDeclContext::receiver() {
  return getRuleContext<GoParser::ReceiverContext>(0);
}

tree::TerminalNode* GoParser::MethodDeclContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

GoParser::SignatureContext* GoParser::MethodDeclContext::signature() {
  return getRuleContext<GoParser::SignatureContext>(0);
}

GoParser::BlockContext* GoParser::MethodDeclContext::block() {
  return getRuleContext<GoParser::BlockContext>(0);
}


size_t GoParser::MethodDeclContext::getRuleIndex() const {
  return GoParser::RuleMethodDecl;
}

void GoParser::MethodDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterMethodDecl(this);
}

void GoParser::MethodDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitMethodDecl(this);
}

GoParser::MethodDeclContext* GoParser::methodDecl() {
  MethodDeclContext *_localctx = _tracker.createInstance<MethodDeclContext>(_ctx, getState());
  enterRule(_localctx, 26, GoParser::RuleMethodDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(328);
    match(GoParser::FUNC);
    setState(329);
    receiver();
    setState(330);
    match(GoParser::IDENTIFIER);

    setState(331);
    signature();
    setState(333);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::L_CURLY) {
      setState(332);
      block();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ReceiverContext ------------------------------------------------------------------

GoParser::ReceiverContext::ReceiverContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ParametersContext* GoParser::ReceiverContext::parameters() {
  return getRuleContext<GoParser::ParametersContext>(0);
}


size_t GoParser::ReceiverContext::getRuleIndex() const {
  return GoParser::RuleReceiver;
}

void GoParser::ReceiverContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterReceiver(this);
}

void GoParser::ReceiverContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitReceiver(this);
}

GoParser::ReceiverContext* GoParser::receiver() {
  ReceiverContext *_localctx = _tracker.createInstance<ReceiverContext>(_ctx, getState());
  enterRule(_localctx, 28, GoParser::RuleReceiver);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(335);
    parameters();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- VarDeclContext ------------------------------------------------------------------

GoParser::VarDeclContext::VarDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::VarDeclContext::VAR() {
  return getToken(GoParser::VAR, 0);
}

std::vector<GoParser::VarSpecContext *> GoParser::VarDeclContext::varSpec() {
  return getRuleContexts<GoParser::VarSpecContext>();
}

GoParser::VarSpecContext* GoParser::VarDeclContext::varSpec(size_t i) {
  return getRuleContext<GoParser::VarSpecContext>(i);
}

tree::TerminalNode* GoParser::VarDeclContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::VarDeclContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

std::vector<GoParser::EossContext *> GoParser::VarDeclContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::VarDeclContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::VarDeclContext::getRuleIndex() const {
  return GoParser::RuleVarDecl;
}

void GoParser::VarDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterVarDecl(this);
}

void GoParser::VarDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitVarDecl(this);
}

GoParser::VarDeclContext* GoParser::varDecl() {
  VarDeclContext *_localctx = _tracker.createInstance<VarDeclContext>(_ctx, getState());
  enterRule(_localctx, 30, GoParser::RuleVarDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(337);
    match(GoParser::VAR);
    setState(349);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::IDENTIFIER: {
        setState(338);
        varSpec();
        break;
      }

      case GoParser::L_PAREN: {
        setState(339);
        match(GoParser::L_PAREN);
        setState(345);
        _errHandler->sync(this);
        _la = _input->LA(1);
        while (_la == GoParser::IDENTIFIER) {
          setState(340);
          varSpec();
          setState(341);
          eoss();
          setState(347);
          _errHandler->sync(this);
          _la = _input->LA(1);
        }
        setState(348);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- VarSpecContext ------------------------------------------------------------------

GoParser::VarSpecContext::VarSpecContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::IdentifierListContext* GoParser::VarSpecContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

GoParser::Type_Context* GoParser::VarSpecContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

tree::TerminalNode* GoParser::VarSpecContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}

GoParser::ExpressionListContext* GoParser::VarSpecContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}


size_t GoParser::VarSpecContext::getRuleIndex() const {
  return GoParser::RuleVarSpec;
}

void GoParser::VarSpecContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterVarSpec(this);
}

void GoParser::VarSpecContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitVarSpec(this);
}

GoParser::VarSpecContext* GoParser::varSpec() {
  VarSpecContext *_localctx = _tracker.createInstance<VarSpecContext>(_ctx, getState());
  enterRule(_localctx, 32, GoParser::RuleVarSpec);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(351);
    identifierList();
    setState(359);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::IDENTIFIER:
      case GoParser::L_PAREN:
      case GoParser::L_BRACKET:
      case GoParser::STAR:
      case GoParser::RECEIVE: {
        setState(352);
        type_();
        setState(355);
        _errHandler->sync(this);

        _la = _input->LA(1);
        if (_la == GoParser::ASSIGN) {
          setState(353);
          match(GoParser::ASSIGN);
          setState(354);
          expressionList();
        }
        break;
      }

      case GoParser::ASSIGN: {
        setState(357);
        match(GoParser::ASSIGN);
        setState(358);
        expressionList();
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- BlockContext ------------------------------------------------------------------

GoParser::BlockContext::BlockContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::BlockContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::BlockContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

std::vector<GoParser::EossContext *> GoParser::BlockContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::BlockContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}

GoParser::StatementListContext* GoParser::BlockContext::statementList() {
  return getRuleContext<GoParser::StatementListContext>(0);
}


size_t GoParser::BlockContext::getRuleIndex() const {
  return GoParser::RuleBlock;
}

void GoParser::BlockContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterBlock(this);
}

void GoParser::BlockContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitBlock(this);
}

GoParser::BlockContext* GoParser::block() {
  BlockContext *_localctx = _tracker.createInstance<BlockContext>(_ctx, getState());
  enterRule(_localctx, 34, GoParser::RuleBlock);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(361);
    match(GoParser::L_CURLY);
    setState(365);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::SEMI)
      | (1ULL << GoParser::HUANHANG)
      | (1ULL << GoParser::HUANHANGG)
      | (1ULL << GoParser::EOSSS))) != 0)) {
      setState(362);
      eoss();
      setState(367);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(369);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(368);
      statementList();
    }
    setState(371);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- StatementListContext ------------------------------------------------------------------

GoParser::StatementListContext::StatementListContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::StatementContext *> GoParser::StatementListContext::statement() {
  return getRuleContexts<GoParser::StatementContext>();
}

GoParser::StatementContext* GoParser::StatementListContext::statement(size_t i) {
  return getRuleContext<GoParser::StatementContext>(i);
}

std::vector<GoParser::EossContext *> GoParser::StatementListContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::StatementListContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::StatementListContext::getRuleIndex() const {
  return GoParser::RuleStatementList;
}

void GoParser::StatementListContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterStatementList(this);
}

void GoParser::StatementListContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitStatementList(this);
}

GoParser::StatementListContext* GoParser::statementList() {
  StatementListContext *_localctx = _tracker.createInstance<StatementListContext>(_ctx, getState());
  enterRule(_localctx, 36, GoParser::RuleStatementList);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(379); 
    _errHandler->sync(this);
    _la = _input->LA(1);
    do {
      setState(373);
      statement();
      setState(375); 
      _errHandler->sync(this);
      _la = _input->LA(1);
      do {
        setState(374);
        eoss();
        setState(377); 
        _errHandler->sync(this);
        _la = _input->LA(1);
      } while ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::SEMI)
        | (1ULL << GoParser::HUANHANG)
        | (1ULL << GoParser::HUANHANGG)
        | (1ULL << GoParser::EOSSS))) != 0));
      setState(381); 
      _errHandler->sync(this);
      _la = _input->LA(1);
    } while ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0));
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- StatementContext ------------------------------------------------------------------

GoParser::StatementContext::StatementContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::DeclarationContext* GoParser::StatementContext::declaration() {
  return getRuleContext<GoParser::DeclarationContext>(0);
}

GoParser::LabeledStmtContext* GoParser::StatementContext::labeledStmt() {
  return getRuleContext<GoParser::LabeledStmtContext>(0);
}

GoParser::SimpleStmtContext* GoParser::StatementContext::simpleStmt() {
  return getRuleContext<GoParser::SimpleStmtContext>(0);
}

GoParser::GoStmtContext* GoParser::StatementContext::goStmt() {
  return getRuleContext<GoParser::GoStmtContext>(0);
}

GoParser::ReturnStmtContext* GoParser::StatementContext::returnStmt() {
  return getRuleContext<GoParser::ReturnStmtContext>(0);
}

GoParser::BreakStmtContext* GoParser::StatementContext::breakStmt() {
  return getRuleContext<GoParser::BreakStmtContext>(0);
}

GoParser::ContinueStmtContext* GoParser::StatementContext::continueStmt() {
  return getRuleContext<GoParser::ContinueStmtContext>(0);
}

GoParser::GotoStmtContext* GoParser::StatementContext::gotoStmt() {
  return getRuleContext<GoParser::GotoStmtContext>(0);
}

GoParser::FallthroughStmtContext* GoParser::StatementContext::fallthroughStmt() {
  return getRuleContext<GoParser::FallthroughStmtContext>(0);
}

GoParser::BlockContext* GoParser::StatementContext::block() {
  return getRuleContext<GoParser::BlockContext>(0);
}

GoParser::IfStmtContext* GoParser::StatementContext::ifStmt() {
  return getRuleContext<GoParser::IfStmtContext>(0);
}

GoParser::SwitchStmtContext* GoParser::StatementContext::switchStmt() {
  return getRuleContext<GoParser::SwitchStmtContext>(0);
}

GoParser::SelectStmtContext* GoParser::StatementContext::selectStmt() {
  return getRuleContext<GoParser::SelectStmtContext>(0);
}

GoParser::ForStmtContext* GoParser::StatementContext::forStmt() {
  return getRuleContext<GoParser::ForStmtContext>(0);
}

GoParser::DeferStmtContext* GoParser::StatementContext::deferStmt() {
  return getRuleContext<GoParser::DeferStmtContext>(0);
}


size_t GoParser::StatementContext::getRuleIndex() const {
  return GoParser::RuleStatement;
}

void GoParser::StatementContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterStatement(this);
}

void GoParser::StatementContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitStatement(this);
}

GoParser::StatementContext* GoParser::statement() {
  StatementContext *_localctx = _tracker.createInstance<StatementContext>(_ctx, getState());
  enterRule(_localctx, 38, GoParser::RuleStatement);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(398);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 29, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(383);
      declaration();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(384);
      labeledStmt();
      break;
    }

    case 3: {
      enterOuterAlt(_localctx, 3);
      setState(385);
      simpleStmt();
      break;
    }

    case 4: {
      enterOuterAlt(_localctx, 4);
      setState(386);
      goStmt();
      break;
    }

    case 5: {
      enterOuterAlt(_localctx, 5);
      setState(387);
      returnStmt();
      break;
    }

    case 6: {
      enterOuterAlt(_localctx, 6);
      setState(388);
      breakStmt();
      break;
    }

    case 7: {
      enterOuterAlt(_localctx, 7);
      setState(389);
      continueStmt();
      break;
    }

    case 8: {
      enterOuterAlt(_localctx, 8);
      setState(390);
      gotoStmt();
      break;
    }

    case 9: {
      enterOuterAlt(_localctx, 9);
      setState(391);
      fallthroughStmt();
      break;
    }

    case 10: {
      enterOuterAlt(_localctx, 10);
      setState(392);
      block();
      break;
    }

    case 11: {
      enterOuterAlt(_localctx, 11);
      setState(393);
      ifStmt();
      break;
    }

    case 12: {
      enterOuterAlt(_localctx, 12);
      setState(394);
      switchStmt();
      break;
    }

    case 13: {
      enterOuterAlt(_localctx, 13);
      setState(395);
      selectStmt();
      break;
    }

    case 14: {
      enterOuterAlt(_localctx, 14);
      setState(396);
      forStmt();
      break;
    }

    case 15: {
      enterOuterAlt(_localctx, 15);
      setState(397);
      deferStmt();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SimpleStmtContext ------------------------------------------------------------------

GoParser::SimpleStmtContext::SimpleStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::SendStmtContext* GoParser::SimpleStmtContext::sendStmt() {
  return getRuleContext<GoParser::SendStmtContext>(0);
}

GoParser::IncDecStmtContext* GoParser::SimpleStmtContext::incDecStmt() {
  return getRuleContext<GoParser::IncDecStmtContext>(0);
}

GoParser::AssignmentContext* GoParser::SimpleStmtContext::assignment() {
  return getRuleContext<GoParser::AssignmentContext>(0);
}

GoParser::ExpressionStmtContext* GoParser::SimpleStmtContext::expressionStmt() {
  return getRuleContext<GoParser::ExpressionStmtContext>(0);
}

GoParser::ShortVarDeclContext* GoParser::SimpleStmtContext::shortVarDecl() {
  return getRuleContext<GoParser::ShortVarDeclContext>(0);
}


size_t GoParser::SimpleStmtContext::getRuleIndex() const {
  return GoParser::RuleSimpleStmt;
}

void GoParser::SimpleStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSimpleStmt(this);
}

void GoParser::SimpleStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSimpleStmt(this);
}

GoParser::SimpleStmtContext* GoParser::simpleStmt() {
  SimpleStmtContext *_localctx = _tracker.createInstance<SimpleStmtContext>(_ctx, getState());
  enterRule(_localctx, 40, GoParser::RuleSimpleStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(405);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 30, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(400);
      sendStmt();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(401);
      incDecStmt();
      break;
    }

    case 3: {
      enterOuterAlt(_localctx, 3);
      setState(402);
      assignment();
      break;
    }

    case 4: {
      enterOuterAlt(_localctx, 4);
      setState(403);
      expressionStmt();
      break;
    }

    case 5: {
      enterOuterAlt(_localctx, 5);
      setState(404);
      shortVarDecl();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExpressionStmtContext ------------------------------------------------------------------

GoParser::ExpressionStmtContext::ExpressionStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::ExpressionStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}


size_t GoParser::ExpressionStmtContext::getRuleIndex() const {
  return GoParser::RuleExpressionStmt;
}

void GoParser::ExpressionStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterExpressionStmt(this);
}

void GoParser::ExpressionStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitExpressionStmt(this);
}

GoParser::ExpressionStmtContext* GoParser::expressionStmt() {
  ExpressionStmtContext *_localctx = _tracker.createInstance<ExpressionStmtContext>(_ctx, getState());
  enterRule(_localctx, 42, GoParser::RuleExpressionStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(407);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SendStmtContext ------------------------------------------------------------------

GoParser::SendStmtContext::SendStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::SendStmtContext::RECEIVE() {
  return getToken(GoParser::RECEIVE, 0);
}

std::vector<GoParser::ExpressionContext *> GoParser::SendStmtContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::SendStmtContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}


size_t GoParser::SendStmtContext::getRuleIndex() const {
  return GoParser::RuleSendStmt;
}

void GoParser::SendStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSendStmt(this);
}

void GoParser::SendStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSendStmt(this);
}

GoParser::SendStmtContext* GoParser::sendStmt() {
  SendStmtContext *_localctx = _tracker.createInstance<SendStmtContext>(_ctx, getState());
  enterRule(_localctx, 44, GoParser::RuleSendStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(409);
    antlrcpp::downCast<SendStmtContext *>(_localctx)->channel = expression(0);
    setState(410);
    match(GoParser::RECEIVE);
    setState(411);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- IncDecStmtContext ------------------------------------------------------------------

GoParser::IncDecStmtContext::IncDecStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::IncDecStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

tree::TerminalNode* GoParser::IncDecStmtContext::PLUS_PLUS() {
  return getToken(GoParser::PLUS_PLUS, 0);
}

tree::TerminalNode* GoParser::IncDecStmtContext::MINUS_MINUS() {
  return getToken(GoParser::MINUS_MINUS, 0);
}


size_t GoParser::IncDecStmtContext::getRuleIndex() const {
  return GoParser::RuleIncDecStmt;
}

void GoParser::IncDecStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterIncDecStmt(this);
}

void GoParser::IncDecStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitIncDecStmt(this);
}

GoParser::IncDecStmtContext* GoParser::incDecStmt() {
  IncDecStmtContext *_localctx = _tracker.createInstance<IncDecStmtContext>(_ctx, getState());
  enterRule(_localctx, 46, GoParser::RuleIncDecStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(413);
    expression(0);
    setState(414);
    _la = _input->LA(1);
    if (!(_la == GoParser::PLUS_PLUS

    || _la == GoParser::MINUS_MINUS)) {
    _errHandler->recoverInline(this);
    }
    else {
      _errHandler->reportMatch(this);
      consume();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- AssignmentContext ------------------------------------------------------------------

GoParser::AssignmentContext::AssignmentContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::ExpressionListContext *> GoParser::AssignmentContext::expressionList() {
  return getRuleContexts<GoParser::ExpressionListContext>();
}

GoParser::ExpressionListContext* GoParser::AssignmentContext::expressionList(size_t i) {
  return getRuleContext<GoParser::ExpressionListContext>(i);
}

GoParser::Assign_opContext* GoParser::AssignmentContext::assign_op() {
  return getRuleContext<GoParser::Assign_opContext>(0);
}


size_t GoParser::AssignmentContext::getRuleIndex() const {
  return GoParser::RuleAssignment;
}

void GoParser::AssignmentContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterAssignment(this);
}

void GoParser::AssignmentContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitAssignment(this);
}

GoParser::AssignmentContext* GoParser::assignment() {
  AssignmentContext *_localctx = _tracker.createInstance<AssignmentContext>(_ctx, getState());
  enterRule(_localctx, 48, GoParser::RuleAssignment);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(416);
    expressionList();
    setState(417);
    assign_op();
    setState(418);
    expressionList();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- Assign_opContext ------------------------------------------------------------------

GoParser::Assign_opContext::Assign_opContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::Assign_opContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::PLUS() {
  return getToken(GoParser::PLUS, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::MINUS() {
  return getToken(GoParser::MINUS, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::OR() {
  return getToken(GoParser::OR, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::CARET() {
  return getToken(GoParser::CARET, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::STAR() {
  return getToken(GoParser::STAR, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::DIV() {
  return getToken(GoParser::DIV, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::MOD() {
  return getToken(GoParser::MOD, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::LSHIFT() {
  return getToken(GoParser::LSHIFT, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::RSHIFT() {
  return getToken(GoParser::RSHIFT, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::AMPERSAND() {
  return getToken(GoParser::AMPERSAND, 0);
}

tree::TerminalNode* GoParser::Assign_opContext::BIT_CLEAR() {
  return getToken(GoParser::BIT_CLEAR, 0);
}


size_t GoParser::Assign_opContext::getRuleIndex() const {
  return GoParser::RuleAssign_op;
}

void GoParser::Assign_opContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterAssign_op(this);
}

void GoParser::Assign_opContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitAssign_op(this);
}

GoParser::Assign_opContext* GoParser::assign_op() {
  Assign_opContext *_localctx = _tracker.createInstance<Assign_opContext>(_ctx, getState());
  enterRule(_localctx, 50, GoParser::RuleAssign_op);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(421);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (((((_la - 54) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 54)) & ((1ULL << (GoParser::OR - 54))
      | (1ULL << (GoParser::DIV - 54))
      | (1ULL << (GoParser::MOD - 54))
      | (1ULL << (GoParser::LSHIFT - 54))
      | (1ULL << (GoParser::RSHIFT - 54))
      | (1ULL << (GoParser::BIT_CLEAR - 54))
      | (1ULL << (GoParser::PLUS - 54))
      | (1ULL << (GoParser::MINUS - 54))
      | (1ULL << (GoParser::CARET - 54))
      | (1ULL << (GoParser::STAR - 54))
      | (1ULL << (GoParser::AMPERSAND - 54)))) != 0)) {
      setState(420);
      _la = _input->LA(1);
      if (!(((((_la - 54) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 54)) & ((1ULL << (GoParser::OR - 54))
        | (1ULL << (GoParser::DIV - 54))
        | (1ULL << (GoParser::MOD - 54))
        | (1ULL << (GoParser::LSHIFT - 54))
        | (1ULL << (GoParser::RSHIFT - 54))
        | (1ULL << (GoParser::BIT_CLEAR - 54))
        | (1ULL << (GoParser::PLUS - 54))
        | (1ULL << (GoParser::MINUS - 54))
        | (1ULL << (GoParser::CARET - 54))
        | (1ULL << (GoParser::STAR - 54))
        | (1ULL << (GoParser::AMPERSAND - 54)))) != 0))) {
      _errHandler->recoverInline(this);
      }
      else {
        _errHandler->reportMatch(this);
        consume();
      }
    }
    setState(423);
    match(GoParser::ASSIGN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ShortVarDeclContext ------------------------------------------------------------------

GoParser::ShortVarDeclContext::ShortVarDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::IdentifierListContext* GoParser::ShortVarDeclContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

tree::TerminalNode* GoParser::ShortVarDeclContext::DECLARE_ASSIGN() {
  return getToken(GoParser::DECLARE_ASSIGN, 0);
}

GoParser::ExpressionListContext* GoParser::ShortVarDeclContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}


size_t GoParser::ShortVarDeclContext::getRuleIndex() const {
  return GoParser::RuleShortVarDecl;
}

void GoParser::ShortVarDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterShortVarDecl(this);
}

void GoParser::ShortVarDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitShortVarDecl(this);
}

GoParser::ShortVarDeclContext* GoParser::shortVarDecl() {
  ShortVarDeclContext *_localctx = _tracker.createInstance<ShortVarDeclContext>(_ctx, getState());
  enterRule(_localctx, 52, GoParser::RuleShortVarDecl);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(425);
    identifierList();
    setState(426);
    match(GoParser::DECLARE_ASSIGN);
    setState(427);
    expressionList();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EmptyStmtContext ------------------------------------------------------------------

GoParser::EmptyStmtContext::EmptyStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::EmptyStmtContext::EOSSS() {
  return getToken(GoParser::EOSSS, 0);
}

tree::TerminalNode* GoParser::EmptyStmtContext::SEMI() {
  return getToken(GoParser::SEMI, 0);
}


size_t GoParser::EmptyStmtContext::getRuleIndex() const {
  return GoParser::RuleEmptyStmt;
}

void GoParser::EmptyStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterEmptyStmt(this);
}

void GoParser::EmptyStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitEmptyStmt(this);
}

GoParser::EmptyStmtContext* GoParser::emptyStmt() {
  EmptyStmtContext *_localctx = _tracker.createInstance<EmptyStmtContext>(_ctx, getState());
  enterRule(_localctx, 54, GoParser::RuleEmptyStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(429);
    _la = _input->LA(1);
    if (!(_la == GoParser::SEMI

    || _la == GoParser::EOSSS)) {
    _errHandler->recoverInline(this);
    }
    else {
      _errHandler->reportMatch(this);
      consume();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- LabeledStmtContext ------------------------------------------------------------------

GoParser::LabeledStmtContext::LabeledStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::LabeledStmtContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

tree::TerminalNode* GoParser::LabeledStmtContext::COLON() {
  return getToken(GoParser::COLON, 0);
}

GoParser::StatementContext* GoParser::LabeledStmtContext::statement() {
  return getRuleContext<GoParser::StatementContext>(0);
}


size_t GoParser::LabeledStmtContext::getRuleIndex() const {
  return GoParser::RuleLabeledStmt;
}

void GoParser::LabeledStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLabeledStmt(this);
}

void GoParser::LabeledStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLabeledStmt(this);
}

GoParser::LabeledStmtContext* GoParser::labeledStmt() {
  LabeledStmtContext *_localctx = _tracker.createInstance<LabeledStmtContext>(_ctx, getState());
  enterRule(_localctx, 56, GoParser::RuleLabeledStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(431);
    match(GoParser::IDENTIFIER);
    setState(432);
    match(GoParser::COLON);
    setState(434);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(433);
      statement();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ReturnStmtContext ------------------------------------------------------------------

GoParser::ReturnStmtContext::ReturnStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ReturnStmtContext::RETURN() {
  return getToken(GoParser::RETURN, 0);
}

GoParser::ExpressionListContext* GoParser::ReturnStmtContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}


size_t GoParser::ReturnStmtContext::getRuleIndex() const {
  return GoParser::RuleReturnStmt;
}

void GoParser::ReturnStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterReturnStmt(this);
}

void GoParser::ReturnStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitReturnStmt(this);
}

GoParser::ReturnStmtContext* GoParser::returnStmt() {
  ReturnStmtContext *_localctx = _tracker.createInstance<ReturnStmtContext>(_ctx, getState());
  enterRule(_localctx, 58, GoParser::RuleReturnStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(436);
    match(GoParser::RETURN);
    setState(438);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(437);
      expressionList();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- BreakStmtContext ------------------------------------------------------------------

GoParser::BreakStmtContext::BreakStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::BreakStmtContext::BREAK() {
  return getToken(GoParser::BREAK, 0);
}

tree::TerminalNode* GoParser::BreakStmtContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::BreakStmtContext::getRuleIndex() const {
  return GoParser::RuleBreakStmt;
}

void GoParser::BreakStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterBreakStmt(this);
}

void GoParser::BreakStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitBreakStmt(this);
}

GoParser::BreakStmtContext* GoParser::breakStmt() {
  BreakStmtContext *_localctx = _tracker.createInstance<BreakStmtContext>(_ctx, getState());
  enterRule(_localctx, 60, GoParser::RuleBreakStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(440);
    match(GoParser::BREAK);
    setState(442);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::IDENTIFIER) {
      setState(441);
      match(GoParser::IDENTIFIER);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ContinueStmtContext ------------------------------------------------------------------

GoParser::ContinueStmtContext::ContinueStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ContinueStmtContext::CONTINUE() {
  return getToken(GoParser::CONTINUE, 0);
}

tree::TerminalNode* GoParser::ContinueStmtContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::ContinueStmtContext::getRuleIndex() const {
  return GoParser::RuleContinueStmt;
}

void GoParser::ContinueStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterContinueStmt(this);
}

void GoParser::ContinueStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitContinueStmt(this);
}

GoParser::ContinueStmtContext* GoParser::continueStmt() {
  ContinueStmtContext *_localctx = _tracker.createInstance<ContinueStmtContext>(_ctx, getState());
  enterRule(_localctx, 62, GoParser::RuleContinueStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(444);
    match(GoParser::CONTINUE);
    setState(446);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::IDENTIFIER) {
      setState(445);
      match(GoParser::IDENTIFIER);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- GotoStmtContext ------------------------------------------------------------------

GoParser::GotoStmtContext::GotoStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::GotoStmtContext::GOTO() {
  return getToken(GoParser::GOTO, 0);
}

tree::TerminalNode* GoParser::GotoStmtContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::GotoStmtContext::getRuleIndex() const {
  return GoParser::RuleGotoStmt;
}

void GoParser::GotoStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterGotoStmt(this);
}

void GoParser::GotoStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitGotoStmt(this);
}

GoParser::GotoStmtContext* GoParser::gotoStmt() {
  GotoStmtContext *_localctx = _tracker.createInstance<GotoStmtContext>(_ctx, getState());
  enterRule(_localctx, 64, GoParser::RuleGotoStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(448);
    match(GoParser::GOTO);
    setState(449);
    match(GoParser::IDENTIFIER);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- FallthroughStmtContext ------------------------------------------------------------------

GoParser::FallthroughStmtContext::FallthroughStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::FallthroughStmtContext::FALLTHROUGH() {
  return getToken(GoParser::FALLTHROUGH, 0);
}


size_t GoParser::FallthroughStmtContext::getRuleIndex() const {
  return GoParser::RuleFallthroughStmt;
}

void GoParser::FallthroughStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterFallthroughStmt(this);
}

void GoParser::FallthroughStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitFallthroughStmt(this);
}

GoParser::FallthroughStmtContext* GoParser::fallthroughStmt() {
  FallthroughStmtContext *_localctx = _tracker.createInstance<FallthroughStmtContext>(_ctx, getState());
  enterRule(_localctx, 66, GoParser::RuleFallthroughStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(451);
    match(GoParser::FALLTHROUGH);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- DeferStmtContext ------------------------------------------------------------------

GoParser::DeferStmtContext::DeferStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::DeferStmtContext::DEFER() {
  return getToken(GoParser::DEFER, 0);
}

GoParser::ExpressionContext* GoParser::DeferStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}


size_t GoParser::DeferStmtContext::getRuleIndex() const {
  return GoParser::RuleDeferStmt;
}

void GoParser::DeferStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterDeferStmt(this);
}

void GoParser::DeferStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitDeferStmt(this);
}

GoParser::DeferStmtContext* GoParser::deferStmt() {
  DeferStmtContext *_localctx = _tracker.createInstance<DeferStmtContext>(_ctx, getState());
  enterRule(_localctx, 68, GoParser::RuleDeferStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(453);
    match(GoParser::DEFER);
    setState(454);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- IfStmtContext ------------------------------------------------------------------

GoParser::IfStmtContext::IfStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::IfStmtContext::IF() {
  return getToken(GoParser::IF, 0);
}

std::vector<GoParser::BlockContext *> GoParser::IfStmtContext::block() {
  return getRuleContexts<GoParser::BlockContext>();
}

GoParser::BlockContext* GoParser::IfStmtContext::block(size_t i) {
  return getRuleContext<GoParser::BlockContext>(i);
}

GoParser::ExpressionContext* GoParser::IfStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::EossContext* GoParser::IfStmtContext::eoss() {
  return getRuleContext<GoParser::EossContext>(0);
}

GoParser::SimpleStmtContext* GoParser::IfStmtContext::simpleStmt() {
  return getRuleContext<GoParser::SimpleStmtContext>(0);
}

tree::TerminalNode* GoParser::IfStmtContext::ELSE() {
  return getToken(GoParser::ELSE, 0);
}

GoParser::IfStmtContext* GoParser::IfStmtContext::ifStmt() {
  return getRuleContext<GoParser::IfStmtContext>(0);
}


size_t GoParser::IfStmtContext::getRuleIndex() const {
  return GoParser::RuleIfStmt;
}

void GoParser::IfStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterIfStmt(this);
}

void GoParser::IfStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitIfStmt(this);
}

GoParser::IfStmtContext* GoParser::ifStmt() {
  IfStmtContext *_localctx = _tracker.createInstance<IfStmtContext>(_ctx, getState());
  enterRule(_localctx, 70, GoParser::RuleIfStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(456);
    match(GoParser::IF);
    setState(465);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 36, _ctx)) {
    case 1: {
      setState(457);
      expression(0);
      break;
    }

    case 2: {
      setState(458);
      eoss();
      setState(459);
      expression(0);
      break;
    }

    case 3: {
      setState(461);
      simpleStmt();
      setState(462);
      eoss();
      setState(463);
      expression(0);
      break;
    }

    default:
      break;
    }
    setState(467);
    block();
    setState(473);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::ELSE) {
      setState(468);
      match(GoParser::ELSE);
      setState(471);
      _errHandler->sync(this);
      switch (_input->LA(1)) {
        case GoParser::IF: {
          setState(469);
          ifStmt();
          break;
        }

        case GoParser::L_CURLY: {
          setState(470);
          block();
          break;
        }

      default:
        throw NoViableAltException(this);
      }
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SwitchStmtContext ------------------------------------------------------------------

GoParser::SwitchStmtContext::SwitchStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExprSwitchStmtContext* GoParser::SwitchStmtContext::exprSwitchStmt() {
  return getRuleContext<GoParser::ExprSwitchStmtContext>(0);
}

GoParser::TypeSwitchStmtContext* GoParser::SwitchStmtContext::typeSwitchStmt() {
  return getRuleContext<GoParser::TypeSwitchStmtContext>(0);
}


size_t GoParser::SwitchStmtContext::getRuleIndex() const {
  return GoParser::RuleSwitchStmt;
}

void GoParser::SwitchStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSwitchStmt(this);
}

void GoParser::SwitchStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSwitchStmt(this);
}

GoParser::SwitchStmtContext* GoParser::switchStmt() {
  SwitchStmtContext *_localctx = _tracker.createInstance<SwitchStmtContext>(_ctx, getState());
  enterRule(_localctx, 72, GoParser::RuleSwitchStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(477);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 39, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(475);
      exprSwitchStmt();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(476);
      typeSwitchStmt();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExprSwitchStmtContext ------------------------------------------------------------------

GoParser::ExprSwitchStmtContext::ExprSwitchStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ExprSwitchStmtContext::SWITCH() {
  return getToken(GoParser::SWITCH, 0);
}

tree::TerminalNode* GoParser::ExprSwitchStmtContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::ExprSwitchStmtContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

GoParser::EossContext* GoParser::ExprSwitchStmtContext::eoss() {
  return getRuleContext<GoParser::EossContext>(0);
}

std::vector<GoParser::ExprCaseClauseContext *> GoParser::ExprSwitchStmtContext::exprCaseClause() {
  return getRuleContexts<GoParser::ExprCaseClauseContext>();
}

GoParser::ExprCaseClauseContext* GoParser::ExprSwitchStmtContext::exprCaseClause(size_t i) {
  return getRuleContext<GoParser::ExprCaseClauseContext>(i);
}

GoParser::ExpressionContext* GoParser::ExprSwitchStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::SimpleStmtContext* GoParser::ExprSwitchStmtContext::simpleStmt() {
  return getRuleContext<GoParser::SimpleStmtContext>(0);
}


size_t GoParser::ExprSwitchStmtContext::getRuleIndex() const {
  return GoParser::RuleExprSwitchStmt;
}

void GoParser::ExprSwitchStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterExprSwitchStmt(this);
}

void GoParser::ExprSwitchStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitExprSwitchStmt(this);
}

GoParser::ExprSwitchStmtContext* GoParser::exprSwitchStmt() {
  ExprSwitchStmtContext *_localctx = _tracker.createInstance<ExprSwitchStmtContext>(_ctx, getState());
  enterRule(_localctx, 74, GoParser::RuleExprSwitchStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(479);
    match(GoParser::SWITCH);
    setState(490);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 43, _ctx)) {
    case 1: {
      setState(481);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(480);
        expression(0);
      }
      break;
    }

    case 2: {
      setState(484);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(483);
        simpleStmt();
      }
      setState(486);
      eoss();
      setState(488);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(487);
        expression(0);
      }
      break;
    }

    default:
      break;
    }
    setState(492);
    match(GoParser::L_CURLY);
    setState(496);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::DEFAULT

    || _la == GoParser::CASE) {
      setState(493);
      exprCaseClause();
      setState(498);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(499);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExprCaseClauseContext ------------------------------------------------------------------

GoParser::ExprCaseClauseContext::ExprCaseClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExprSwitchCaseContext* GoParser::ExprCaseClauseContext::exprSwitchCase() {
  return getRuleContext<GoParser::ExprSwitchCaseContext>(0);
}

tree::TerminalNode* GoParser::ExprCaseClauseContext::COLON() {
  return getToken(GoParser::COLON, 0);
}

GoParser::StatementListContext* GoParser::ExprCaseClauseContext::statementList() {
  return getRuleContext<GoParser::StatementListContext>(0);
}


size_t GoParser::ExprCaseClauseContext::getRuleIndex() const {
  return GoParser::RuleExprCaseClause;
}

void GoParser::ExprCaseClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterExprCaseClause(this);
}

void GoParser::ExprCaseClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitExprCaseClause(this);
}

GoParser::ExprCaseClauseContext* GoParser::exprCaseClause() {
  ExprCaseClauseContext *_localctx = _tracker.createInstance<ExprCaseClauseContext>(_ctx, getState());
  enterRule(_localctx, 76, GoParser::RuleExprCaseClause);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(501);
    exprSwitchCase();
    setState(502);
    match(GoParser::COLON);
    setState(504);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(503);
      statementList();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExprSwitchCaseContext ------------------------------------------------------------------

GoParser::ExprSwitchCaseContext::ExprSwitchCaseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ExprSwitchCaseContext::CASE() {
  return getToken(GoParser::CASE, 0);
}

GoParser::ExpressionListContext* GoParser::ExprSwitchCaseContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}

tree::TerminalNode* GoParser::ExprSwitchCaseContext::DEFAULT() {
  return getToken(GoParser::DEFAULT, 0);
}


size_t GoParser::ExprSwitchCaseContext::getRuleIndex() const {
  return GoParser::RuleExprSwitchCase;
}

void GoParser::ExprSwitchCaseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterExprSwitchCase(this);
}

void GoParser::ExprSwitchCaseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitExprSwitchCase(this);
}

GoParser::ExprSwitchCaseContext* GoParser::exprSwitchCase() {
  ExprSwitchCaseContext *_localctx = _tracker.createInstance<ExprSwitchCaseContext>(_ctx, getState());
  enterRule(_localctx, 78, GoParser::RuleExprSwitchCase);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(509);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::CASE: {
        enterOuterAlt(_localctx, 1);
        setState(506);
        match(GoParser::CASE);
        setState(507);
        expressionList();
        break;
      }

      case GoParser::DEFAULT: {
        enterOuterAlt(_localctx, 2);
        setState(508);
        match(GoParser::DEFAULT);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeSwitchStmtContext ------------------------------------------------------------------

GoParser::TypeSwitchStmtContext::TypeSwitchStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::TypeSwitchStmtContext::SWITCH() {
  return getToken(GoParser::SWITCH, 0);
}

tree::TerminalNode* GoParser::TypeSwitchStmtContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::TypeSwitchStmtContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

GoParser::TypeSwitchGuardContext* GoParser::TypeSwitchStmtContext::typeSwitchGuard() {
  return getRuleContext<GoParser::TypeSwitchGuardContext>(0);
}

GoParser::EossContext* GoParser::TypeSwitchStmtContext::eoss() {
  return getRuleContext<GoParser::EossContext>(0);
}

GoParser::SimpleStmtContext* GoParser::TypeSwitchStmtContext::simpleStmt() {
  return getRuleContext<GoParser::SimpleStmtContext>(0);
}

std::vector<GoParser::TypeCaseClauseContext *> GoParser::TypeSwitchStmtContext::typeCaseClause() {
  return getRuleContexts<GoParser::TypeCaseClauseContext>();
}

GoParser::TypeCaseClauseContext* GoParser::TypeSwitchStmtContext::typeCaseClause(size_t i) {
  return getRuleContext<GoParser::TypeCaseClauseContext>(i);
}


size_t GoParser::TypeSwitchStmtContext::getRuleIndex() const {
  return GoParser::RuleTypeSwitchStmt;
}

void GoParser::TypeSwitchStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeSwitchStmt(this);
}

void GoParser::TypeSwitchStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeSwitchStmt(this);
}

GoParser::TypeSwitchStmtContext* GoParser::typeSwitchStmt() {
  TypeSwitchStmtContext *_localctx = _tracker.createInstance<TypeSwitchStmtContext>(_ctx, getState());
  enterRule(_localctx, 80, GoParser::RuleTypeSwitchStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(511);
    match(GoParser::SWITCH);
    setState(520);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 47, _ctx)) {
    case 1: {
      setState(512);
      typeSwitchGuard();
      break;
    }

    case 2: {
      setState(513);
      eoss();
      setState(514);
      typeSwitchGuard();
      break;
    }

    case 3: {
      setState(516);
      simpleStmt();
      setState(517);
      eoss();
      setState(518);
      typeSwitchGuard();
      break;
    }

    default:
      break;
    }
    setState(522);
    match(GoParser::L_CURLY);
    setState(526);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::DEFAULT

    || _la == GoParser::CASE) {
      setState(523);
      typeCaseClause();
      setState(528);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(529);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeSwitchGuardContext ------------------------------------------------------------------

GoParser::TypeSwitchGuardContext::TypeSwitchGuardContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::PrimaryExprContext* GoParser::TypeSwitchGuardContext::primaryExpr() {
  return getRuleContext<GoParser::PrimaryExprContext>(0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::DOT() {
  return getToken(GoParser::DOT, 0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::TYPE() {
  return getToken(GoParser::TYPE, 0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

tree::TerminalNode* GoParser::TypeSwitchGuardContext::DECLARE_ASSIGN() {
  return getToken(GoParser::DECLARE_ASSIGN, 0);
}


size_t GoParser::TypeSwitchGuardContext::getRuleIndex() const {
  return GoParser::RuleTypeSwitchGuard;
}

void GoParser::TypeSwitchGuardContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeSwitchGuard(this);
}

void GoParser::TypeSwitchGuardContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeSwitchGuard(this);
}

GoParser::TypeSwitchGuardContext* GoParser::typeSwitchGuard() {
  TypeSwitchGuardContext *_localctx = _tracker.createInstance<TypeSwitchGuardContext>(_ctx, getState());
  enterRule(_localctx, 82, GoParser::RuleTypeSwitchGuard);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(533);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 49, _ctx)) {
    case 1: {
      setState(531);
      match(GoParser::IDENTIFIER);
      setState(532);
      match(GoParser::DECLARE_ASSIGN);
      break;
    }

    default:
      break;
    }
    setState(535);
    primaryExpr(0);
    setState(536);
    match(GoParser::DOT);
    setState(537);
    match(GoParser::L_PAREN);
    setState(538);
    match(GoParser::TYPE);
    setState(539);
    match(GoParser::R_PAREN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeCaseClauseContext ------------------------------------------------------------------

GoParser::TypeCaseClauseContext::TypeCaseClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::TypeSwitchCaseContext* GoParser::TypeCaseClauseContext::typeSwitchCase() {
  return getRuleContext<GoParser::TypeSwitchCaseContext>(0);
}

tree::TerminalNode* GoParser::TypeCaseClauseContext::COLON() {
  return getToken(GoParser::COLON, 0);
}

GoParser::StatementListContext* GoParser::TypeCaseClauseContext::statementList() {
  return getRuleContext<GoParser::StatementListContext>(0);
}


size_t GoParser::TypeCaseClauseContext::getRuleIndex() const {
  return GoParser::RuleTypeCaseClause;
}

void GoParser::TypeCaseClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeCaseClause(this);
}

void GoParser::TypeCaseClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeCaseClause(this);
}

GoParser::TypeCaseClauseContext* GoParser::typeCaseClause() {
  TypeCaseClauseContext *_localctx = _tracker.createInstance<TypeCaseClauseContext>(_ctx, getState());
  enterRule(_localctx, 84, GoParser::RuleTypeCaseClause);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(541);
    typeSwitchCase();
    setState(542);
    match(GoParser::COLON);
    setState(544);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(543);
      statementList();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeSwitchCaseContext ------------------------------------------------------------------

GoParser::TypeSwitchCaseContext::TypeSwitchCaseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::TypeSwitchCaseContext::CASE() {
  return getToken(GoParser::CASE, 0);
}

GoParser::TypeListContext* GoParser::TypeSwitchCaseContext::typeList() {
  return getRuleContext<GoParser::TypeListContext>(0);
}

tree::TerminalNode* GoParser::TypeSwitchCaseContext::DEFAULT() {
  return getToken(GoParser::DEFAULT, 0);
}


size_t GoParser::TypeSwitchCaseContext::getRuleIndex() const {
  return GoParser::RuleTypeSwitchCase;
}

void GoParser::TypeSwitchCaseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeSwitchCase(this);
}

void GoParser::TypeSwitchCaseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeSwitchCase(this);
}

GoParser::TypeSwitchCaseContext* GoParser::typeSwitchCase() {
  TypeSwitchCaseContext *_localctx = _tracker.createInstance<TypeSwitchCaseContext>(_ctx, getState());
  enterRule(_localctx, 86, GoParser::RuleTypeSwitchCase);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(549);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::CASE: {
        enterOuterAlt(_localctx, 1);
        setState(546);
        match(GoParser::CASE);
        setState(547);
        typeList();
        break;
      }

      case GoParser::DEFAULT: {
        enterOuterAlt(_localctx, 2);
        setState(548);
        match(GoParser::DEFAULT);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeListContext ------------------------------------------------------------------

GoParser::TypeListContext::TypeListContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::Type_Context *> GoParser::TypeListContext::type_() {
  return getRuleContexts<GoParser::Type_Context>();
}

GoParser::Type_Context* GoParser::TypeListContext::type_(size_t i) {
  return getRuleContext<GoParser::Type_Context>(i);
}

std::vector<tree::TerminalNode *> GoParser::TypeListContext::NIL_LIT() {
  return getTokens(GoParser::NIL_LIT);
}

tree::TerminalNode* GoParser::TypeListContext::NIL_LIT(size_t i) {
  return getToken(GoParser::NIL_LIT, i);
}

std::vector<tree::TerminalNode *> GoParser::TypeListContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::TypeListContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::TypeListContext::getRuleIndex() const {
  return GoParser::RuleTypeList;
}

void GoParser::TypeListContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeList(this);
}

void GoParser::TypeListContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeList(this);
}

GoParser::TypeListContext* GoParser::typeList() {
  TypeListContext *_localctx = _tracker.createInstance<TypeListContext>(_ctx, getState());
  enterRule(_localctx, 88, GoParser::RuleTypeList);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(553);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::IDENTIFIER:
      case GoParser::L_PAREN:
      case GoParser::L_BRACKET:
      case GoParser::STAR:
      case GoParser::RECEIVE: {
        setState(551);
        type_();
        break;
      }

      case GoParser::NIL_LIT: {
        setState(552);
        match(GoParser::NIL_LIT);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
    setState(562);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::COMMA) {
      setState(555);
      match(GoParser::COMMA);
      setState(558);
      _errHandler->sync(this);
      switch (_input->LA(1)) {
        case GoParser::FUNC:
        case GoParser::INTERFACE:
        case GoParser::MAP:
        case GoParser::STRUCT:
        case GoParser::CHAN:
        case GoParser::IDENTIFIER:
        case GoParser::L_PAREN:
        case GoParser::L_BRACKET:
        case GoParser::STAR:
        case GoParser::RECEIVE: {
          setState(556);
          type_();
          break;
        }

        case GoParser::NIL_LIT: {
          setState(557);
          match(GoParser::NIL_LIT);
          break;
        }

      default:
        throw NoViableAltException(this);
      }
      setState(564);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SelectStmtContext ------------------------------------------------------------------

GoParser::SelectStmtContext::SelectStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::SelectStmtContext::SELECT() {
  return getToken(GoParser::SELECT, 0);
}

tree::TerminalNode* GoParser::SelectStmtContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::SelectStmtContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

std::vector<GoParser::CommClauseContext *> GoParser::SelectStmtContext::commClause() {
  return getRuleContexts<GoParser::CommClauseContext>();
}

GoParser::CommClauseContext* GoParser::SelectStmtContext::commClause(size_t i) {
  return getRuleContext<GoParser::CommClauseContext>(i);
}


size_t GoParser::SelectStmtContext::getRuleIndex() const {
  return GoParser::RuleSelectStmt;
}

void GoParser::SelectStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSelectStmt(this);
}

void GoParser::SelectStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSelectStmt(this);
}

GoParser::SelectStmtContext* GoParser::selectStmt() {
  SelectStmtContext *_localctx = _tracker.createInstance<SelectStmtContext>(_ctx, getState());
  enterRule(_localctx, 90, GoParser::RuleSelectStmt);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(565);
    match(GoParser::SELECT);
    setState(566);
    match(GoParser::L_CURLY);
    setState(570);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::DEFAULT

    || _la == GoParser::CASE) {
      setState(567);
      commClause();
      setState(572);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(573);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- CommClauseContext ------------------------------------------------------------------

GoParser::CommClauseContext::CommClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::CommCaseContext* GoParser::CommClauseContext::commCase() {
  return getRuleContext<GoParser::CommCaseContext>(0);
}

tree::TerminalNode* GoParser::CommClauseContext::COLON() {
  return getToken(GoParser::COLON, 0);
}

GoParser::StatementListContext* GoParser::CommClauseContext::statementList() {
  return getRuleContext<GoParser::StatementListContext>(0);
}


size_t GoParser::CommClauseContext::getRuleIndex() const {
  return GoParser::RuleCommClause;
}

void GoParser::CommClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterCommClause(this);
}

void GoParser::CommClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitCommClause(this);
}

GoParser::CommClauseContext* GoParser::commClause() {
  CommClauseContext *_localctx = _tracker.createInstance<CommClauseContext>(_ctx, getState());
  enterRule(_localctx, 92, GoParser::RuleCommClause);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(575);
    commCase();
    setState(576);
    match(GoParser::COLON);
    setState(578);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::BREAK)
      | (1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::SELECT)
      | (1ULL << GoParser::DEFER)
      | (1ULL << GoParser::GO)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::GOTO)
      | (1ULL << GoParser::SWITCH)
      | (1ULL << GoParser::CONST)
      | (1ULL << GoParser::FALLTHROUGH)
      | (1ULL << GoParser::IF)
      | (1ULL << GoParser::TYPE)
      | (1ULL << GoParser::CONTINUE)
      | (1ULL << GoParser::FOR)
      | (1ULL << GoParser::RETURN)
      | (1ULL << GoParser::VAR)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(577);
      statementList();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- CommCaseContext ------------------------------------------------------------------

GoParser::CommCaseContext::CommCaseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::CommCaseContext::CASE() {
  return getToken(GoParser::CASE, 0);
}

GoParser::SendStmtContext* GoParser::CommCaseContext::sendStmt() {
  return getRuleContext<GoParser::SendStmtContext>(0);
}

GoParser::RecvStmtContext* GoParser::CommCaseContext::recvStmt() {
  return getRuleContext<GoParser::RecvStmtContext>(0);
}

tree::TerminalNode* GoParser::CommCaseContext::DEFAULT() {
  return getToken(GoParser::DEFAULT, 0);
}


size_t GoParser::CommCaseContext::getRuleIndex() const {
  return GoParser::RuleCommCase;
}

void GoParser::CommCaseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterCommCase(this);
}

void GoParser::CommCaseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitCommCase(this);
}

GoParser::CommCaseContext* GoParser::commCase() {
  CommCaseContext *_localctx = _tracker.createInstance<CommCaseContext>(_ctx, getState());
  enterRule(_localctx, 94, GoParser::RuleCommCase);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(586);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::CASE: {
        enterOuterAlt(_localctx, 1);
        setState(580);
        match(GoParser::CASE);
        setState(583);
        _errHandler->sync(this);
        switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 57, _ctx)) {
        case 1: {
          setState(581);
          sendStmt();
          break;
        }

        case 2: {
          setState(582);
          recvStmt();
          break;
        }

        default:
          break;
        }
        break;
      }

      case GoParser::DEFAULT: {
        enterOuterAlt(_localctx, 2);
        setState(585);
        match(GoParser::DEFAULT);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- RecvStmtContext ------------------------------------------------------------------

GoParser::RecvStmtContext::RecvStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::RecvStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::ExpressionListContext* GoParser::RecvStmtContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}

tree::TerminalNode* GoParser::RecvStmtContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}

GoParser::IdentifierListContext* GoParser::RecvStmtContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

tree::TerminalNode* GoParser::RecvStmtContext::DECLARE_ASSIGN() {
  return getToken(GoParser::DECLARE_ASSIGN, 0);
}


size_t GoParser::RecvStmtContext::getRuleIndex() const {
  return GoParser::RuleRecvStmt;
}

void GoParser::RecvStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterRecvStmt(this);
}

void GoParser::RecvStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitRecvStmt(this);
}

GoParser::RecvStmtContext* GoParser::recvStmt() {
  RecvStmtContext *_localctx = _tracker.createInstance<RecvStmtContext>(_ctx, getState());
  enterRule(_localctx, 96, GoParser::RuleRecvStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(594);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 59, _ctx)) {
    case 1: {
      setState(588);
      expressionList();
      setState(589);
      match(GoParser::ASSIGN);
      break;
    }

    case 2: {
      setState(591);
      identifierList();
      setState(592);
      match(GoParser::DECLARE_ASSIGN);
      break;
    }

    default:
      break;
    }
    setState(596);
    antlrcpp::downCast<RecvStmtContext *>(_localctx)->recvExpr = expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ForStmtContext ------------------------------------------------------------------

GoParser::ForStmtContext::ForStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ForStmtContext::FOR() {
  return getToken(GoParser::FOR, 0);
}

GoParser::BlockContext* GoParser::ForStmtContext::block() {
  return getRuleContext<GoParser::BlockContext>(0);
}

GoParser::ExpressionContext* GoParser::ForStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::ForClauseContext* GoParser::ForStmtContext::forClause() {
  return getRuleContext<GoParser::ForClauseContext>(0);
}

GoParser::RangeClauseContext* GoParser::ForStmtContext::rangeClause() {
  return getRuleContext<GoParser::RangeClauseContext>(0);
}


size_t GoParser::ForStmtContext::getRuleIndex() const {
  return GoParser::RuleForStmt;
}

void GoParser::ForStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterForStmt(this);
}

void GoParser::ForStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitForStmt(this);
}

GoParser::ForStmtContext* GoParser::forStmt() {
  ForStmtContext *_localctx = _tracker.createInstance<ForStmtContext>(_ctx, getState());
  enterRule(_localctx, 98, GoParser::RuleForStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(598);
    match(GoParser::FOR);
    setState(602);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 60, _ctx)) {
    case 1: {
      setState(599);
      expression(0);
      break;
    }

    case 2: {
      setState(600);
      forClause();
      break;
    }

    case 3: {
      setState(601);
      rangeClause();
      break;
    }

    default:
      break;
    }
    setState(604);
    block();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ForClauseContext ------------------------------------------------------------------

GoParser::ForClauseContext::ForClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::EossContext *> GoParser::ForClauseContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::ForClauseContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}

GoParser::ExpressionContext* GoParser::ForClauseContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

std::vector<GoParser::SimpleStmtContext *> GoParser::ForClauseContext::simpleStmt() {
  return getRuleContexts<GoParser::SimpleStmtContext>();
}

GoParser::SimpleStmtContext* GoParser::ForClauseContext::simpleStmt(size_t i) {
  return getRuleContext<GoParser::SimpleStmtContext>(i);
}


size_t GoParser::ForClauseContext::getRuleIndex() const {
  return GoParser::RuleForClause;
}

void GoParser::ForClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterForClause(this);
}

void GoParser::ForClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitForClause(this);
}

GoParser::ForClauseContext* GoParser::forClause() {
  ForClauseContext *_localctx = _tracker.createInstance<ForClauseContext>(_ctx, getState());
  enterRule(_localctx, 100, GoParser::RuleForClause);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(607);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(606);
      antlrcpp::downCast<ForClauseContext *>(_localctx)->initStmt = simpleStmt();
    }
    setState(609);
    eoss();
    setState(611);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(610);
      expression(0);
    }
    setState(613);
    eoss();
    setState(615);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(614);
      antlrcpp::downCast<ForClauseContext *>(_localctx)->postStmt = simpleStmt();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- RangeClauseContext ------------------------------------------------------------------

GoParser::RangeClauseContext::RangeClauseContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::RangeClauseContext::RANGE() {
  return getToken(GoParser::RANGE, 0);
}

GoParser::ExpressionContext* GoParser::RangeClauseContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::ExpressionListContext* GoParser::RangeClauseContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}

tree::TerminalNode* GoParser::RangeClauseContext::ASSIGN() {
  return getToken(GoParser::ASSIGN, 0);
}

GoParser::IdentifierListContext* GoParser::RangeClauseContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

tree::TerminalNode* GoParser::RangeClauseContext::DECLARE_ASSIGN() {
  return getToken(GoParser::DECLARE_ASSIGN, 0);
}


size_t GoParser::RangeClauseContext::getRuleIndex() const {
  return GoParser::RuleRangeClause;
}

void GoParser::RangeClauseContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterRangeClause(this);
}

void GoParser::RangeClauseContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitRangeClause(this);
}

GoParser::RangeClauseContext* GoParser::rangeClause() {
  RangeClauseContext *_localctx = _tracker.createInstance<RangeClauseContext>(_ctx, getState());
  enterRule(_localctx, 102, GoParser::RuleRangeClause);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(623);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 64, _ctx)) {
    case 1: {
      setState(617);
      expressionList();
      setState(618);
      match(GoParser::ASSIGN);
      break;
    }

    case 2: {
      setState(620);
      identifierList();
      setState(621);
      match(GoParser::DECLARE_ASSIGN);
      break;
    }

    default:
      break;
    }
    setState(625);
    match(GoParser::RANGE);
    setState(626);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- GoStmtContext ------------------------------------------------------------------

GoParser::GoStmtContext::GoStmtContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::GoStmtContext::GO() {
  return getToken(GoParser::GO, 0);
}

GoParser::ExpressionContext* GoParser::GoStmtContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}


size_t GoParser::GoStmtContext::getRuleIndex() const {
  return GoParser::RuleGoStmt;
}

void GoParser::GoStmtContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterGoStmt(this);
}

void GoParser::GoStmtContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitGoStmt(this);
}

GoParser::GoStmtContext* GoParser::goStmt() {
  GoStmtContext *_localctx = _tracker.createInstance<GoStmtContext>(_ctx, getState());
  enterRule(_localctx, 104, GoParser::RuleGoStmt);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(628);
    match(GoParser::GO);
    setState(629);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- Type_Context ------------------------------------------------------------------

GoParser::Type_Context::Type_Context(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::TypeNameContext* GoParser::Type_Context::typeName() {
  return getRuleContext<GoParser::TypeNameContext>(0);
}

GoParser::TypeLitContext* GoParser::Type_Context::typeLit() {
  return getRuleContext<GoParser::TypeLitContext>(0);
}

tree::TerminalNode* GoParser::Type_Context::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

GoParser::Type_Context* GoParser::Type_Context::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

tree::TerminalNode* GoParser::Type_Context::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}


size_t GoParser::Type_Context::getRuleIndex() const {
  return GoParser::RuleType_;
}

void GoParser::Type_Context::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterType_(this);
}

void GoParser::Type_Context::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitType_(this);
}

GoParser::Type_Context* GoParser::type_() {
  Type_Context *_localctx = _tracker.createInstance<Type_Context>(_ctx, getState());
  enterRule(_localctx, 106, GoParser::RuleType_);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(637);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::IDENTIFIER: {
        enterOuterAlt(_localctx, 1);
        setState(631);
        typeName();
        break;
      }

      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::L_BRACKET:
      case GoParser::STAR:
      case GoParser::RECEIVE: {
        enterOuterAlt(_localctx, 2);
        setState(632);
        typeLit();
        break;
      }

      case GoParser::L_PAREN: {
        enterOuterAlt(_localctx, 3);
        setState(633);
        match(GoParser::L_PAREN);
        setState(634);
        type_();
        setState(635);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeNameContext ------------------------------------------------------------------

GoParser::TypeNameContext::TypeNameContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::QualifiedIdentContext* GoParser::TypeNameContext::qualifiedIdent() {
  return getRuleContext<GoParser::QualifiedIdentContext>(0);
}

tree::TerminalNode* GoParser::TypeNameContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::TypeNameContext::getRuleIndex() const {
  return GoParser::RuleTypeName;
}

void GoParser::TypeNameContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeName(this);
}

void GoParser::TypeNameContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeName(this);
}

GoParser::TypeNameContext* GoParser::typeName() {
  TypeNameContext *_localctx = _tracker.createInstance<TypeNameContext>(_ctx, getState());
  enterRule(_localctx, 108, GoParser::RuleTypeName);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(641);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 66, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(639);
      qualifiedIdent();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(640);
      match(GoParser::IDENTIFIER);
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeLitContext ------------------------------------------------------------------

GoParser::TypeLitContext::TypeLitContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ArrayTypeContext* GoParser::TypeLitContext::arrayType() {
  return getRuleContext<GoParser::ArrayTypeContext>(0);
}

GoParser::StructTypeContext* GoParser::TypeLitContext::structType() {
  return getRuleContext<GoParser::StructTypeContext>(0);
}

GoParser::PointerTypeContext* GoParser::TypeLitContext::pointerType() {
  return getRuleContext<GoParser::PointerTypeContext>(0);
}

GoParser::FunctionTypeContext* GoParser::TypeLitContext::functionType() {
  return getRuleContext<GoParser::FunctionTypeContext>(0);
}

GoParser::InterfaceTypeContext* GoParser::TypeLitContext::interfaceType() {
  return getRuleContext<GoParser::InterfaceTypeContext>(0);
}

GoParser::SliceTypeContext* GoParser::TypeLitContext::sliceType() {
  return getRuleContext<GoParser::SliceTypeContext>(0);
}

GoParser::MapTypeContext* GoParser::TypeLitContext::mapType() {
  return getRuleContext<GoParser::MapTypeContext>(0);
}

GoParser::ChannelTypeContext* GoParser::TypeLitContext::channelType() {
  return getRuleContext<GoParser::ChannelTypeContext>(0);
}


size_t GoParser::TypeLitContext::getRuleIndex() const {
  return GoParser::RuleTypeLit;
}

void GoParser::TypeLitContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeLit(this);
}

void GoParser::TypeLitContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeLit(this);
}

GoParser::TypeLitContext* GoParser::typeLit() {
  TypeLitContext *_localctx = _tracker.createInstance<TypeLitContext>(_ctx, getState());
  enterRule(_localctx, 110, GoParser::RuleTypeLit);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(651);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 67, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(643);
      arrayType();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(644);
      structType();
      break;
    }

    case 3: {
      enterOuterAlt(_localctx, 3);
      setState(645);
      pointerType();
      break;
    }

    case 4: {
      enterOuterAlt(_localctx, 4);
      setState(646);
      functionType();
      break;
    }

    case 5: {
      enterOuterAlt(_localctx, 5);
      setState(647);
      interfaceType();
      break;
    }

    case 6: {
      enterOuterAlt(_localctx, 6);
      setState(648);
      sliceType();
      break;
    }

    case 7: {
      enterOuterAlt(_localctx, 7);
      setState(649);
      mapType();
      break;
    }

    case 8: {
      enterOuterAlt(_localctx, 8);
      setState(650);
      channelType();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ArrayTypeContext ------------------------------------------------------------------

GoParser::ArrayTypeContext::ArrayTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ArrayTypeContext::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

GoParser::ArrayLengthContext* GoParser::ArrayTypeContext::arrayLength() {
  return getRuleContext<GoParser::ArrayLengthContext>(0);
}

tree::TerminalNode* GoParser::ArrayTypeContext::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}

GoParser::ElementTypeContext* GoParser::ArrayTypeContext::elementType() {
  return getRuleContext<GoParser::ElementTypeContext>(0);
}


size_t GoParser::ArrayTypeContext::getRuleIndex() const {
  return GoParser::RuleArrayType;
}

void GoParser::ArrayTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterArrayType(this);
}

void GoParser::ArrayTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitArrayType(this);
}

GoParser::ArrayTypeContext* GoParser::arrayType() {
  ArrayTypeContext *_localctx = _tracker.createInstance<ArrayTypeContext>(_ctx, getState());
  enterRule(_localctx, 112, GoParser::RuleArrayType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(653);
    match(GoParser::L_BRACKET);
    setState(654);
    arrayLength();
    setState(655);
    match(GoParser::R_BRACKET);
    setState(656);
    elementType();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ArrayLengthContext ------------------------------------------------------------------

GoParser::ArrayLengthContext::ArrayLengthContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::ArrayLengthContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}


size_t GoParser::ArrayLengthContext::getRuleIndex() const {
  return GoParser::RuleArrayLength;
}

void GoParser::ArrayLengthContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterArrayLength(this);
}

void GoParser::ArrayLengthContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitArrayLength(this);
}

GoParser::ArrayLengthContext* GoParser::arrayLength() {
  ArrayLengthContext *_localctx = _tracker.createInstance<ArrayLengthContext>(_ctx, getState());
  enterRule(_localctx, 114, GoParser::RuleArrayLength);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(658);
    expression(0);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ElementTypeContext ------------------------------------------------------------------

GoParser::ElementTypeContext::ElementTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::Type_Context* GoParser::ElementTypeContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}


size_t GoParser::ElementTypeContext::getRuleIndex() const {
  return GoParser::RuleElementType;
}

void GoParser::ElementTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterElementType(this);
}

void GoParser::ElementTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitElementType(this);
}

GoParser::ElementTypeContext* GoParser::elementType() {
  ElementTypeContext *_localctx = _tracker.createInstance<ElementTypeContext>(_ctx, getState());
  enterRule(_localctx, 116, GoParser::RuleElementType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(660);
    type_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- PointerTypeContext ------------------------------------------------------------------

GoParser::PointerTypeContext::PointerTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::PointerTypeContext::STAR() {
  return getToken(GoParser::STAR, 0);
}

GoParser::Type_Context* GoParser::PointerTypeContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}


size_t GoParser::PointerTypeContext::getRuleIndex() const {
  return GoParser::RulePointerType;
}

void GoParser::PointerTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterPointerType(this);
}

void GoParser::PointerTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitPointerType(this);
}

GoParser::PointerTypeContext* GoParser::pointerType() {
  PointerTypeContext *_localctx = _tracker.createInstance<PointerTypeContext>(_ctx, getState());
  enterRule(_localctx, 118, GoParser::RulePointerType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(662);
    match(GoParser::STAR);
    setState(663);
    type_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- InterfaceTypeContext ------------------------------------------------------------------

GoParser::InterfaceTypeContext::InterfaceTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::InterfaceTypeContext::INTERFACE() {
  return getToken(GoParser::INTERFACE, 0);
}

tree::TerminalNode* GoParser::InterfaceTypeContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::InterfaceTypeContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

std::vector<GoParser::EossContext *> GoParser::InterfaceTypeContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::InterfaceTypeContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}

std::vector<GoParser::MethodSpecContext *> GoParser::InterfaceTypeContext::methodSpec() {
  return getRuleContexts<GoParser::MethodSpecContext>();
}

GoParser::MethodSpecContext* GoParser::InterfaceTypeContext::methodSpec(size_t i) {
  return getRuleContext<GoParser::MethodSpecContext>(i);
}

std::vector<GoParser::TypeNameContext *> GoParser::InterfaceTypeContext::typeName() {
  return getRuleContexts<GoParser::TypeNameContext>();
}

GoParser::TypeNameContext* GoParser::InterfaceTypeContext::typeName(size_t i) {
  return getRuleContext<GoParser::TypeNameContext>(i);
}


size_t GoParser::InterfaceTypeContext::getRuleIndex() const {
  return GoParser::RuleInterfaceType;
}

void GoParser::InterfaceTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterInterfaceType(this);
}

void GoParser::InterfaceTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitInterfaceType(this);
}

GoParser::InterfaceTypeContext* GoParser::interfaceType() {
  InterfaceTypeContext *_localctx = _tracker.createInstance<InterfaceTypeContext>(_ctx, getState());
  enterRule(_localctx, 120, GoParser::RuleInterfaceType);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(665);
    match(GoParser::INTERFACE);
    setState(666);
    match(GoParser::L_CURLY);
    setState(675);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::IDENTIFIER) {
      setState(669);
      _errHandler->sync(this);
      switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 68, _ctx)) {
      case 1: {
        setState(667);
        methodSpec();
        break;
      }

      case 2: {
        setState(668);
        typeName();
        break;
      }

      default:
        break;
      }
      setState(671);
      eoss();
      setState(677);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(678);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SliceTypeContext ------------------------------------------------------------------

GoParser::SliceTypeContext::SliceTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::SliceTypeContext::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

tree::TerminalNode* GoParser::SliceTypeContext::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}

GoParser::ElementTypeContext* GoParser::SliceTypeContext::elementType() {
  return getRuleContext<GoParser::ElementTypeContext>(0);
}


size_t GoParser::SliceTypeContext::getRuleIndex() const {
  return GoParser::RuleSliceType;
}

void GoParser::SliceTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSliceType(this);
}

void GoParser::SliceTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSliceType(this);
}

GoParser::SliceTypeContext* GoParser::sliceType() {
  SliceTypeContext *_localctx = _tracker.createInstance<SliceTypeContext>(_ctx, getState());
  enterRule(_localctx, 122, GoParser::RuleSliceType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(680);
    match(GoParser::L_BRACKET);
    setState(681);
    match(GoParser::R_BRACKET);
    setState(682);
    elementType();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- MapTypeContext ------------------------------------------------------------------

GoParser::MapTypeContext::MapTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::MapTypeContext::MAP() {
  return getToken(GoParser::MAP, 0);
}

tree::TerminalNode* GoParser::MapTypeContext::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

GoParser::Type_Context* GoParser::MapTypeContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

tree::TerminalNode* GoParser::MapTypeContext::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}

GoParser::ElementTypeContext* GoParser::MapTypeContext::elementType() {
  return getRuleContext<GoParser::ElementTypeContext>(0);
}


size_t GoParser::MapTypeContext::getRuleIndex() const {
  return GoParser::RuleMapType;
}

void GoParser::MapTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterMapType(this);
}

void GoParser::MapTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitMapType(this);
}

GoParser::MapTypeContext* GoParser::mapType() {
  MapTypeContext *_localctx = _tracker.createInstance<MapTypeContext>(_ctx, getState());
  enterRule(_localctx, 124, GoParser::RuleMapType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(684);
    match(GoParser::MAP);
    setState(685);
    match(GoParser::L_BRACKET);
    setState(686);
    type_();
    setState(687);
    match(GoParser::R_BRACKET);
    setState(688);
    elementType();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ChannelTypeContext ------------------------------------------------------------------

GoParser::ChannelTypeContext::ChannelTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ElementTypeContext* GoParser::ChannelTypeContext::elementType() {
  return getRuleContext<GoParser::ElementTypeContext>(0);
}

tree::TerminalNode* GoParser::ChannelTypeContext::CHAN() {
  return getToken(GoParser::CHAN, 0);
}

tree::TerminalNode* GoParser::ChannelTypeContext::RECEIVE() {
  return getToken(GoParser::RECEIVE, 0);
}


size_t GoParser::ChannelTypeContext::getRuleIndex() const {
  return GoParser::RuleChannelType;
}

void GoParser::ChannelTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterChannelType(this);
}

void GoParser::ChannelTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitChannelType(this);
}

GoParser::ChannelTypeContext* GoParser::channelType() {
  ChannelTypeContext *_localctx = _tracker.createInstance<ChannelTypeContext>(_ctx, getState());
  enterRule(_localctx, 126, GoParser::RuleChannelType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(695);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 70, _ctx)) {
    case 1: {
      setState(690);
      match(GoParser::CHAN);
      break;
    }

    case 2: {
      setState(691);
      match(GoParser::CHAN);
      setState(692);
      match(GoParser::RECEIVE);
      break;
    }

    case 3: {
      setState(693);
      match(GoParser::RECEIVE);
      setState(694);
      match(GoParser::CHAN);
      break;
    }

    default:
      break;
    }
    setState(697);
    elementType();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- MethodSpecContext ------------------------------------------------------------------

GoParser::MethodSpecContext::MethodSpecContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::MethodSpecContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}

GoParser::ParametersContext* GoParser::MethodSpecContext::parameters() {
  return getRuleContext<GoParser::ParametersContext>(0);
}

GoParser::ResultContext* GoParser::MethodSpecContext::result() {
  return getRuleContext<GoParser::ResultContext>(0);
}


size_t GoParser::MethodSpecContext::getRuleIndex() const {
  return GoParser::RuleMethodSpec;
}

void GoParser::MethodSpecContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterMethodSpec(this);
}

void GoParser::MethodSpecContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitMethodSpec(this);
}

GoParser::MethodSpecContext* GoParser::methodSpec() {
  MethodSpecContext *_localctx = _tracker.createInstance<MethodSpecContext>(_ctx, getState());
  enterRule(_localctx, 128, GoParser::RuleMethodSpec);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(705);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 71, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(699);
      match(GoParser::IDENTIFIER);
      setState(700);
      parameters();
      setState(701);
      result();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(703);
      match(GoParser::IDENTIFIER);
      setState(704);
      parameters();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- FunctionTypeContext ------------------------------------------------------------------

GoParser::FunctionTypeContext::FunctionTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::FunctionTypeContext::FUNC() {
  return getToken(GoParser::FUNC, 0);
}

GoParser::SignatureContext* GoParser::FunctionTypeContext::signature() {
  return getRuleContext<GoParser::SignatureContext>(0);
}


size_t GoParser::FunctionTypeContext::getRuleIndex() const {
  return GoParser::RuleFunctionType;
}

void GoParser::FunctionTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterFunctionType(this);
}

void GoParser::FunctionTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitFunctionType(this);
}

GoParser::FunctionTypeContext* GoParser::functionType() {
  FunctionTypeContext *_localctx = _tracker.createInstance<FunctionTypeContext>(_ctx, getState());
  enterRule(_localctx, 130, GoParser::RuleFunctionType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(707);
    match(GoParser::FUNC);
    setState(708);
    signature();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- SignatureContext ------------------------------------------------------------------

GoParser::SignatureContext::SignatureContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ParametersContext* GoParser::SignatureContext::parameters() {
  return getRuleContext<GoParser::ParametersContext>(0);
}

GoParser::ResultContext* GoParser::SignatureContext::result() {
  return getRuleContext<GoParser::ResultContext>(0);
}


size_t GoParser::SignatureContext::getRuleIndex() const {
  return GoParser::RuleSignature;
}

void GoParser::SignatureContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSignature(this);
}

void GoParser::SignatureContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSignature(this);
}

GoParser::SignatureContext* GoParser::signature() {
  SignatureContext *_localctx = _tracker.createInstance<SignatureContext>(_ctx, getState());
  enterRule(_localctx, 132, GoParser::RuleSignature);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(714);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 72, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(710);
      parameters();
      setState(711);
      result();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(713);
      parameters();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ResultContext ------------------------------------------------------------------

GoParser::ResultContext::ResultContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ParametersContext* GoParser::ResultContext::parameters() {
  return getRuleContext<GoParser::ParametersContext>(0);
}

GoParser::Type_Context* GoParser::ResultContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}


size_t GoParser::ResultContext::getRuleIndex() const {
  return GoParser::RuleResult;
}

void GoParser::ResultContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterResult(this);
}

void GoParser::ResultContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitResult(this);
}

GoParser::ResultContext* GoParser::result() {
  ResultContext *_localctx = _tracker.createInstance<ResultContext>(_ctx, getState());
  enterRule(_localctx, 134, GoParser::RuleResult);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(718);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 73, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(716);
      parameters();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(717);
      type_();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ParametersContext ------------------------------------------------------------------

GoParser::ParametersContext::ParametersContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ParametersContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::ParametersContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

std::vector<GoParser::ParameterDeclContext *> GoParser::ParametersContext::parameterDecl() {
  return getRuleContexts<GoParser::ParameterDeclContext>();
}

GoParser::ParameterDeclContext* GoParser::ParametersContext::parameterDecl(size_t i) {
  return getRuleContext<GoParser::ParameterDeclContext>(i);
}

std::vector<tree::TerminalNode *> GoParser::ParametersContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::ParametersContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::ParametersContext::getRuleIndex() const {
  return GoParser::RuleParameters;
}

void GoParser::ParametersContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterParameters(this);
}

void GoParser::ParametersContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitParameters(this);
}

GoParser::ParametersContext* GoParser::parameters() {
  ParametersContext *_localctx = _tracker.createInstance<ParametersContext>(_ctx, getState());
  enterRule(_localctx, 136, GoParser::RuleParameters);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    size_t alt;
    enterOuterAlt(_localctx, 1);
    setState(720);
    match(GoParser::L_PAREN);
    setState(732);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (((((_la - 3) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 3)) & ((1ULL << (GoParser::FUNC - 3))
      | (1ULL << (GoParser::INTERFACE - 3))
      | (1ULL << (GoParser::MAP - 3))
      | (1ULL << (GoParser::STRUCT - 3))
      | (1ULL << (GoParser::CHAN - 3))
      | (1ULL << (GoParser::IDENTIFIER - 3))
      | (1ULL << (GoParser::L_PAREN - 3))
      | (1ULL << (GoParser::L_BRACKET - 3))
      | (1ULL << (GoParser::ELLIPSIS - 3))
      | (1ULL << (GoParser::STAR - 3))
      | (1ULL << (GoParser::RECEIVE - 3)))) != 0)) {
      setState(721);
      parameterDecl();
      setState(726);
      _errHandler->sync(this);
      alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 74, _ctx);
      while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) {
        if (alt == 1) {
          setState(722);
          match(GoParser::COMMA);
          setState(723);
          parameterDecl(); 
        }
        setState(728);
        _errHandler->sync(this);
        alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 74, _ctx);
      }
      setState(730);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if (_la == GoParser::COMMA) {
        setState(729);
        match(GoParser::COMMA);
      }
    }
    setState(734);
    match(GoParser::R_PAREN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ParameterDeclContext ------------------------------------------------------------------

GoParser::ParameterDeclContext::ParameterDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::Type_Context* GoParser::ParameterDeclContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

GoParser::IdentifierListContext* GoParser::ParameterDeclContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

tree::TerminalNode* GoParser::ParameterDeclContext::ELLIPSIS() {
  return getToken(GoParser::ELLIPSIS, 0);
}


size_t GoParser::ParameterDeclContext::getRuleIndex() const {
  return GoParser::RuleParameterDecl;
}

void GoParser::ParameterDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterParameterDecl(this);
}

void GoParser::ParameterDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitParameterDecl(this);
}

GoParser::ParameterDeclContext* GoParser::parameterDecl() {
  ParameterDeclContext *_localctx = _tracker.createInstance<ParameterDeclContext>(_ctx, getState());
  enterRule(_localctx, 138, GoParser::RuleParameterDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(737);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 77, _ctx)) {
    case 1: {
      setState(736);
      identifierList();
      break;
    }

    default:
      break;
    }
    setState(740);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::ELLIPSIS) {
      setState(739);
      match(GoParser::ELLIPSIS);
    }
    setState(742);
    type_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ExpressionContext ------------------------------------------------------------------

GoParser::ExpressionContext::ExpressionContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}


size_t GoParser::ExpressionContext::getRuleIndex() const {
  return GoParser::RuleExpression;
}

void GoParser::ExpressionContext::copyFrom(ExpressionContext *ctx) {
  ParserRuleContext::copyFrom(ctx);
}

//----------------- LogicalAndOperationContext ------------------------------------------------------------------

std::vector<GoParser::ExpressionContext *> GoParser::LogicalAndOperationContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::LogicalAndOperationContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

tree::TerminalNode* GoParser::LogicalAndOperationContext::LOGICAL_AND() {
  return getToken(GoParser::LOGICAL_AND, 0);
}

GoParser::LogicalAndOperationContext::LogicalAndOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::LogicalAndOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLogicalAndOperation(this);
}
void GoParser::LogicalAndOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLogicalAndOperation(this);
}
//----------------- UnaryOperationContext ------------------------------------------------------------------

GoParser::ExpressionContext* GoParser::UnaryOperationContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::PLUS() {
  return getToken(GoParser::PLUS, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::MINUS() {
  return getToken(GoParser::MINUS, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::EXCLAMATION() {
  return getToken(GoParser::EXCLAMATION, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::CARET() {
  return getToken(GoParser::CARET, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::STAR() {
  return getToken(GoParser::STAR, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::AMPERSAND() {
  return getToken(GoParser::AMPERSAND, 0);
}

tree::TerminalNode* GoParser::UnaryOperationContext::RECEIVE() {
  return getToken(GoParser::RECEIVE, 0);
}

GoParser::UnaryOperationContext::UnaryOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::UnaryOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterUnaryOperation(this);
}
void GoParser::UnaryOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitUnaryOperation(this);
}
//----------------- PrimaryExpressionContext ------------------------------------------------------------------

GoParser::PrimaryExprContext* GoParser::PrimaryExpressionContext::primaryExpr() {
  return getRuleContext<GoParser::PrimaryExprContext>(0);
}

GoParser::PrimaryExpressionContext::PrimaryExpressionContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::PrimaryExpressionContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterPrimaryExpression(this);
}
void GoParser::PrimaryExpressionContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitPrimaryExpression(this);
}
//----------------- PlusMinusOperationContext ------------------------------------------------------------------

std::vector<GoParser::ExpressionContext *> GoParser::PlusMinusOperationContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::PlusMinusOperationContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

tree::TerminalNode* GoParser::PlusMinusOperationContext::PLUS() {
  return getToken(GoParser::PLUS, 0);
}

tree::TerminalNode* GoParser::PlusMinusOperationContext::MINUS() {
  return getToken(GoParser::MINUS, 0);
}

tree::TerminalNode* GoParser::PlusMinusOperationContext::OR() {
  return getToken(GoParser::OR, 0);
}

tree::TerminalNode* GoParser::PlusMinusOperationContext::CARET() {
  return getToken(GoParser::CARET, 0);
}

GoParser::PlusMinusOperationContext::PlusMinusOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::PlusMinusOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterPlusMinusOperation(this);
}
void GoParser::PlusMinusOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitPlusMinusOperation(this);
}
//----------------- RelationOperationContext ------------------------------------------------------------------

std::vector<GoParser::ExpressionContext *> GoParser::RelationOperationContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::RelationOperationContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

tree::TerminalNode* GoParser::RelationOperationContext::EQUALS() {
  return getToken(GoParser::EQUALS, 0);
}

tree::TerminalNode* GoParser::RelationOperationContext::NOT_EQUALS() {
  return getToken(GoParser::NOT_EQUALS, 0);
}

tree::TerminalNode* GoParser::RelationOperationContext::LESS() {
  return getToken(GoParser::LESS, 0);
}

tree::TerminalNode* GoParser::RelationOperationContext::LESS_OR_EQUALS() {
  return getToken(GoParser::LESS_OR_EQUALS, 0);
}

tree::TerminalNode* GoParser::RelationOperationContext::GREATER() {
  return getToken(GoParser::GREATER, 0);
}

tree::TerminalNode* GoParser::RelationOperationContext::GREATER_OR_EQUALS() {
  return getToken(GoParser::GREATER_OR_EQUALS, 0);
}

GoParser::RelationOperationContext::RelationOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::RelationOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterRelationOperation(this);
}
void GoParser::RelationOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitRelationOperation(this);
}
//----------------- MulDivOperationContext ------------------------------------------------------------------

std::vector<GoParser::ExpressionContext *> GoParser::MulDivOperationContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::MulDivOperationContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

tree::TerminalNode* GoParser::MulDivOperationContext::STAR() {
  return getToken(GoParser::STAR, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::DIV() {
  return getToken(GoParser::DIV, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::MOD() {
  return getToken(GoParser::MOD, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::LSHIFT() {
  return getToken(GoParser::LSHIFT, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::RSHIFT() {
  return getToken(GoParser::RSHIFT, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::AMPERSAND() {
  return getToken(GoParser::AMPERSAND, 0);
}

tree::TerminalNode* GoParser::MulDivOperationContext::BIT_CLEAR() {
  return getToken(GoParser::BIT_CLEAR, 0);
}

GoParser::MulDivOperationContext::MulDivOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::MulDivOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterMulDivOperation(this);
}
void GoParser::MulDivOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitMulDivOperation(this);
}
//----------------- LogicalOrOperationContext ------------------------------------------------------------------

std::vector<GoParser::ExpressionContext *> GoParser::LogicalOrOperationContext::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::LogicalOrOperationContext::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}

tree::TerminalNode* GoParser::LogicalOrOperationContext::LOGICAL_OR() {
  return getToken(GoParser::LOGICAL_OR, 0);
}

GoParser::LogicalOrOperationContext::LogicalOrOperationContext(ExpressionContext *ctx) { copyFrom(ctx); }

void GoParser::LogicalOrOperationContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLogicalOrOperation(this);
}
void GoParser::LogicalOrOperationContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLogicalOrOperation(this);
}

GoParser::ExpressionContext* GoParser::expression() {
   return expression(0);
}

GoParser::ExpressionContext* GoParser::expression(int precedence) {
  ParserRuleContext *parentContext = _ctx;
  size_t parentState = getState();
  GoParser::ExpressionContext *_localctx = _tracker.createInstance<ExpressionContext>(_ctx, parentState);
  GoParser::ExpressionContext *previousContext = _localctx;
  (void)previousContext; // Silence compiler, in case the context is not used by generated code.
  size_t startState = 140;
  enterRecursionRule(_localctx, 140, GoParser::RuleExpression, precedence);

    size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    unrollRecursionContexts(parentContext);
  });
  try {
    size_t alt;
    enterOuterAlt(_localctx, 1);
    setState(748);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 79, _ctx)) {
    case 1: {
      _localctx = _tracker.createInstance<PrimaryExpressionContext>(_localctx);
      _ctx = _localctx;
      previousContext = _localctx;

      setState(745);
      primaryExpr(0);
      break;
    }

    case 2: {
      _localctx = _tracker.createInstance<UnaryOperationContext>(_localctx);
      _ctx = _localctx;
      previousContext = _localctx;
      setState(746);
      antlrcpp::downCast<UnaryOperationContext *>(_localctx)->unary_op = _input->LT(1);
      _la = _input->LA(1);
      if (!(((((_la - 60) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 60)) & ((1ULL << (GoParser::EXCLAMATION - 60))
        | (1ULL << (GoParser::PLUS - 60))
        | (1ULL << (GoParser::MINUS - 60))
        | (1ULL << (GoParser::CARET - 60))
        | (1ULL << (GoParser::STAR - 60))
        | (1ULL << (GoParser::AMPERSAND - 60))
        | (1ULL << (GoParser::RECEIVE - 60)))) != 0))) {
        antlrcpp::downCast<UnaryOperationContext *>(_localctx)->unary_op = _errHandler->recoverInline(this);
      }
      else {
        _errHandler->reportMatch(this);
        consume();
      }
      setState(747);
      expression(6);
      break;
    }

    default:
      break;
    }
    _ctx->stop = _input->LT(-1);
    setState(767);
    _errHandler->sync(this);
    alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 81, _ctx);
    while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) {
      if (alt == 1) {
        if (!_parseListeners.empty())
          triggerExitRuleEvent();
        previousContext = _localctx;
        setState(765);
        _errHandler->sync(this);
        switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 80, _ctx)) {
        case 1: {
          auto newContext = _tracker.createInstance<MulDivOperationContext>(_tracker.createInstance<ExpressionContext>(parentContext, parentState));
          _localctx = newContext;
          pushNewRecursionContext(newContext, startState, RuleExpression);
          setState(750);

          if (!(precpred(_ctx, 5))) throw FailedPredicateException(this, "precpred(_ctx, 5)");
          setState(751);
          antlrcpp::downCast<MulDivOperationContext *>(_localctx)->mul_op = _input->LT(1);
          _la = _input->LA(1);
          if (!(((((_la - 55) & ~ 0x3fULL) == 0) &&
            ((1ULL << (_la - 55)) & ((1ULL << (GoParser::DIV - 55))
            | (1ULL << (GoParser::MOD - 55))
            | (1ULL << (GoParser::LSHIFT - 55))
            | (1ULL << (GoParser::RSHIFT - 55))
            | (1ULL << (GoParser::BIT_CLEAR - 55))
            | (1ULL << (GoParser::STAR - 55))
            | (1ULL << (GoParser::AMPERSAND - 55)))) != 0))) {
            antlrcpp::downCast<MulDivOperationContext *>(_localctx)->mul_op = _errHandler->recoverInline(this);
          }
          else {
            _errHandler->reportMatch(this);
            consume();
          }
          setState(752);
          expression(6);
          break;
        }

        case 2: {
          auto newContext = _tracker.createInstance<PlusMinusOperationContext>(_tracker.createInstance<ExpressionContext>(parentContext, parentState));
          _localctx = newContext;
          pushNewRecursionContext(newContext, startState, RuleExpression);
          setState(753);

          if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)");
          setState(754);
          antlrcpp::downCast<PlusMinusOperationContext *>(_localctx)->add_op = _input->LT(1);
          _la = _input->LA(1);
          if (!((((_la & ~ 0x3fULL) == 0) &&
            ((1ULL << _la) & ((1ULL << GoParser::OR)
            | (1ULL << GoParser::PLUS)
            | (1ULL << GoParser::MINUS)
            | (1ULL << GoParser::CARET))) != 0))) {
            antlrcpp::downCast<PlusMinusOperationContext *>(_localctx)->add_op = _errHandler->recoverInline(this);
          }
          else {
            _errHandler->reportMatch(this);
            consume();
          }
          setState(755);
          expression(5);
          break;
        }

        case 3: {
          auto newContext = _tracker.createInstance<RelationOperationContext>(_tracker.createInstance<ExpressionContext>(parentContext, parentState));
          _localctx = newContext;
          pushNewRecursionContext(newContext, startState, RuleExpression);
          setState(756);

          if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)");
          setState(757);
          antlrcpp::downCast<RelationOperationContext *>(_localctx)->rel_op = _input->LT(1);
          _la = _input->LA(1);
          if (!((((_la & ~ 0x3fULL) == 0) &&
            ((1ULL << _la) & ((1ULL << GoParser::EQUALS)
            | (1ULL << GoParser::NOT_EQUALS)
            | (1ULL << GoParser::LESS)
            | (1ULL << GoParser::LESS_OR_EQUALS)
            | (1ULL << GoParser::GREATER)
            | (1ULL << GoParser::GREATER_OR_EQUALS))) != 0))) {
            antlrcpp::downCast<RelationOperationContext *>(_localctx)->rel_op = _errHandler->recoverInline(this);
          }
          else {
            _errHandler->reportMatch(this);
            consume();
          }
          setState(758);
          expression(4);
          break;
        }

        case 4: {
          auto newContext = _tracker.createInstance<LogicalAndOperationContext>(_tracker.createInstance<ExpressionContext>(parentContext, parentState));
          _localctx = newContext;
          pushNewRecursionContext(newContext, startState, RuleExpression);
          setState(759);

          if (!(precpred(_ctx, 2))) throw FailedPredicateException(this, "precpred(_ctx, 2)");
          setState(760);
          match(GoParser::LOGICAL_AND);
          setState(761);
          expression(3);
          break;
        }

        case 5: {
          auto newContext = _tracker.createInstance<LogicalOrOperationContext>(_tracker.createInstance<ExpressionContext>(parentContext, parentState));
          _localctx = newContext;
          pushNewRecursionContext(newContext, startState, RuleExpression);
          setState(762);

          if (!(precpred(_ctx, 1))) throw FailedPredicateException(this, "precpred(_ctx, 1)");
          setState(763);
          match(GoParser::LOGICAL_OR);
          setState(764);
          expression(2);
          break;
        }

        default:
          break;
        } 
      }
      setState(769);
      _errHandler->sync(this);
      alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 81, _ctx);
    }
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }
  return _localctx;
}

//----------------- PrimaryExprContext ------------------------------------------------------------------

GoParser::PrimaryExprContext::PrimaryExprContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::OperandContext* GoParser::PrimaryExprContext::operand() {
  return getRuleContext<GoParser::OperandContext>(0);
}

GoParser::ConversionContext* GoParser::PrimaryExprContext::conversion() {
  return getRuleContext<GoParser::ConversionContext>(0);
}

GoParser::MethodExprContext* GoParser::PrimaryExprContext::methodExpr() {
  return getRuleContext<GoParser::MethodExprContext>(0);
}

GoParser::PrimaryExprContext* GoParser::PrimaryExprContext::primaryExpr() {
  return getRuleContext<GoParser::PrimaryExprContext>(0);
}

GoParser::IndexContext* GoParser::PrimaryExprContext::index() {
  return getRuleContext<GoParser::IndexContext>(0);
}

GoParser::Slice_Context* GoParser::PrimaryExprContext::slice_() {
  return getRuleContext<GoParser::Slice_Context>(0);
}

GoParser::TypeAssertionContext* GoParser::PrimaryExprContext::typeAssertion() {
  return getRuleContext<GoParser::TypeAssertionContext>(0);
}

GoParser::ArgumentsContext* GoParser::PrimaryExprContext::arguments() {
  return getRuleContext<GoParser::ArgumentsContext>(0);
}

tree::TerminalNode* GoParser::PrimaryExprContext::DOT() {
  return getToken(GoParser::DOT, 0);
}

tree::TerminalNode* GoParser::PrimaryExprContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::PrimaryExprContext::getRuleIndex() const {
  return GoParser::RulePrimaryExpr;
}

void GoParser::PrimaryExprContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterPrimaryExpr(this);
}

void GoParser::PrimaryExprContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitPrimaryExpr(this);
}


GoParser::PrimaryExprContext* GoParser::primaryExpr() {
   return primaryExpr(0);
}

GoParser::PrimaryExprContext* GoParser::primaryExpr(int precedence) {
  ParserRuleContext *parentContext = _ctx;
  size_t parentState = getState();
  GoParser::PrimaryExprContext *_localctx = _tracker.createInstance<PrimaryExprContext>(_ctx, parentState);
  GoParser::PrimaryExprContext *previousContext = _localctx;
  (void)previousContext; // Silence compiler, in case the context is not used by generated code.
  size_t startState = 142;
  enterRecursionRule(_localctx, 142, GoParser::RulePrimaryExpr, precedence);

    

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    unrollRecursionContexts(parentContext);
  });
  try {
    size_t alt;
    enterOuterAlt(_localctx, 1);
    setState(774);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 82, _ctx)) {
    case 1: {
      setState(771);
      operand();
      break;
    }

    case 2: {
      setState(772);
      conversion();
      break;
    }

    case 3: {
      setState(773);
      methodExpr();
      break;
    }

    default:
      break;
    }
    _ctx->stop = _input->LT(-1);
    setState(787);
    _errHandler->sync(this);
    alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 84, _ctx);
    while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) {
      if (alt == 1) {
        if (!_parseListeners.empty())
          triggerExitRuleEvent();
        previousContext = _localctx;
        _localctx = _tracker.createInstance<PrimaryExprContext>(parentContext, parentState);
        pushNewRecursionContext(_localctx, startState, RulePrimaryExpr);
        setState(776);

        if (!(precpred(_ctx, 1))) throw FailedPredicateException(this, "precpred(_ctx, 1)");
        setState(783);
        _errHandler->sync(this);
        switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 83, _ctx)) {
        case 1: {
          setState(777);
          match(GoParser::DOT);
          setState(778);
          match(GoParser::IDENTIFIER);
          break;
        }

        case 2: {
          setState(779);
          index();
          break;
        }

        case 3: {
          setState(780);
          slice_();
          break;
        }

        case 4: {
          setState(781);
          typeAssertion();
          break;
        }

        case 5: {
          setState(782);
          arguments();
          break;
        }

        default:
          break;
        } 
      }
      setState(789);
      _errHandler->sync(this);
      alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 84, _ctx);
    }
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }
  return _localctx;
}

//----------------- ConversionContext ------------------------------------------------------------------

GoParser::ConversionContext::ConversionContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::NonNamedTypeContext* GoParser::ConversionContext::nonNamedType() {
  return getRuleContext<GoParser::NonNamedTypeContext>(0);
}

tree::TerminalNode* GoParser::ConversionContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

GoParser::ExpressionContext* GoParser::ConversionContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

tree::TerminalNode* GoParser::ConversionContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

tree::TerminalNode* GoParser::ConversionContext::COMMA() {
  return getToken(GoParser::COMMA, 0);
}


size_t GoParser::ConversionContext::getRuleIndex() const {
  return GoParser::RuleConversion;
}

void GoParser::ConversionContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterConversion(this);
}

void GoParser::ConversionContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitConversion(this);
}

GoParser::ConversionContext* GoParser::conversion() {
  ConversionContext *_localctx = _tracker.createInstance<ConversionContext>(_ctx, getState());
  enterRule(_localctx, 144, GoParser::RuleConversion);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(790);
    nonNamedType();
    setState(791);
    match(GoParser::L_PAREN);
    setState(792);
    expression(0);
    setState(794);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::COMMA) {
      setState(793);
      match(GoParser::COMMA);
    }
    setState(796);
    match(GoParser::R_PAREN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- NonNamedTypeContext ------------------------------------------------------------------

GoParser::NonNamedTypeContext::NonNamedTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::TypeLitContext* GoParser::NonNamedTypeContext::typeLit() {
  return getRuleContext<GoParser::TypeLitContext>(0);
}

tree::TerminalNode* GoParser::NonNamedTypeContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

GoParser::NonNamedTypeContext* GoParser::NonNamedTypeContext::nonNamedType() {
  return getRuleContext<GoParser::NonNamedTypeContext>(0);
}

tree::TerminalNode* GoParser::NonNamedTypeContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}


size_t GoParser::NonNamedTypeContext::getRuleIndex() const {
  return GoParser::RuleNonNamedType;
}

void GoParser::NonNamedTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterNonNamedType(this);
}

void GoParser::NonNamedTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitNonNamedType(this);
}

GoParser::NonNamedTypeContext* GoParser::nonNamedType() {
  NonNamedTypeContext *_localctx = _tracker.createInstance<NonNamedTypeContext>(_ctx, getState());
  enterRule(_localctx, 146, GoParser::RuleNonNamedType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(803);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::L_BRACKET:
      case GoParser::STAR:
      case GoParser::RECEIVE: {
        enterOuterAlt(_localctx, 1);
        setState(798);
        typeLit();
        break;
      }

      case GoParser::L_PAREN: {
        enterOuterAlt(_localctx, 2);
        setState(799);
        match(GoParser::L_PAREN);
        setState(800);
        nonNamedType();
        setState(801);
        match(GoParser::R_PAREN);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- OperandContext ------------------------------------------------------------------

GoParser::OperandContext::OperandContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::LiteralContext* GoParser::OperandContext::literal() {
  return getRuleContext<GoParser::LiteralContext>(0);
}

GoParser::OperandNameContext* GoParser::OperandContext::operandName() {
  return getRuleContext<GoParser::OperandNameContext>(0);
}

tree::TerminalNode* GoParser::OperandContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

GoParser::ExpressionContext* GoParser::OperandContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

tree::TerminalNode* GoParser::OperandContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}


size_t GoParser::OperandContext::getRuleIndex() const {
  return GoParser::RuleOperand;
}

void GoParser::OperandContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterOperand(this);
}

void GoParser::OperandContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitOperand(this);
}

GoParser::OperandContext* GoParser::operand() {
  OperandContext *_localctx = _tracker.createInstance<OperandContext>(_ctx, getState());
  enterRule(_localctx, 148, GoParser::RuleOperand);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(811);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 87, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(805);
      literal();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(806);
      operandName();
      break;
    }

    case 3: {
      enterOuterAlt(_localctx, 3);
      setState(807);
      match(GoParser::L_PAREN);
      setState(808);
      expression(0);
      setState(809);
      match(GoParser::R_PAREN);
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- LiteralContext ------------------------------------------------------------------

GoParser::LiteralContext::LiteralContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::BasicLitContext* GoParser::LiteralContext::basicLit() {
  return getRuleContext<GoParser::BasicLitContext>(0);
}

GoParser::CompositeLitContext* GoParser::LiteralContext::compositeLit() {
  return getRuleContext<GoParser::CompositeLitContext>(0);
}

GoParser::FunctionLitContext* GoParser::LiteralContext::functionLit() {
  return getRuleContext<GoParser::FunctionLitContext>(0);
}


size_t GoParser::LiteralContext::getRuleIndex() const {
  return GoParser::RuleLiteral;
}

void GoParser::LiteralContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLiteral(this);
}

void GoParser::LiteralContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLiteral(this);
}

GoParser::LiteralContext* GoParser::literal() {
  LiteralContext *_localctx = _tracker.createInstance<LiteralContext>(_ctx, getState());
  enterRule(_localctx, 150, GoParser::RuleLiteral);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(816);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::NIL_LIT:
      case GoParser::DECIMAL_LIT:
      case GoParser::BINARY_LIT:
      case GoParser::OCTAL_LIT:
      case GoParser::HEX_LIT:
      case GoParser::FLOAT_LIT:
      case GoParser::IMAGINARY_LIT:
      case GoParser::RUNE_LIT:
      case GoParser::RAW_STRING_LIT:
      case GoParser::INTERPRETED_STRING_LIT: {
        enterOuterAlt(_localctx, 1);
        setState(813);
        basicLit();
        break;
      }

      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::IDENTIFIER:
      case GoParser::L_BRACKET: {
        enterOuterAlt(_localctx, 2);
        setState(814);
        compositeLit();
        break;
      }

      case GoParser::FUNC: {
        enterOuterAlt(_localctx, 3);
        setState(815);
        functionLit();
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- BasicLitContext ------------------------------------------------------------------

GoParser::BasicLitContext::BasicLitContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::BasicLitContext::NIL_LIT() {
  return getToken(GoParser::NIL_LIT, 0);
}

GoParser::IntegerContext* GoParser::BasicLitContext::integer() {
  return getRuleContext<GoParser::IntegerContext>(0);
}

GoParser::String_Context* GoParser::BasicLitContext::string_() {
  return getRuleContext<GoParser::String_Context>(0);
}

tree::TerminalNode* GoParser::BasicLitContext::FLOAT_LIT() {
  return getToken(GoParser::FLOAT_LIT, 0);
}


size_t GoParser::BasicLitContext::getRuleIndex() const {
  return GoParser::RuleBasicLit;
}

void GoParser::BasicLitContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterBasicLit(this);
}

void GoParser::BasicLitContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitBasicLit(this);
}

GoParser::BasicLitContext* GoParser::basicLit() {
  BasicLitContext *_localctx = _tracker.createInstance<BasicLitContext>(_ctx, getState());
  enterRule(_localctx, 152, GoParser::RuleBasicLit);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(822);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::NIL_LIT: {
        enterOuterAlt(_localctx, 1);
        setState(818);
        match(GoParser::NIL_LIT);
        break;
      }

      case GoParser::DECIMAL_LIT:
      case GoParser::BINARY_LIT:
      case GoParser::OCTAL_LIT:
      case GoParser::HEX_LIT:
      case GoParser::IMAGINARY_LIT:
      case GoParser::RUNE_LIT: {
        enterOuterAlt(_localctx, 2);
        setState(819);
        integer();
        break;
      }

      case GoParser::RAW_STRING_LIT:
      case GoParser::INTERPRETED_STRING_LIT: {
        enterOuterAlt(_localctx, 3);
        setState(820);
        string_();
        break;
      }

      case GoParser::FLOAT_LIT: {
        enterOuterAlt(_localctx, 4);
        setState(821);
        match(GoParser::FLOAT_LIT);
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- IntegerContext ------------------------------------------------------------------

GoParser::IntegerContext::IntegerContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::IntegerContext::DECIMAL_LIT() {
  return getToken(GoParser::DECIMAL_LIT, 0);
}

tree::TerminalNode* GoParser::IntegerContext::BINARY_LIT() {
  return getToken(GoParser::BINARY_LIT, 0);
}

tree::TerminalNode* GoParser::IntegerContext::OCTAL_LIT() {
  return getToken(GoParser::OCTAL_LIT, 0);
}

tree::TerminalNode* GoParser::IntegerContext::HEX_LIT() {
  return getToken(GoParser::HEX_LIT, 0);
}

tree::TerminalNode* GoParser::IntegerContext::IMAGINARY_LIT() {
  return getToken(GoParser::IMAGINARY_LIT, 0);
}

tree::TerminalNode* GoParser::IntegerContext::RUNE_LIT() {
  return getToken(GoParser::RUNE_LIT, 0);
}


size_t GoParser::IntegerContext::getRuleIndex() const {
  return GoParser::RuleInteger;
}

void GoParser::IntegerContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterInteger(this);
}

void GoParser::IntegerContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitInteger(this);
}

GoParser::IntegerContext* GoParser::integer() {
  IntegerContext *_localctx = _tracker.createInstance<IntegerContext>(_ctx, getState());
  enterRule(_localctx, 154, GoParser::RuleInteger);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(824);
    _la = _input->LA(1);
    if (!(((((_la - 67) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 67)) & ((1ULL << (GoParser::DECIMAL_LIT - 67))
      | (1ULL << (GoParser::BINARY_LIT - 67))
      | (1ULL << (GoParser::OCTAL_LIT - 67))
      | (1ULL << (GoParser::HEX_LIT - 67))
      | (1ULL << (GoParser::IMAGINARY_LIT - 67))
      | (1ULL << (GoParser::RUNE_LIT - 67)))) != 0))) {
    _errHandler->recoverInline(this);
    }
    else {
      _errHandler->reportMatch(this);
      consume();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- OperandNameContext ------------------------------------------------------------------

GoParser::OperandNameContext::OperandNameContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::OperandNameContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::OperandNameContext::getRuleIndex() const {
  return GoParser::RuleOperandName;
}

void GoParser::OperandNameContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterOperandName(this);
}

void GoParser::OperandNameContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitOperandName(this);
}

GoParser::OperandNameContext* GoParser::operandName() {
  OperandNameContext *_localctx = _tracker.createInstance<OperandNameContext>(_ctx, getState());
  enterRule(_localctx, 156, GoParser::RuleOperandName);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(826);
    match(GoParser::IDENTIFIER);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- QualifiedIdentContext ------------------------------------------------------------------

GoParser::QualifiedIdentContext::QualifiedIdentContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<tree::TerminalNode *> GoParser::QualifiedIdentContext::IDENTIFIER() {
  return getTokens(GoParser::IDENTIFIER);
}

tree::TerminalNode* GoParser::QualifiedIdentContext::IDENTIFIER(size_t i) {
  return getToken(GoParser::IDENTIFIER, i);
}

tree::TerminalNode* GoParser::QualifiedIdentContext::DOT() {
  return getToken(GoParser::DOT, 0);
}


size_t GoParser::QualifiedIdentContext::getRuleIndex() const {
  return GoParser::RuleQualifiedIdent;
}

void GoParser::QualifiedIdentContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterQualifiedIdent(this);
}

void GoParser::QualifiedIdentContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitQualifiedIdent(this);
}

GoParser::QualifiedIdentContext* GoParser::qualifiedIdent() {
  QualifiedIdentContext *_localctx = _tracker.createInstance<QualifiedIdentContext>(_ctx, getState());
  enterRule(_localctx, 158, GoParser::RuleQualifiedIdent);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(828);
    match(GoParser::IDENTIFIER);
    setState(829);
    match(GoParser::DOT);
    setState(830);
    match(GoParser::IDENTIFIER);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- CompositeLitContext ------------------------------------------------------------------

GoParser::CompositeLitContext::CompositeLitContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::LiteralTypeContext* GoParser::CompositeLitContext::literalType() {
  return getRuleContext<GoParser::LiteralTypeContext>(0);
}

GoParser::LiteralValueContext* GoParser::CompositeLitContext::literalValue() {
  return getRuleContext<GoParser::LiteralValueContext>(0);
}


size_t GoParser::CompositeLitContext::getRuleIndex() const {
  return GoParser::RuleCompositeLit;
}

void GoParser::CompositeLitContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterCompositeLit(this);
}

void GoParser::CompositeLitContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitCompositeLit(this);
}

GoParser::CompositeLitContext* GoParser::compositeLit() {
  CompositeLitContext *_localctx = _tracker.createInstance<CompositeLitContext>(_ctx, getState());
  enterRule(_localctx, 160, GoParser::RuleCompositeLit);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(832);
    literalType();
    setState(833);
    literalValue();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- LiteralTypeContext ------------------------------------------------------------------

GoParser::LiteralTypeContext::LiteralTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::StructTypeContext* GoParser::LiteralTypeContext::structType() {
  return getRuleContext<GoParser::StructTypeContext>(0);
}

GoParser::ArrayTypeContext* GoParser::LiteralTypeContext::arrayType() {
  return getRuleContext<GoParser::ArrayTypeContext>(0);
}

tree::TerminalNode* GoParser::LiteralTypeContext::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

tree::TerminalNode* GoParser::LiteralTypeContext::ELLIPSIS() {
  return getToken(GoParser::ELLIPSIS, 0);
}

tree::TerminalNode* GoParser::LiteralTypeContext::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}

GoParser::ElementTypeContext* GoParser::LiteralTypeContext::elementType() {
  return getRuleContext<GoParser::ElementTypeContext>(0);
}

GoParser::SliceTypeContext* GoParser::LiteralTypeContext::sliceType() {
  return getRuleContext<GoParser::SliceTypeContext>(0);
}

GoParser::MapTypeContext* GoParser::LiteralTypeContext::mapType() {
  return getRuleContext<GoParser::MapTypeContext>(0);
}

GoParser::TypeNameContext* GoParser::LiteralTypeContext::typeName() {
  return getRuleContext<GoParser::TypeNameContext>(0);
}


size_t GoParser::LiteralTypeContext::getRuleIndex() const {
  return GoParser::RuleLiteralType;
}

void GoParser::LiteralTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLiteralType(this);
}

void GoParser::LiteralTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLiteralType(this);
}

GoParser::LiteralTypeContext* GoParser::literalType() {
  LiteralTypeContext *_localctx = _tracker.createInstance<LiteralTypeContext>(_ctx, getState());
  enterRule(_localctx, 162, GoParser::RuleLiteralType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(844);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 90, _ctx)) {
    case 1: {
      enterOuterAlt(_localctx, 1);
      setState(835);
      structType();
      break;
    }

    case 2: {
      enterOuterAlt(_localctx, 2);
      setState(836);
      arrayType();
      break;
    }

    case 3: {
      enterOuterAlt(_localctx, 3);
      setState(837);
      match(GoParser::L_BRACKET);
      setState(838);
      match(GoParser::ELLIPSIS);
      setState(839);
      match(GoParser::R_BRACKET);
      setState(840);
      elementType();
      break;
    }

    case 4: {
      enterOuterAlt(_localctx, 4);
      setState(841);
      sliceType();
      break;
    }

    case 5: {
      enterOuterAlt(_localctx, 5);
      setState(842);
      mapType();
      break;
    }

    case 6: {
      enterOuterAlt(_localctx, 6);
      setState(843);
      typeName();
      break;
    }

    default:
      break;
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- LiteralValueContext ------------------------------------------------------------------

GoParser::LiteralValueContext::LiteralValueContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::LiteralValueContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::LiteralValueContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

GoParser::ElementListContext* GoParser::LiteralValueContext::elementList() {
  return getRuleContext<GoParser::ElementListContext>(0);
}

tree::TerminalNode* GoParser::LiteralValueContext::COMMA() {
  return getToken(GoParser::COMMA, 0);
}


size_t GoParser::LiteralValueContext::getRuleIndex() const {
  return GoParser::RuleLiteralValue;
}

void GoParser::LiteralValueContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterLiteralValue(this);
}

void GoParser::LiteralValueContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitLiteralValue(this);
}

GoParser::LiteralValueContext* GoParser::literalValue() {
  LiteralValueContext *_localctx = _tracker.createInstance<LiteralValueContext>(_ctx, getState());
  enterRule(_localctx, 164, GoParser::RuleLiteralValue);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(846);
    match(GoParser::L_CURLY);
    setState(851);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_CURLY)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(847);
      elementList();
      setState(849);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if (_la == GoParser::COMMA) {
        setState(848);
        match(GoParser::COMMA);
      }
    }
    setState(853);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ElementListContext ------------------------------------------------------------------

GoParser::ElementListContext::ElementListContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

std::vector<GoParser::KeyedElementContext *> GoParser::ElementListContext::keyedElement() {
  return getRuleContexts<GoParser::KeyedElementContext>();
}

GoParser::KeyedElementContext* GoParser::ElementListContext::keyedElement(size_t i) {
  return getRuleContext<GoParser::KeyedElementContext>(i);
}

std::vector<tree::TerminalNode *> GoParser::ElementListContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::ElementListContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::ElementListContext::getRuleIndex() const {
  return GoParser::RuleElementList;
}

void GoParser::ElementListContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterElementList(this);
}

void GoParser::ElementListContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitElementList(this);
}

GoParser::ElementListContext* GoParser::elementList() {
  ElementListContext *_localctx = _tracker.createInstance<ElementListContext>(_ctx, getState());
  enterRule(_localctx, 166, GoParser::RuleElementList);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    size_t alt;
    enterOuterAlt(_localctx, 1);
    setState(855);
    keyedElement();
    setState(860);
    _errHandler->sync(this);
    alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 93, _ctx);
    while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) {
      if (alt == 1) {
        setState(856);
        match(GoParser::COMMA);
        setState(857);
        keyedElement(); 
      }
      setState(862);
      _errHandler->sync(this);
      alt = getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 93, _ctx);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- KeyedElementContext ------------------------------------------------------------------

GoParser::KeyedElementContext::KeyedElementContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ElementContext* GoParser::KeyedElementContext::element() {
  return getRuleContext<GoParser::ElementContext>(0);
}

GoParser::KeyContext* GoParser::KeyedElementContext::key() {
  return getRuleContext<GoParser::KeyContext>(0);
}

tree::TerminalNode* GoParser::KeyedElementContext::COLON() {
  return getToken(GoParser::COLON, 0);
}


size_t GoParser::KeyedElementContext::getRuleIndex() const {
  return GoParser::RuleKeyedElement;
}

void GoParser::KeyedElementContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterKeyedElement(this);
}

void GoParser::KeyedElementContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitKeyedElement(this);
}

GoParser::KeyedElementContext* GoParser::keyedElement() {
  KeyedElementContext *_localctx = _tracker.createInstance<KeyedElementContext>(_ctx, getState());
  enterRule(_localctx, 168, GoParser::RuleKeyedElement);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(866);
    _errHandler->sync(this);

    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 94, _ctx)) {
    case 1: {
      setState(863);
      key();
      setState(864);
      match(GoParser::COLON);
      break;
    }

    default:
      break;
    }
    setState(868);
    element();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- KeyContext ------------------------------------------------------------------

GoParser::KeyContext::KeyContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::KeyContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::LiteralValueContext* GoParser::KeyContext::literalValue() {
  return getRuleContext<GoParser::LiteralValueContext>(0);
}


size_t GoParser::KeyContext::getRuleIndex() const {
  return GoParser::RuleKey;
}

void GoParser::KeyContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterKey(this);
}

void GoParser::KeyContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitKey(this);
}

GoParser::KeyContext* GoParser::key() {
  KeyContext *_localctx = _tracker.createInstance<KeyContext>(_ctx, getState());
  enterRule(_localctx, 170, GoParser::RuleKey);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(872);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::NIL_LIT:
      case GoParser::IDENTIFIER:
      case GoParser::L_PAREN:
      case GoParser::L_BRACKET:
      case GoParser::EXCLAMATION:
      case GoParser::PLUS:
      case GoParser::MINUS:
      case GoParser::CARET:
      case GoParser::STAR:
      case GoParser::AMPERSAND:
      case GoParser::RECEIVE:
      case GoParser::DECIMAL_LIT:
      case GoParser::BINARY_LIT:
      case GoParser::OCTAL_LIT:
      case GoParser::HEX_LIT:
      case GoParser::FLOAT_LIT:
      case GoParser::IMAGINARY_LIT:
      case GoParser::RUNE_LIT:
      case GoParser::RAW_STRING_LIT:
      case GoParser::INTERPRETED_STRING_LIT: {
        enterOuterAlt(_localctx, 1);
        setState(870);
        expression(0);
        break;
      }

      case GoParser::L_CURLY: {
        enterOuterAlt(_localctx, 2);
        setState(871);
        literalValue();
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ElementContext ------------------------------------------------------------------

GoParser::ElementContext::ElementContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::ExpressionContext* GoParser::ElementContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

GoParser::LiteralValueContext* GoParser::ElementContext::literalValue() {
  return getRuleContext<GoParser::LiteralValueContext>(0);
}


size_t GoParser::ElementContext::getRuleIndex() const {
  return GoParser::RuleElement;
}

void GoParser::ElementContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterElement(this);
}

void GoParser::ElementContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitElement(this);
}

GoParser::ElementContext* GoParser::element() {
  ElementContext *_localctx = _tracker.createInstance<ElementContext>(_ctx, getState());
  enterRule(_localctx, 172, GoParser::RuleElement);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    setState(876);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case GoParser::FUNC:
      case GoParser::INTERFACE:
      case GoParser::MAP:
      case GoParser::STRUCT:
      case GoParser::CHAN:
      case GoParser::NIL_LIT:
      case GoParser::IDENTIFIER:
      case GoParser::L_PAREN:
      case GoParser::L_BRACKET:
      case GoParser::EXCLAMATION:
      case GoParser::PLUS:
      case GoParser::MINUS:
      case GoParser::CARET:
      case GoParser::STAR:
      case GoParser::AMPERSAND:
      case GoParser::RECEIVE:
      case GoParser::DECIMAL_LIT:
      case GoParser::BINARY_LIT:
      case GoParser::OCTAL_LIT:
      case GoParser::HEX_LIT:
      case GoParser::FLOAT_LIT:
      case GoParser::IMAGINARY_LIT:
      case GoParser::RUNE_LIT:
      case GoParser::RAW_STRING_LIT:
      case GoParser::INTERPRETED_STRING_LIT: {
        enterOuterAlt(_localctx, 1);
        setState(874);
        expression(0);
        break;
      }

      case GoParser::L_CURLY: {
        enterOuterAlt(_localctx, 2);
        setState(875);
        literalValue();
        break;
      }

    default:
      throw NoViableAltException(this);
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- StructTypeContext ------------------------------------------------------------------

GoParser::StructTypeContext::StructTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::StructTypeContext::STRUCT() {
  return getToken(GoParser::STRUCT, 0);
}

tree::TerminalNode* GoParser::StructTypeContext::L_CURLY() {
  return getToken(GoParser::L_CURLY, 0);
}

tree::TerminalNode* GoParser::StructTypeContext::R_CURLY() {
  return getToken(GoParser::R_CURLY, 0);
}

std::vector<GoParser::FieldDeclContext *> GoParser::StructTypeContext::fieldDecl() {
  return getRuleContexts<GoParser::FieldDeclContext>();
}

GoParser::FieldDeclContext* GoParser::StructTypeContext::fieldDecl(size_t i) {
  return getRuleContext<GoParser::FieldDeclContext>(i);
}

std::vector<GoParser::EossContext *> GoParser::StructTypeContext::eoss() {
  return getRuleContexts<GoParser::EossContext>();
}

GoParser::EossContext* GoParser::StructTypeContext::eoss(size_t i) {
  return getRuleContext<GoParser::EossContext>(i);
}


size_t GoParser::StructTypeContext::getRuleIndex() const {
  return GoParser::RuleStructType;
}

void GoParser::StructTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterStructType(this);
}

void GoParser::StructTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitStructType(this);
}

GoParser::StructTypeContext* GoParser::structType() {
  StructTypeContext *_localctx = _tracker.createInstance<StructTypeContext>(_ctx, getState());
  enterRule(_localctx, 174, GoParser::RuleStructType);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(878);
    match(GoParser::STRUCT);
    setState(879);
    match(GoParser::L_CURLY);
    setState(885);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while (_la == GoParser::IDENTIFIER

    || _la == GoParser::STAR) {
      setState(880);
      fieldDecl();
      setState(881);
      eoss();
      setState(887);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }
    setState(888);
    match(GoParser::R_CURLY);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- FieldDeclContext ------------------------------------------------------------------

GoParser::FieldDeclContext::FieldDeclContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::IdentifierListContext* GoParser::FieldDeclContext::identifierList() {
  return getRuleContext<GoParser::IdentifierListContext>(0);
}

GoParser::Type_Context* GoParser::FieldDeclContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

GoParser::EmbeddedFieldContext* GoParser::FieldDeclContext::embeddedField() {
  return getRuleContext<GoParser::EmbeddedFieldContext>(0);
}

GoParser::String_Context* GoParser::FieldDeclContext::string_() {
  return getRuleContext<GoParser::String_Context>(0);
}


size_t GoParser::FieldDeclContext::getRuleIndex() const {
  return GoParser::RuleFieldDecl;
}

void GoParser::FieldDeclContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterFieldDecl(this);
}

void GoParser::FieldDeclContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitFieldDecl(this);
}

GoParser::FieldDeclContext* GoParser::fieldDecl() {
  FieldDeclContext *_localctx = _tracker.createInstance<FieldDeclContext>(_ctx, getState());
  enterRule(_localctx, 176, GoParser::RuleFieldDecl);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(894);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 98, _ctx)) {
    case 1: {
      setState(890);
      identifierList();
      setState(891);
      type_();
      break;
    }

    case 2: {
      setState(893);
      embeddedField();
      break;
    }

    default:
      break;
    }
    setState(897);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::RAW_STRING_LIT

    || _la == GoParser::INTERPRETED_STRING_LIT) {
      setState(896);
      antlrcpp::downCast<FieldDeclContext *>(_localctx)->tag = string_();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- String_Context ------------------------------------------------------------------

GoParser::String_Context::String_Context(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::String_Context::RAW_STRING_LIT() {
  return getToken(GoParser::RAW_STRING_LIT, 0);
}

tree::TerminalNode* GoParser::String_Context::INTERPRETED_STRING_LIT() {
  return getToken(GoParser::INTERPRETED_STRING_LIT, 0);
}


size_t GoParser::String_Context::getRuleIndex() const {
  return GoParser::RuleString_;
}

void GoParser::String_Context::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterString_(this);
}

void GoParser::String_Context::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitString_(this);
}

GoParser::String_Context* GoParser::string_() {
  String_Context *_localctx = _tracker.createInstance<String_Context>(_ctx, getState());
  enterRule(_localctx, 178, GoParser::RuleString_);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(899);
    _la = _input->LA(1);
    if (!(_la == GoParser::RAW_STRING_LIT

    || _la == GoParser::INTERPRETED_STRING_LIT)) {
    _errHandler->recoverInline(this);
    }
    else {
      _errHandler->reportMatch(this);
      consume();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EmbeddedFieldContext ------------------------------------------------------------------

GoParser::EmbeddedFieldContext::EmbeddedFieldContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::TypeNameContext* GoParser::EmbeddedFieldContext::typeName() {
  return getRuleContext<GoParser::TypeNameContext>(0);
}

tree::TerminalNode* GoParser::EmbeddedFieldContext::STAR() {
  return getToken(GoParser::STAR, 0);
}


size_t GoParser::EmbeddedFieldContext::getRuleIndex() const {
  return GoParser::RuleEmbeddedField;
}

void GoParser::EmbeddedFieldContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterEmbeddedField(this);
}

void GoParser::EmbeddedFieldContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitEmbeddedField(this);
}

GoParser::EmbeddedFieldContext* GoParser::embeddedField() {
  EmbeddedFieldContext *_localctx = _tracker.createInstance<EmbeddedFieldContext>(_ctx, getState());
  enterRule(_localctx, 180, GoParser::RuleEmbeddedField);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(902);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if (_la == GoParser::STAR) {
      setState(901);
      match(GoParser::STAR);
    }
    setState(904);
    typeName();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- FunctionLitContext ------------------------------------------------------------------

GoParser::FunctionLitContext::FunctionLitContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::FunctionLitContext::FUNC() {
  return getToken(GoParser::FUNC, 0);
}

GoParser::SignatureContext* GoParser::FunctionLitContext::signature() {
  return getRuleContext<GoParser::SignatureContext>(0);
}

GoParser::BlockContext* GoParser::FunctionLitContext::block() {
  return getRuleContext<GoParser::BlockContext>(0);
}


size_t GoParser::FunctionLitContext::getRuleIndex() const {
  return GoParser::RuleFunctionLit;
}

void GoParser::FunctionLitContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterFunctionLit(this);
}

void GoParser::FunctionLitContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitFunctionLit(this);
}

GoParser::FunctionLitContext* GoParser::functionLit() {
  FunctionLitContext *_localctx = _tracker.createInstance<FunctionLitContext>(_ctx, getState());
  enterRule(_localctx, 182, GoParser::RuleFunctionLit);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(906);
    match(GoParser::FUNC);
    setState(907);
    signature();
    setState(908);
    block();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- IndexContext ------------------------------------------------------------------

GoParser::IndexContext::IndexContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::IndexContext::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

GoParser::ExpressionContext* GoParser::IndexContext::expression() {
  return getRuleContext<GoParser::ExpressionContext>(0);
}

tree::TerminalNode* GoParser::IndexContext::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}


size_t GoParser::IndexContext::getRuleIndex() const {
  return GoParser::RuleIndex;
}

void GoParser::IndexContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterIndex(this);
}

void GoParser::IndexContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitIndex(this);
}

GoParser::IndexContext* GoParser::index() {
  IndexContext *_localctx = _tracker.createInstance<IndexContext>(_ctx, getState());
  enterRule(_localctx, 184, GoParser::RuleIndex);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(910);
    match(GoParser::L_BRACKET);
    setState(911);
    expression(0);
    setState(912);
    match(GoParser::R_BRACKET);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- Slice_Context ------------------------------------------------------------------

GoParser::Slice_Context::Slice_Context(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::Slice_Context::L_BRACKET() {
  return getToken(GoParser::L_BRACKET, 0);
}

tree::TerminalNode* GoParser::Slice_Context::R_BRACKET() {
  return getToken(GoParser::R_BRACKET, 0);
}

std::vector<tree::TerminalNode *> GoParser::Slice_Context::COLON() {
  return getTokens(GoParser::COLON);
}

tree::TerminalNode* GoParser::Slice_Context::COLON(size_t i) {
  return getToken(GoParser::COLON, i);
}

std::vector<GoParser::ExpressionContext *> GoParser::Slice_Context::expression() {
  return getRuleContexts<GoParser::ExpressionContext>();
}

GoParser::ExpressionContext* GoParser::Slice_Context::expression(size_t i) {
  return getRuleContext<GoParser::ExpressionContext>(i);
}


size_t GoParser::Slice_Context::getRuleIndex() const {
  return GoParser::RuleSlice_;
}

void GoParser::Slice_Context::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterSlice_(this);
}

void GoParser::Slice_Context::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitSlice_(this);
}

GoParser::Slice_Context* GoParser::slice_() {
  Slice_Context *_localctx = _tracker.createInstance<Slice_Context>(_ctx, getState());
  enterRule(_localctx, 186, GoParser::RuleSlice_);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(914);
    match(GoParser::L_BRACKET);
    setState(930);
    _errHandler->sync(this);
    switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 104, _ctx)) {
    case 1: {
      setState(916);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(915);
        expression(0);
      }
      setState(918);
      match(GoParser::COLON);
      setState(920);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(919);
        expression(0);
      }
      break;
    }

    case 2: {
      setState(923);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if ((((_la & ~ 0x3fULL) == 0) &&
        ((1ULL << _la) & ((1ULL << GoParser::FUNC)
        | (1ULL << GoParser::INTERFACE)
        | (1ULL << GoParser::MAP)
        | (1ULL << GoParser::STRUCT)
        | (1ULL << GoParser::CHAN)
        | (1ULL << GoParser::NIL_LIT)
        | (1ULL << GoParser::IDENTIFIER)
        | (1ULL << GoParser::L_PAREN)
        | (1ULL << GoParser::L_BRACKET)
        | (1ULL << GoParser::EXCLAMATION)
        | (1ULL << GoParser::PLUS)
        | (1ULL << GoParser::MINUS)
        | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
        ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
        | (1ULL << (GoParser::AMPERSAND - 64))
        | (1ULL << (GoParser::RECEIVE - 64))
        | (1ULL << (GoParser::DECIMAL_LIT - 64))
        | (1ULL << (GoParser::BINARY_LIT - 64))
        | (1ULL << (GoParser::OCTAL_LIT - 64))
        | (1ULL << (GoParser::HEX_LIT - 64))
        | (1ULL << (GoParser::FLOAT_LIT - 64))
        | (1ULL << (GoParser::IMAGINARY_LIT - 64))
        | (1ULL << (GoParser::RUNE_LIT - 64))
        | (1ULL << (GoParser::RAW_STRING_LIT - 64))
        | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
        setState(922);
        expression(0);
      }
      setState(925);
      match(GoParser::COLON);
      setState(926);
      expression(0);
      setState(927);
      match(GoParser::COLON);
      setState(928);
      expression(0);
      break;
    }

    default:
      break;
    }
    setState(932);
    match(GoParser::R_BRACKET);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- TypeAssertionContext ------------------------------------------------------------------

GoParser::TypeAssertionContext::TypeAssertionContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::TypeAssertionContext::DOT() {
  return getToken(GoParser::DOT, 0);
}

tree::TerminalNode* GoParser::TypeAssertionContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

GoParser::Type_Context* GoParser::TypeAssertionContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}

tree::TerminalNode* GoParser::TypeAssertionContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}


size_t GoParser::TypeAssertionContext::getRuleIndex() const {
  return GoParser::RuleTypeAssertion;
}

void GoParser::TypeAssertionContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterTypeAssertion(this);
}

void GoParser::TypeAssertionContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitTypeAssertion(this);
}

GoParser::TypeAssertionContext* GoParser::typeAssertion() {
  TypeAssertionContext *_localctx = _tracker.createInstance<TypeAssertionContext>(_ctx, getState());
  enterRule(_localctx, 188, GoParser::RuleTypeAssertion);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(934);
    match(GoParser::DOT);
    setState(935);
    match(GoParser::L_PAREN);
    setState(936);
    type_();
    setState(937);
    match(GoParser::R_PAREN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ArgumentsContext ------------------------------------------------------------------

GoParser::ArgumentsContext::ArgumentsContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::ArgumentsContext::L_PAREN() {
  return getToken(GoParser::L_PAREN, 0);
}

tree::TerminalNode* GoParser::ArgumentsContext::R_PAREN() {
  return getToken(GoParser::R_PAREN, 0);
}

GoParser::ExpressionListContext* GoParser::ArgumentsContext::expressionList() {
  return getRuleContext<GoParser::ExpressionListContext>(0);
}

GoParser::NonNamedTypeContext* GoParser::ArgumentsContext::nonNamedType() {
  return getRuleContext<GoParser::NonNamedTypeContext>(0);
}

tree::TerminalNode* GoParser::ArgumentsContext::ELLIPSIS() {
  return getToken(GoParser::ELLIPSIS, 0);
}

std::vector<tree::TerminalNode *> GoParser::ArgumentsContext::COMMA() {
  return getTokens(GoParser::COMMA);
}

tree::TerminalNode* GoParser::ArgumentsContext::COMMA(size_t i) {
  return getToken(GoParser::COMMA, i);
}


size_t GoParser::ArgumentsContext::getRuleIndex() const {
  return GoParser::RuleArguments;
}

void GoParser::ArgumentsContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterArguments(this);
}

void GoParser::ArgumentsContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitArguments(this);
}

GoParser::ArgumentsContext* GoParser::arguments() {
  ArgumentsContext *_localctx = _tracker.createInstance<ArgumentsContext>(_ctx, getState());
  enterRule(_localctx, 190, GoParser::RuleArguments);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(939);
    match(GoParser::L_PAREN);
    setState(954);
    _errHandler->sync(this);

    _la = _input->LA(1);
    if ((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::FUNC)
      | (1ULL << GoParser::INTERFACE)
      | (1ULL << GoParser::MAP)
      | (1ULL << GoParser::STRUCT)
      | (1ULL << GoParser::CHAN)
      | (1ULL << GoParser::NIL_LIT)
      | (1ULL << GoParser::IDENTIFIER)
      | (1ULL << GoParser::L_PAREN)
      | (1ULL << GoParser::L_BRACKET)
      | (1ULL << GoParser::EXCLAMATION)
      | (1ULL << GoParser::PLUS)
      | (1ULL << GoParser::MINUS)
      | (1ULL << GoParser::CARET))) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) &&
      ((1ULL << (_la - 64)) & ((1ULL << (GoParser::STAR - 64))
      | (1ULL << (GoParser::AMPERSAND - 64))
      | (1ULL << (GoParser::RECEIVE - 64))
      | (1ULL << (GoParser::DECIMAL_LIT - 64))
      | (1ULL << (GoParser::BINARY_LIT - 64))
      | (1ULL << (GoParser::OCTAL_LIT - 64))
      | (1ULL << (GoParser::HEX_LIT - 64))
      | (1ULL << (GoParser::FLOAT_LIT - 64))
      | (1ULL << (GoParser::IMAGINARY_LIT - 64))
      | (1ULL << (GoParser::RUNE_LIT - 64))
      | (1ULL << (GoParser::RAW_STRING_LIT - 64))
      | (1ULL << (GoParser::INTERPRETED_STRING_LIT - 64)))) != 0)) {
      setState(946);
      _errHandler->sync(this);
      switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 106, _ctx)) {
      case 1: {
        setState(940);
        expressionList();
        break;
      }

      case 2: {
        setState(941);
        nonNamedType();
        setState(944);
        _errHandler->sync(this);

        switch (getInterpreter<atn::ParserATNSimulator>()->adaptivePredict(_input, 105, _ctx)) {
        case 1: {
          setState(942);
          match(GoParser::COMMA);
          setState(943);
          expressionList();
          break;
        }

        default:
          break;
        }
        break;
      }

      default:
        break;
      }
      setState(949);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if (_la == GoParser::ELLIPSIS) {
        setState(948);
        match(GoParser::ELLIPSIS);
      }
      setState(952);
      _errHandler->sync(this);

      _la = _input->LA(1);
      if (_la == GoParser::COMMA) {
        setState(951);
        match(GoParser::COMMA);
      }
    }
    setState(956);
    match(GoParser::R_PAREN);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- MethodExprContext ------------------------------------------------------------------

GoParser::MethodExprContext::MethodExprContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::NonNamedTypeContext* GoParser::MethodExprContext::nonNamedType() {
  return getRuleContext<GoParser::NonNamedTypeContext>(0);
}

tree::TerminalNode* GoParser::MethodExprContext::DOT() {
  return getToken(GoParser::DOT, 0);
}

tree::TerminalNode* GoParser::MethodExprContext::IDENTIFIER() {
  return getToken(GoParser::IDENTIFIER, 0);
}


size_t GoParser::MethodExprContext::getRuleIndex() const {
  return GoParser::RuleMethodExpr;
}

void GoParser::MethodExprContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterMethodExpr(this);
}

void GoParser::MethodExprContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitMethodExpr(this);
}

GoParser::MethodExprContext* GoParser::methodExpr() {
  MethodExprContext *_localctx = _tracker.createInstance<MethodExprContext>(_ctx, getState());
  enterRule(_localctx, 192, GoParser::RuleMethodExpr);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(958);
    nonNamedType();
    setState(959);
    match(GoParser::DOT);
    setState(960);
    match(GoParser::IDENTIFIER);
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ReceiverTypeContext ------------------------------------------------------------------

GoParser::ReceiverTypeContext::ReceiverTypeContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

GoParser::Type_Context* GoParser::ReceiverTypeContext::type_() {
  return getRuleContext<GoParser::Type_Context>(0);
}


size_t GoParser::ReceiverTypeContext::getRuleIndex() const {
  return GoParser::RuleReceiverType;
}

void GoParser::ReceiverTypeContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterReceiverType(this);
}

void GoParser::ReceiverTypeContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitReceiverType(this);
}

GoParser::ReceiverTypeContext* GoParser::receiverType() {
  ReceiverTypeContext *_localctx = _tracker.createInstance<ReceiverTypeContext>(_ctx, getState());
  enterRule(_localctx, 194, GoParser::RuleReceiverType);

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(962);
    type_();
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EossContext ------------------------------------------------------------------

GoParser::EossContext::EossContext(ParserRuleContext *parent, size_t invokingState)
  : ParserRuleContext(parent, invokingState) {
}

tree::TerminalNode* GoParser::EossContext::SEMI() {
  return getToken(GoParser::SEMI, 0);
}

tree::TerminalNode* GoParser::EossContext::EOSSS() {
  return getToken(GoParser::EOSSS, 0);
}

tree::TerminalNode* GoParser::EossContext::HUANHANG() {
  return getToken(GoParser::HUANHANG, 0);
}

tree::TerminalNode* GoParser::EossContext::HUANHANGG() {
  return getToken(GoParser::HUANHANGG, 0);
}


size_t GoParser::EossContext::getRuleIndex() const {
  return GoParser::RuleEoss;
}

void GoParser::EossContext::enterRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->enterEoss(this);
}

void GoParser::EossContext::exitRule(tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<GoParserListener *>(listener);
  if (parserListener != nullptr)
    parserListener->exitEoss(this);
}

GoParser::EossContext* GoParser::eoss() {
  EossContext *_localctx = _tracker.createInstance<EossContext>(_ctx, getState());
  enterRule(_localctx, 196, GoParser::RuleEoss);
  size_t _la = 0;

#if __cplusplus > 201703L
  auto onExit = finally([=, this] {
#else
  auto onExit = finally([=] {
#endif
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(964);
    _la = _input->LA(1);
    if (!((((_la & ~ 0x3fULL) == 0) &&
      ((1ULL << _la) & ((1ULL << GoParser::SEMI)
      | (1ULL << GoParser::HUANHANG)
      | (1ULL << GoParser::HUANHANGG)
      | (1ULL << GoParser::EOSSS))) != 0))) {
    _errHandler->recoverInline(this);
    }
    else {
      _errHandler->reportMatch(this);
      consume();
    }
   
  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

bool GoParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) {
  switch (ruleIndex) {
    case 70: return expressionSempred(antlrcpp::downCast<ExpressionContext *>(context), predicateIndex);
    case 71: return primaryExprSempred(antlrcpp::downCast<PrimaryExprContext *>(context), predicateIndex);

  default:
    break;
  }
  return true;
}

bool GoParser::expressionSempred(ExpressionContext *_localctx, size_t predicateIndex) {
  switch (predicateIndex) {
    case 0: return precpred(_ctx, 5);
    case 1: return precpred(_ctx, 4);
    case 2: return precpred(_ctx, 3);
    case 3: return precpred(_ctx, 2);
    case 4: return precpred(_ctx, 1);

  default:
    break;
  }
  return true;
}

bool GoParser::primaryExprSempred(PrimaryExprContext *_localctx, size_t predicateIndex) {
  switch (predicateIndex) {
    case 5: return precpred(_ctx, 1);

  default:
    break;
  }
  return true;
}

// Static vars and initialization.
std::vector<dfa::DFA> GoParser::_decisionToDFA;
atn::PredictionContextCache GoParser::_sharedContextCache;

// We own the ATN which in turn owns the ATN states.
atn::ATN GoParser::_atn;
std::vector<uint16_t> GoParser::_serializedATN;

std::vector<std::string> GoParser::_ruleNames = {
  "sourceFile", "packageClause", "importDecl", "importSpec", "importPath", 
  "declaration", "constDecl", "constSpec", "identifierList", "expressionList", 
  "typeDecl", "typeSpec", "functionDecl", "methodDecl", "receiver", "varDecl", 
  "varSpec", "block", "statementList", "statement", "simpleStmt", "expressionStmt", 
  "sendStmt", "incDecStmt", "assignment", "assign_op", "shortVarDecl", "emptyStmt", 
  "labeledStmt", "returnStmt", "breakStmt", "continueStmt", "gotoStmt", 
  "fallthroughStmt", "deferStmt", "ifStmt", "switchStmt", "exprSwitchStmt", 
  "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", 
  "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", 
  "commCase", "recvStmt", "forStmt", "forClause", "rangeClause", "goStmt", 
  "type_", "typeName", "typeLit", "arrayType", "arrayLength", "elementType", 
  "pointerType", "interfaceType", "sliceType", "mapType", "channelType", 
  "methodSpec", "functionType", "signature", "result", "parameters", "parameterDecl", 
  "expression", "primaryExpr", "conversion", "nonNamedType", "operand", 
  "literal", "basicLit", "integer", "operandName", "qualifiedIdent", "compositeLit", 
  "literalType", "literalValue", "elementList", "keyedElement", "key", "element", 
  "structType", "fieldDecl", "string_", "embeddedField", "functionLit", 
  "index", "slice_", "typeAssertion", "arguments", "methodExpr", "receiverType", 
  "eoss"
};

std::vector<std::string> GoParser::_literalNames = {
  "", "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'", 
  "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", 
  "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", 
  "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", 
  "", "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "'\n'", 
  "'\r\n'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "", "'||'", "'&&'", 
  "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", 
  "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'"
};

std::vector<std::string> GoParser::_symbolicNames = {
  "", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", 
  "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", 
  "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", 
  "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", 
  "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "HUANHANG", "HUANHANGG", 
  "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", 
  "EOSSS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", 
  "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", 
  "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", 
  "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", 
  "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", 
  "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", 
  "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", 
  "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI"
};

dfa::Vocabulary GoParser::_vocabulary(_literalNames, _symbolicNames);

std::vector<std::string> GoParser::_tokenNames;

GoParser::Initializer::Initializer() {
	for (size_t i = 0; i < _symbolicNames.size(); ++i) {
		std::string name = _vocabulary.getLiteralName(i);
		if (name.empty()) {
			name = _vocabulary.getSymbolicName(i);
		}

		if (name.empty()) {
			_tokenNames.push_back("<INVALID>");
		} else {
      _tokenNames.push_back(name);
    }
	}

  static const uint16_t serializedATNSegment0[] = {
    0x3, 0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964, 
       0x3, 0x5b, 0x3c9, 0x4, 0x2, 0x9, 0x2, 0x4, 0x3, 0x9, 0x3, 0x4, 0x4, 
       0x9, 0x4, 0x4, 0x5, 0x9, 0x5, 0x4, 0x6, 0x9, 0x6, 0x4, 0x7, 0x9, 
       0x7, 0x4, 0x8, 0x9, 0x8, 0x4, 0x9, 0x9, 0x9, 0x4, 0xa, 0x9, 0xa, 
       0x4, 0xb, 0x9, 0xb, 0x4, 0xc, 0x9, 0xc, 0x4, 0xd, 0x9, 0xd, 0x4, 
       0xe, 0x9, 0xe, 0x4, 0xf, 0x9, 0xf, 0x4, 0x10, 0x9, 0x10, 0x4, 0x11, 
       0x9, 0x11, 0x4, 0x12, 0x9, 0x12, 0x4, 0x13, 0x9, 0x13, 0x4, 0x14, 
       0x9, 0x14, 0x4, 0x15, 0x9, 0x15, 0x4, 0x16, 0x9, 0x16, 0x4, 0x17, 
       0x9, 0x17, 0x4, 0x18, 0x9, 0x18, 0x4, 0x19, 0x9, 0x19, 0x4, 0x1a, 
       0x9, 0x1a, 0x4, 0x1b, 0x9, 0x1b, 0x4, 0x1c, 0x9, 0x1c, 0x4, 0x1d, 
       0x9, 0x1d, 0x4, 0x1e, 0x9, 0x1e, 0x4, 0x1f, 0x9, 0x1f, 0x4, 0x20, 
       0x9, 0x20, 0x4, 0x21, 0x9, 0x21, 0x4, 0x22, 0x9, 0x22, 0x4, 0x23, 
       0x9, 0x23, 0x4, 0x24, 0x9, 0x24, 0x4, 0x25, 0x9, 0x25, 0x4, 0x26, 
       0x9, 0x26, 0x4, 0x27, 0x9, 0x27, 0x4, 0x28, 0x9, 0x28, 0x4, 0x29, 
       0x9, 0x29, 0x4, 0x2a, 0x9, 0x2a, 0x4, 0x2b, 0x9, 0x2b, 0x4, 0x2c, 
       0x9, 0x2c, 0x4, 0x2d, 0x9, 0x2d, 0x4, 0x2e, 0x9, 0x2e, 0x4, 0x2f, 
       0x9, 0x2f, 0x4, 0x30, 0x9, 0x30, 0x4, 0x31, 0x9, 0x31, 0x4, 0x32, 
       0x9, 0x32, 0x4, 0x33, 0x9, 0x33, 0x4, 0x34, 0x9, 0x34, 0x4, 0x35, 
       0x9, 0x35, 0x4, 0x36, 0x9, 0x36, 0x4, 0x37, 0x9, 0x37, 0x4, 0x38, 
       0x9, 0x38, 0x4, 0x39, 0x9, 0x39, 0x4, 0x3a, 0x9, 0x3a, 0x4, 0x3b, 
       0x9, 0x3b, 0x4, 0x3c, 0x9, 0x3c, 0x4, 0x3d, 0x9, 0x3d, 0x4, 0x3e, 
       0x9, 0x3e, 0x4, 0x3f, 0x9, 0x3f, 0x4, 0x40, 0x9, 0x40, 0x4, 0x41, 
       0x9, 0x41, 0x4, 0x42, 0x9, 0x42, 0x4, 0x43, 0x9, 0x43, 0x4, 0x44, 
       0x9, 0x44, 0x4, 0x45, 0x9, 0x45, 0x4, 0x46, 0x9, 0x46, 0x4, 0x47, 
       0x9, 0x47, 0x4, 0x48, 0x9, 0x48, 0x4, 0x49, 0x9, 0x49, 0x4, 0x4a, 
       0x9, 0x4a, 0x4, 0x4b, 0x9, 0x4b, 0x4, 0x4c, 0x9, 0x4c, 0x4, 0x4d, 
       0x9, 0x4d, 0x4, 0x4e, 0x9, 0x4e, 0x4, 0x4f, 0x9, 0x4f, 0x4, 0x50, 
       0x9, 0x50, 0x4, 0x51, 0x9, 0x51, 0x4, 0x52, 0x9, 0x52, 0x4, 0x53, 
       0x9, 0x53, 0x4, 0x54, 0x9, 0x54, 0x4, 0x55, 0x9, 0x55, 0x4, 0x56, 
       0x9, 0x56, 0x4, 0x57, 0x9, 0x57, 0x4, 0x58, 0x9, 0x58, 0x4, 0x59, 
       0x9, 0x59, 0x4, 0x5a, 0x9, 0x5a, 0x4, 0x5b, 0x9, 0x5b, 0x4, 0x5c, 
       0x9, 0x5c, 0x4, 0x5d, 0x9, 0x5d, 0x4, 0x5e, 0x9, 0x5e, 0x4, 0x5f, 
       0x9, 0x5f, 0x4, 0x60, 0x9, 0x60, 0x4, 0x61, 0x9, 0x61, 0x4, 0x62, 
       0x9, 0x62, 0x4, 0x63, 0x9, 0x63, 0x4, 0x64, 0x9, 0x64, 0x3, 0x2, 
       0x3, 0x2, 0x7, 0x2, 0xcb, 0xa, 0x2, 0xc, 0x2, 0xe, 0x2, 0xce, 0xb, 
       0x2, 0x3, 0x2, 0x3, 0x2, 0x7, 0x2, 0xd2, 0xa, 0x2, 0xc, 0x2, 0xe, 
       0x2, 0xd5, 0xb, 0x2, 0x7, 0x2, 0xd7, 0xa, 0x2, 0xc, 0x2, 0xe, 0x2, 
       0xda, 0xb, 0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x2, 0x5, 0x2, 0xdf, 0xa, 
       0x2, 0x3, 0x2, 0x7, 0x2, 0xe2, 0xa, 0x2, 0xc, 0x2, 0xe, 0x2, 0xe5, 
       0xb, 0x2, 0x7, 0x2, 0xe7, 0xa, 0x2, 0xc, 0x2, 0xe, 0x2, 0xea, 0xb, 
       0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 
       0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x7, 0x4, 0xf7, 
       0xa, 0x4, 0xc, 0x4, 0xe, 0x4, 0xfa, 0xb, 0x4, 0x3, 0x4, 0x5, 0x4, 
       0xfd, 0xa, 0x4, 0x3, 0x5, 0x5, 0x5, 0x100, 0xa, 0x5, 0x3, 0x5, 0x3, 
       0x5, 0x3, 0x6, 0x3, 0x6, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x5, 0x7, 
       0x109, 0xa, 0x7, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 
       0x3, 0x8, 0x7, 0x8, 0x111, 0xa, 0x8, 0xc, 0x8, 0xe, 0x8, 0x114, 0xb, 
       0x8, 0x3, 0x8, 0x5, 0x8, 0x117, 0xa, 0x8, 0x3, 0x9, 0x3, 0x9, 0x5, 
       0x9, 0x11b, 0xa, 0x9, 0x3, 0x9, 0x3, 0x9, 0x5, 0x9, 0x11f, 0xa, 0x9, 
       0x3, 0xa, 0x3, 0xa, 0x3, 0xa, 0x7, 0xa, 0x124, 0xa, 0xa, 0xc, 0xa, 
       0xe, 0xa, 0x127, 0xb, 0xa, 0x3, 0xb, 0x3, 0xb, 0x3, 0xb, 0x7, 0xb, 
       0x12c, 0xa, 0xb, 0xc, 0xb, 0xe, 0xb, 0x12f, 0xb, 0xb, 0x3, 0xc, 0x3, 
       0xc, 0x3, 0xc, 0x3, 0xc, 0x3, 0xc, 0x3, 0xc, 0x7, 0xc, 0x137, 0xa, 
       0xc, 0xc, 0xc, 0xe, 0xc, 0x13a, 0xb, 0xc, 0x3, 0xc, 0x5, 0xc, 0x13d, 
       0xa, 0xc, 0x3, 0xd, 0x3, 0xd, 0x5, 0xd, 0x141, 0xa, 0xd, 0x3, 0xd, 
       0x3, 0xd, 0x3, 0xe, 0x3, 0xe, 0x3, 0xe, 0x3, 0xe, 0x5, 0xe, 0x149, 
       0xa, 0xe, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x5, 
       0xf, 0x150, 0xa, 0xf, 0x3, 0x10, 0x3, 0x10, 0x3, 0x11, 0x3, 0x11, 
       0x3, 0x11, 0x3, 0x11, 0x3, 0x11, 0x3, 0x11, 0x7, 0x11, 0x15a, 0xa, 
       0x11, 0xc, 0x11, 0xe, 0x11, 0x15d, 0xb, 0x11, 0x3, 0x11, 0x5, 0x11, 
       0x160, 0xa, 0x11, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x5, 
       0x12, 0x166, 0xa, 0x12, 0x3, 0x12, 0x3, 0x12, 0x5, 0x12, 0x16a, 0xa, 
       0x12, 0x3, 0x13, 0x3, 0x13, 0x7, 0x13, 0x16e, 0xa, 0x13, 0xc, 0x13, 
       0xe, 0x13, 0x171, 0xb, 0x13, 0x3, 0x13, 0x5, 0x13, 0x174, 0xa, 0x13, 
       0x3, 0x13, 0x3, 0x13, 0x3, 0x14, 0x3, 0x14, 0x6, 0x14, 0x17a, 0xa, 
       0x14, 0xd, 0x14, 0xe, 0x14, 0x17b, 0x6, 0x14, 0x17e, 0xa, 0x14, 0xd, 
       0x14, 0xe, 0x14, 0x17f, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 
       0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 
       0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x5, 0x15, 
       0x191, 0xa, 0x15, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 
       0x16, 0x5, 0x16, 0x198, 0xa, 0x16, 0x3, 0x17, 0x3, 0x17, 0x3, 0x18, 
       0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 
       0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1b, 0x5, 0x1b, 
       0x1a8, 0xa, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x3, 
       0x1c, 0x3, 0x1c, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1e, 0x3, 0x1e, 0x3, 
       0x1e, 0x5, 0x1e, 0x1b5, 0xa, 0x1e, 0x3, 0x1f, 0x3, 0x1f, 0x5, 0x1f, 
       0x1b9, 0xa, 0x1f, 0x3, 0x20, 0x3, 0x20, 0x5, 0x20, 0x1bd, 0xa, 0x20, 
       0x3, 0x21, 0x3, 0x21, 0x5, 0x21, 0x1c1, 0xa, 0x21, 0x3, 0x22, 0x3, 
       0x22, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3, 0x24, 0x3, 
       0x24, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 
       0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x5, 0x25, 0x1d4, 0xa, 0x25, 
       0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x5, 0x25, 0x1da, 0xa, 
       0x25, 0x5, 0x25, 0x1dc, 0xa, 0x25, 0x3, 0x26, 0x3, 0x26, 0x5, 0x26, 
       0x1e0, 0xa, 0x26, 0x3, 0x27, 0x3, 0x27, 0x5, 0x27, 0x1e4, 0xa, 0x27, 
       0x3, 0x27, 0x5, 0x27, 0x1e7, 0xa, 0x27, 0x3, 0x27, 0x3, 0x27, 0x5, 
       0x27, 0x1eb, 0xa, 0x27, 0x5, 0x27, 0x1ed, 0xa, 0x27, 0x3, 0x27, 0x3, 
       0x27, 0x7, 0x27, 0x1f1, 0xa, 0x27, 0xc, 0x27, 0xe, 0x27, 0x1f4, 0xb, 
       0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x5, 
       0x28, 0x1fb, 0xa, 0x28, 0x3, 0x29, 0x3, 0x29, 0x3, 0x29, 0x5, 0x29, 
       0x200, 0xa, 0x29, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 
       0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x5, 0x2a, 0x20b, 
       0xa, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x7, 0x2a, 0x20f, 0xa, 0x2a, 0xc, 
       0x2a, 0xe, 0x2a, 0x212, 0xb, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2b, 
       0x3, 0x2b, 0x5, 0x2b, 0x218, 0xa, 0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 
       0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2c, 0x3, 0x2c, 0x3, 
       0x2c, 0x5, 0x2c, 0x223, 0xa, 0x2c, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 
       0x5, 0x2d, 0x228, 0xa, 0x2d, 0x3, 0x2e, 0x3, 0x2e, 0x5, 0x2e, 0x22c, 
       0xa, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x5, 0x2e, 0x231, 0xa, 
       0x2e, 0x7, 0x2e, 0x233, 0xa, 0x2e, 0xc, 0x2e, 0xe, 0x2e, 0x236, 0xb, 
       0x2e, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x7, 0x2f, 0x23b, 0xa, 0x2f, 
       0xc, 0x2f, 0xe, 0x2f, 0x23e, 0xb, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x3, 
       0x30, 0x3, 0x30, 0x3, 0x30, 0x5, 0x30, 0x245, 0xa, 0x30, 0x3, 0x31, 
       0x3, 0x31, 0x3, 0x31, 0x5, 0x31, 0x24a, 0xa, 0x31, 0x3, 0x31, 0x5, 
       0x31, 0x24d, 0xa, 0x31, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 
       0x3, 0x32, 0x3, 0x32, 0x5, 0x32, 0x255, 0xa, 0x32, 0x3, 0x32, 0x3, 
       0x32, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x5, 0x33, 0x25d, 
       0xa, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x34, 0x5, 0x34, 0x262, 0xa, 
       0x34, 0x3, 0x34, 0x3, 0x34, 0x5, 0x34, 0x266, 0xa, 0x34, 0x3, 0x34, 
       0x3, 0x34, 0x5, 0x34, 0x26a, 0xa, 0x34, 0x3, 0x35, 0x3, 0x35, 0x3, 
       0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x5, 0x35, 0x272, 0xa, 0x35, 
       0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 
       0x3, 0x37, 0x3, 0x37, 0x3, 0x37, 0x3, 0x37, 0x3, 0x37, 0x3, 0x37, 
       0x5, 0x37, 0x280, 0xa, 0x37, 0x3, 0x38, 0x3, 0x38, 0x5, 0x38, 0x284, 
       0xa, 0x38, 0x3, 0x39, 0x3, 0x39, 0x3, 0x39, 0x3, 0x39, 0x3, 0x39, 
       0x3, 0x39, 0x3, 0x39, 0x3, 0x39, 0x5, 0x39, 0x28e, 0xa, 0x39, 0x3, 
       0x3a, 0x3, 0x3a, 0x3, 0x3a, 0x3, 0x3a, 0x3, 0x3a, 0x3, 0x3b, 0x3, 
       0x3b, 0x3, 0x3c, 0x3, 0x3c, 0x3, 0x3d, 0x3, 0x3d, 0x3, 0x3d, 0x3, 
       0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x5, 0x3e, 0x2a0, 0xa, 0x3e, 
       0x3, 0x3e, 0x3, 0x3e, 0x7, 0x3e, 0x2a4, 0xa, 0x3e, 0xc, 0x3e, 0xe, 
       0x3e, 0x2a7, 0xb, 0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x3, 0x3f, 0x3, 0x3f, 
       0x3, 0x3f, 0x3, 0x3f, 0x3, 0x40, 0x3, 0x40, 0x3, 0x40, 0x3, 0x40, 
       0x3, 0x40, 0x3, 0x40, 0x3, 0x41, 0x3, 0x41, 0x3, 0x41, 0x3, 0x41, 
       0x3, 0x41, 0x5, 0x41, 0x2ba, 0xa, 0x41, 0x3, 0x41, 0x3, 0x41, 0x3, 
       0x42, 0x3, 0x42, 0x3, 0x42, 0x3, 0x42, 0x3, 0x42, 0x3, 0x42, 0x5, 
       0x42, 0x2c4, 0xa, 0x42, 0x3, 0x43, 0x3, 0x43, 0x3, 0x43, 0x3, 0x44, 
       0x3, 0x44, 0x3, 0x44, 0x3, 0x44, 0x5, 0x44, 0x2cd, 0xa, 0x44, 0x3, 
       0x45, 0x3, 0x45, 0x5, 0x45, 0x2d1, 0xa, 0x45, 0x3, 0x46, 0x3, 0x46, 
       0x3, 0x46, 0x3, 0x46, 0x7, 0x46, 0x2d7, 0xa, 0x46, 0xc, 0x46, 0xe, 
       0x46, 0x2da, 0xb, 0x46, 0x3, 0x46, 0x5, 0x46, 0x2dd, 0xa, 0x46, 0x5, 
       0x46, 0x2df, 0xa, 0x46, 0x3, 0x46, 0x3, 0x46, 0x3, 0x47, 0x5, 0x47, 
       0x2e4, 0xa, 0x47, 0x3, 0x47, 0x5, 0x47, 0x2e7, 0xa, 0x47, 0x3, 0x47, 
       0x3, 0x47, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x5, 0x48, 
       0x2ef, 0xa, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 
       0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 
       0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x7, 0x48, 0x300, 
       0xa, 0x48, 0xc, 0x48, 0xe, 0x48, 0x303, 0xb, 0x48, 0x3, 0x49, 0x3, 
       0x49, 0x3, 0x49, 0x3, 0x49, 0x5, 0x49, 0x309, 0xa, 0x49, 0x3, 0x49, 
       0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 
       0x5, 0x49, 0x312, 0xa, 0x49, 0x7, 0x49, 0x314, 0xa, 0x49, 0xc, 0x49, 
       0xe, 0x49, 0x317, 0xb, 0x49, 0x3, 0x4a, 0x3, 0x4a, 0x3, 0x4a, 0x3, 
       0x4a, 0x5, 0x4a, 0x31d, 0xa, 0x4a, 0x3, 0x4a, 0x3, 0x4a, 0x3, 0x4b, 
       0x3, 0x4b, 0x3, 0x4b, 0x3, 0x4b, 0x3, 0x4b, 0x5, 0x4b, 0x326, 0xa, 
       0x4b, 0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4c, 0x3, 
       0x4c, 0x5, 0x4c, 0x32e, 0xa, 0x4c, 0x3, 0x4d, 0x3, 0x4d, 0x3, 0x4d, 
       0x5, 0x4d, 0x333, 0xa, 0x4d, 0x3, 0x4e, 0x3, 0x4e, 0x3, 0x4e, 0x3, 
       0x4e, 0x5, 0x4e, 0x339, 0xa, 0x4e, 0x3, 0x4f, 0x3, 0x4f, 0x3, 0x50, 
       0x3, 0x50, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x52, 
       0x3, 0x52, 0x3, 0x52, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 
       0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x5, 0x53, 
       0x34f, 0xa, 0x53, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54, 0x5, 0x54, 0x354, 
       0xa, 0x54, 0x5, 0x54, 0x356, 0xa, 0x54, 0x3, 0x54, 0x3, 0x54, 0x3, 
       0x55, 0x3, 0x55, 0x3, 0x55, 0x7, 0x55, 0x35d, 0xa, 0x55, 0xc, 0x55, 
       0xe, 0x55, 0x360, 0xb, 0x55, 0x3, 0x56, 0x3, 0x56, 0x3, 0x56, 0x5, 
       0x56, 0x365, 0xa, 0x56, 0x3, 0x56, 0x3, 0x56, 0x3, 0x57, 0x3, 0x57, 
       0x5, 0x57, 0x36b, 0xa, 0x57, 0x3, 0x58, 0x3, 0x58, 0x5, 0x58, 0x36f, 
       0xa, 0x58, 0x3, 0x59, 0x3, 0x59, 0x3, 0x59, 0x3, 0x59, 0x3, 0x59, 
       0x7, 0x59, 0x376, 0xa, 0x59, 0xc, 0x59, 0xe, 0x59, 0x379, 0xb, 0x59, 
       0x3, 0x59, 0x3, 0x59, 0x3, 0x5a, 0x3, 0x5a, 0x3, 0x5a, 0x3, 0x5a, 
       0x5, 0x5a, 0x381, 0xa, 0x5a, 0x3, 0x5a, 0x5, 0x5a, 0x384, 0xa, 0x5a, 
       0x3, 0x5b, 0x3, 0x5b, 0x3, 0x5c, 0x5, 0x5c, 0x389, 0xa, 0x5c, 0x3, 
       0x5c, 0x3, 0x5c, 0x3, 0x5d, 0x3, 0x5d, 0x3, 0x5d, 0x3, 0x5d, 0x3, 
       0x5e, 0x3, 0x5e, 0x3, 0x5e, 0x3, 0x5e, 0x3, 0x5f, 0x3, 0x5f, 0x5, 
       0x5f, 0x397, 0xa, 0x5f, 0x3, 0x5f, 0x3, 0x5f, 0x5, 0x5f, 0x39b, 0xa, 
       0x5f, 0x3, 0x5f, 0x5, 0x5f, 0x39e, 0xa, 0x5f, 0x3, 0x5f, 0x3, 0x5f, 
       0x3, 0x5f, 0x3, 0x5f, 0x3, 0x5f, 0x5, 0x5f, 0x3a5, 0xa, 0x5f, 0x3, 
       0x5f, 0x3, 0x5f, 0x3, 0x60, 0x3, 0x60, 0x3, 0x60, 0x3, 0x60, 0x3, 
       0x60, 0x3, 0x61, 0x3, 0x61, 0x3, 0x61, 0x3, 0x61, 0x3, 0x61, 0x5, 
       0x61, 0x3b3, 0xa, 0x61, 0x5, 0x61, 0x3b5, 0xa, 0x61, 0x3, 0x61, 0x5, 
       0x61, 0x3b8, 0xa, 0x61, 0x3, 0x61, 0x5, 0x61, 0x3bb, 0xa, 0x61, 0x5, 
       0x61, 0x3bd, 0xa, 0x61, 0x3, 0x61, 0x3, 0x61, 0x3, 0x62, 0x3, 0x62, 
       0x3, 0x62, 0x3, 0x62, 0x3, 0x63, 0x3, 0x63, 0x3, 0x64, 0x3, 0x64, 
       0x3, 0x64, 0x2, 0x4, 0x8e, 0x90, 0x65, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 
       0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 
       0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 
       0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 
       0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x62, 0x64, 
       0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 
       0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 
       0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 
       0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 
       0xbe, 0xc0, 0xc2, 0xc4, 0xc6, 0x2, 0xd, 0x4, 0x2, 0x1d, 0x1d, 0x2a, 
       0x2a, 0x3, 0x2, 0x2b, 0x2c, 0x4, 0x2, 0x38, 0x3d, 0x3f, 0x43, 0x4, 
       0x2, 0x26, 0x26, 0x2f, 0x2f, 0x3, 0x2, 0x3e, 0x44, 0x4, 0x2, 0x39, 
       0x3d, 0x42, 0x43, 0x4, 0x2, 0x38, 0x38, 0x3f, 0x41, 0x3, 0x2, 0x32, 
       0x37, 0x4, 0x2, 0x45, 0x48, 0x4c, 0x4d, 0x3, 0x2, 0x53, 0x54, 0x4, 
       0x2, 0x26, 0x28, 0x2f, 0x2f, 0x2, 0x402, 0x2, 0xc8, 0x3, 0x2, 0x2, 
       0x2, 0x4, 0xed, 0x3, 0x2, 0x2, 0x2, 0x6, 0xf0, 0x3, 0x2, 0x2, 0x2, 
       0x8, 0xff, 0x3, 0x2, 0x2, 0x2, 0xa, 0x103, 0x3, 0x2, 0x2, 0x2, 0xc, 
       0x108, 0x3, 0x2, 0x2, 0x2, 0xe, 0x10a, 0x3, 0x2, 0x2, 0x2, 0x10, 
       0x118, 0x3, 0x2, 0x2, 0x2, 0x12, 0x120, 0x3, 0x2, 0x2, 0x2, 0x14, 
       0x128, 0x3, 0x2, 0x2, 0x2, 0x16, 0x130, 0x3, 0x2, 0x2, 0x2, 0x18, 
       0x13e, 0x3, 0x2, 0x2, 0x2, 0x1a, 0x144, 0x3, 0x2, 0x2, 0x2, 0x1c, 
       0x14a, 0x3, 0x2, 0x2, 0x2, 0x1e, 0x151, 0x3, 0x2, 0x2, 0x2, 0x20, 
       0x153, 0x3, 0x2, 0x2, 0x2, 0x22, 0x161, 0x3, 0x2, 0x2, 0x2, 0x24, 
       0x16b, 0x3, 0x2, 0x2, 0x2, 0x26, 0x17d, 0x3, 0x2, 0x2, 0x2, 0x28, 
       0x190, 0x3, 0x2, 0x2, 0x2, 0x2a, 0x197, 0x3, 0x2, 0x2, 0x2, 0x2c, 
       0x199, 0x3, 0x2, 0x2, 0x2, 0x2e, 0x19b, 0x3, 0x2, 0x2, 0x2, 0x30, 
       0x19f, 0x3, 0x2, 0x2, 0x2, 0x32, 0x1a2, 0x3, 0x2, 0x2, 0x2, 0x34, 
       0x1a7, 0x3, 0x2, 0x2, 0x2, 0x36, 0x1ab, 0x3, 0x2, 0x2, 0x2, 0x38, 
       0x1af, 0x3, 0x2, 0x2, 0x2, 0x3a, 0x1b1, 0x3, 0x2, 0x2, 0x2, 0x3c, 
       0x1b6, 0x3, 0x2, 0x2, 0x2, 0x3e, 0x1ba, 0x3, 0x2, 0x2, 0x2, 0x40, 
       0x1be, 0x3, 0x2, 0x2, 0x2, 0x42, 0x1c2, 0x3, 0x2, 0x2, 0x2, 0x44, 
       0x1c5, 0x3, 0x2, 0x2, 0x2, 0x46, 0x1c7, 0x3, 0x2, 0x2, 0x2, 0x48, 
       0x1ca, 0x3, 0x2, 0x2, 0x2, 0x4a, 0x1df, 0x3, 0x2, 0x2, 0x2, 0x4c, 
       0x1e1, 0x3, 0x2, 0x2, 0x2, 0x4e, 0x1f7, 0x3, 0x2, 0x2, 0x2, 0x50, 
       0x1ff, 0x3, 0x2, 0x2, 0x2, 0x52, 0x201, 0x3, 0x2, 0x2, 0x2, 0x54, 
       0x217, 0x3, 0x2, 0x2, 0x2, 0x56, 0x21f, 0x3, 0x2, 0x2, 0x2, 0x58, 
       0x227, 0x3, 0x2, 0x2, 0x2, 0x5a, 0x22b, 0x3, 0x2, 0x2, 0x2, 0x5c, 
       0x237, 0x3, 0x2, 0x2, 0x2, 0x5e, 0x241, 0x3, 0x2, 0x2, 0x2, 0x60, 
       0x24c, 0x3, 0x2, 0x2, 0x2, 0x62, 0x254, 0x3, 0x2, 0x2, 0x2, 0x64, 
       0x258, 0x3, 0x2, 0x2, 0x2, 0x66, 0x261, 0x3, 0x2, 0x2, 0x2, 0x68, 
       0x271, 0x3, 0x2, 0x2, 0x2, 0x6a, 0x276, 0x3, 0x2, 0x2, 0x2, 0x6c, 
       0x27f, 0x3, 0x2, 0x2, 0x2, 0x6e, 0x283, 0x3, 0x2, 0x2, 0x2, 0x70, 
       0x28d, 0x3, 0x2, 0x2, 0x2, 0x72, 0x28f, 0x3, 0x2, 0x2, 0x2, 0x74, 
       0x294, 0x3, 0x2, 0x2, 0x2, 0x76, 0x296, 0x3, 0x2, 0x2, 0x2, 0x78, 
       0x298, 0x3, 0x2, 0x2, 0x2, 0x7a, 0x29b, 0x3, 0x2, 0x2, 0x2, 0x7c, 
       0x2aa, 0x3, 0x2, 0x2, 0x2, 0x7e, 0x2ae, 0x3, 0x2, 0x2, 0x2, 0x80, 
       0x2b9, 0x3, 0x2, 0x2, 0x2, 0x82, 0x2c3, 0x3, 0x2, 0x2, 0x2, 0x84, 
       0x2c5, 0x3, 0x2, 0x2, 0x2, 0x86, 0x2cc, 0x3, 0x2, 0x2, 0x2, 0x88, 
       0x2d0, 0x3, 0x2, 0x2, 0x2, 0x8a, 0x2d2, 0x3, 0x2, 0x2, 0x2, 0x8c, 
       0x2e3, 0x3, 0x2, 0x2, 0x2, 0x8e, 0x2ee, 0x3, 0x2, 0x2, 0x2, 0x90, 
       0x308, 0x3, 0x2, 0x2, 0x2, 0x92, 0x318, 0x3, 0x2, 0x2, 0x2, 0x94, 
       0x325, 0x3, 0x2, 0x2, 0x2, 0x96, 0x32d, 0x3, 0x2, 0x2, 0x2, 0x98, 
       0x332, 0x3, 0x2, 0x2, 0x2, 0x9a, 0x338, 0x3, 0x2, 0x2, 0x2, 0x9c, 
       0x33a, 0x3, 0x2, 0x2, 0x2, 0x9e, 0x33c, 0x3, 0x2, 0x2, 0x2, 0xa0, 
       0x33e, 0x3, 0x2, 0x2, 0x2, 0xa2, 0x342, 0x3, 0x2, 0x2, 0x2, 0xa4, 
       0x34e, 0x3, 0x2, 0x2, 0x2, 0xa6, 0x350, 0x3, 0x2, 0x2, 0x2, 0xa8, 
       0x359, 0x3, 0x2, 0x2, 0x2, 0xaa, 0x364, 0x3, 0x2, 0x2, 0x2, 0xac, 
       0x36a, 0x3, 0x2, 0x2, 0x2, 0xae, 0x36e, 0x3, 0x2, 0x2, 0x2, 0xb0, 
       0x370, 0x3, 0x2, 0x2, 0x2, 0xb2, 0x380, 0x3, 0x2, 0x2, 0x2, 0xb4, 
       0x385, 0x3, 0x2, 0x2, 0x2, 0xb6, 0x388, 0x3, 0x2, 0x2, 0x2, 0xb8, 
       0x38c, 0x3, 0x2, 0x2, 0x2, 0xba, 0x390, 0x3, 0x2, 0x2, 0x2, 0xbc, 
       0x394, 0x3, 0x2, 0x2, 0x2, 0xbe, 0x3a8, 0x3, 0x2, 0x2, 0x2, 0xc0, 
       0x3ad, 0x3, 0x2, 0x2, 0x2, 0xc2, 0x3c0, 0x3, 0x2, 0x2, 0x2, 0xc4, 
       0x3c4, 0x3, 0x2, 0x2, 0x2, 0xc6, 0x3c6, 0x3, 0x2, 0x2, 0x2, 0xc8, 
       0xcc, 0x5, 0x4, 0x3, 0x2, 0xc9, 0xcb, 0x5, 0xc6, 0x64, 0x2, 0xca, 
       0xc9, 0x3, 0x2, 0x2, 0x2, 0xcb, 0xce, 0x3, 0x2, 0x2, 0x2, 0xcc, 0xca, 
       0x3, 0x2, 0x2, 0x2, 0xcc, 0xcd, 0x3, 0x2, 0x2, 0x2, 0xcd, 0xd8, 0x3, 
       0x2, 0x2, 0x2, 0xce, 0xcc, 0x3, 0x2, 0x2, 0x2, 0xcf, 0xd3, 0x5, 0x6, 
       0x4, 0x2, 0xd0, 0xd2, 0x5, 0xc6, 0x64, 0x2, 0xd1, 0xd0, 0x3, 0x2, 
       0x2, 0x2, 0xd2, 0xd5, 0x3, 0x2, 0x2, 0x2, 0xd3, 0xd1, 0x3, 0x2, 0x2, 
       0x2, 0xd3, 0xd4, 0x3, 0x2, 0x2, 0x2, 0xd4, 0xd7, 0x3, 0x2, 0x2, 0x2, 
       0xd5, 0xd3, 0x3, 0x2, 0x2, 0x2, 0xd6, 0xcf, 0x3, 0x2, 0x2, 0x2, 0xd7, 
       0xda, 0x3, 0x2, 0x2, 0x2, 0xd8, 0xd6, 0x3, 0x2, 0x2, 0x2, 0xd8, 0xd9, 
       0x3, 0x2, 0x2, 0x2, 0xd9, 0xe8, 0x3, 0x2, 0x2, 0x2, 0xda, 0xd8, 0x3, 
       0x2, 0x2, 0x2, 0xdb, 0xdf, 0x5, 0x1a, 0xe, 0x2, 0xdc, 0xdf, 0x5, 
       0x1c, 0xf, 0x2, 0xdd, 0xdf, 0x5, 0xc, 0x7, 0x2, 0xde, 0xdb, 0x3, 
       0x2, 0x2, 0x2, 0xde, 0xdc, 0x3, 0x2, 0x2, 0x2, 0xde, 0xdd, 0x3, 0x2, 
       0x2, 0x2, 0xdf, 0xe3, 0x3, 0x2, 0x2, 0x2, 0xe0, 0xe2, 0x5, 0xc6, 
       0x64, 0x2, 0xe1, 0xe0, 0x3, 0x2, 0x2, 0x2, 0xe2, 0xe5, 0x3, 0x2, 
       0x2, 0x2, 0xe3, 0xe1, 0x3, 0x2, 0x2, 0x2, 0xe3, 0xe4, 0x3, 0x2, 0x2, 
       0x2, 0xe4, 0xe7, 0x3, 0x2, 0x2, 0x2, 0xe5, 0xe3, 0x3, 0x2, 0x2, 0x2, 
       0xe6, 0xde, 0x3, 0x2, 0x2, 0x2, 0xe7, 0xea, 0x3, 0x2, 0x2, 0x2, 0xe8, 
       0xe6, 0x3, 0x2, 0x2, 0x2, 0xe8, 0xe9, 0x3, 0x2, 0x2, 0x2, 0xe9, 0xeb, 
       0x3, 0x2, 0x2, 0x2, 0xea, 0xe8, 0x3, 0x2, 0x2, 0x2, 0xeb, 0xec, 0x7, 
       0x2, 0x2, 0x3, 0xec, 0x3, 0x3, 0x2, 0x2, 0x2, 0xed, 0xee, 0x7, 0x10, 
       0x2, 0x2, 0xee, 0xef, 0x7, 0x1d, 0x2, 0x2, 0xef, 0x5, 0x3, 0x2, 0x2, 
       0x2, 0xf0, 0xfc, 0x7, 0x19, 0x2, 0x2, 0xf1, 0xfd, 0x5, 0x8, 0x5, 
       0x2, 0xf2, 0xf8, 0x7, 0x1e, 0x2, 0x2, 0xf3, 0xf4, 0x5, 0x8, 0x5, 
       0x2, 0xf4, 0xf5, 0x5, 0xc6, 0x64, 0x2, 0xf5, 0xf7, 0x3, 0x2, 0x2, 
       0x2, 0xf6, 0xf3, 0x3, 0x2, 0x2, 0x2, 0xf7, 0xfa, 0x3, 0x2, 0x2, 0x2, 
       0xf8, 0xf6, 0x3, 0x2, 0x2, 0x2, 0xf8, 0xf9, 0x3, 0x2, 0x2, 0x2, 0xf9, 
       0xfb, 0x3, 0x2, 0x2, 0x2, 0xfa, 0xf8, 0x3, 0x2, 0x2, 0x2, 0xfb, 0xfd, 
       0x7, 0x1f, 0x2, 0x2, 0xfc, 0xf1, 0x3, 0x2, 0x2, 0x2, 0xfc, 0xf2, 
       0x3, 0x2, 0x2, 0x2, 0xfd, 0x7, 0x3, 0x2, 0x2, 0x2, 0xfe, 0x100, 0x9, 
       0x2, 0x2, 0x2, 0xff, 0xfe, 0x3, 0x2, 0x2, 0x2, 0xff, 0x100, 0x3, 
       0x2, 0x2, 0x2, 0x100, 0x101, 0x3, 0x2, 0x2, 0x2, 0x101, 0x102, 0x5, 
       0xa, 0x6, 0x2, 0x102, 0x9, 0x3, 0x2, 0x2, 0x2, 0x103, 0x104, 0x5, 
       0xb4, 0x5b, 0x2, 0x104, 0xb, 0x3, 0x2, 0x2, 0x2, 0x105, 0x109, 0x5, 
       0xe, 0x8, 0x2, 0x106, 0x109, 0x5, 0x16, 0xc, 0x2, 0x107, 0x109, 0x5, 
       0x20, 0x11, 0x2, 0x108, 0x105, 0x3, 0x2, 0x2, 0x2, 0x108, 0x106, 
       0x3, 0x2, 0x2, 0x2, 0x108, 0x107, 0x3, 0x2, 0x2, 0x2, 0x109, 0xd, 
       0x3, 0x2, 0x2, 0x2, 0x10a, 0x116, 0x7, 0x12, 0x2, 0x2, 0x10b, 0x117, 
       0x5, 0x10, 0x9, 0x2, 0x10c, 0x112, 0x7, 0x1e, 0x2, 0x2, 0x10d, 0x10e, 
       0x5, 0x10, 0x9, 0x2, 0x10e, 0x10f, 0x5, 0xc6, 0x64, 0x2, 0x10f, 0x111, 
       0x3, 0x2, 0x2, 0x2, 0x110, 0x10d, 0x3, 0x2, 0x2, 0x2, 0x111, 0x114, 
       0x3, 0x2, 0x2, 0x2, 0x112, 0x110, 0x3, 0x2, 0x2, 0x2, 0x112, 0x113, 
       0x3, 0x2, 0x2, 0x2, 0x113, 0x115, 0x3, 0x2, 0x2, 0x2, 0x114, 0x112, 
       0x3, 0x2, 0x2, 0x2, 0x115, 0x117, 0x7, 0x1f, 0x2, 0x2, 0x116, 0x10b, 
       0x3, 0x2, 0x2, 0x2, 0x116, 0x10c, 0x3, 0x2, 0x2, 0x2, 0x117, 0xf, 
       0x3, 0x2, 0x2, 0x2, 0x118, 0x11e, 0x5, 0x12, 0xa, 0x2, 0x119, 0x11b, 
       0x5, 0x6c, 0x37, 0x2, 0x11a, 0x119, 0x3, 0x2, 0x2, 0x2, 0x11a, 0x11b, 
       0x3, 0x2, 0x2, 0x2, 0x11b, 0x11c, 0x3, 0x2, 0x2, 0x2, 0x11c, 0x11d, 
       0x7, 0x24, 0x2, 0x2, 0x11d, 0x11f, 0x5, 0x14, 0xb, 0x2, 0x11e, 0x11a, 
       0x3, 0x2, 0x2, 0x2, 0x11e, 0x11f, 0x3, 0x2, 0x2, 0x2, 0x11f, 0x11, 
       0x3, 0x2, 0x2, 0x2, 0x120, 0x125, 0x7, 0x1d, 0x2, 0x2, 0x121, 0x122, 
       0x7, 0x25, 0x2, 0x2, 0x122, 0x124, 0x7, 0x1d, 0x2, 0x2, 0x123, 0x121, 
       0x3, 0x2, 0x2, 0x2, 0x124, 0x127, 0x3, 0x2, 0x2, 0x2, 0x125, 0x123, 
       0x3, 0x2, 0x2, 0x2, 0x125, 0x126, 0x3, 0x2, 0x2, 0x2, 0x126, 0x13, 
       0x3, 0x2, 0x2, 0x2, 0x127, 0x125, 0x3, 0x2, 0x2, 0x2, 0x128, 0x12d, 
       0x5, 0x8e, 0x48, 0x2, 0x129, 0x12a, 0x7, 0x25, 0x2, 0x2, 0x12a, 0x12c, 
       0x5, 0x8e, 0x48, 0x2, 0x12b, 0x129, 0x3, 0x2, 0x2, 0x2, 0x12c, 0x12f, 
       0x3, 0x2, 0x2, 0x2, 0x12d, 0x12b, 0x3, 0x2, 0x2, 0x2, 0x12d, 0x12e, 
       0x3, 0x2, 0x2, 0x2, 0x12e, 0x15, 0x3, 0x2, 0x2, 0x2, 0x12f, 0x12d, 
       0x3, 0x2, 0x2, 0x2, 0x130, 0x13c, 0x7, 0x16, 0x2, 0x2, 0x131, 0x13d, 
       0x5, 0x18, 0xd, 0x2, 0x132, 0x138, 0x7, 0x1e, 0x2, 0x2, 0x133, 0x134, 
       0x5, 0x18, 0xd, 0x2, 0x134, 0x135, 0x5, 0xc6, 0x64, 0x2, 0x135, 0x137, 
       0x3, 0x2, 0x2, 0x2, 0x136, 0x133, 0x3, 0x2, 0x2, 0x2, 0x137, 0x13a, 
       0x3, 0x2, 0x2, 0x2, 0x138, 0x136, 0x3, 0x2, 0x2, 0x2, 0x138, 0x139, 
       0x3, 0x2, 0x2, 0x2, 0x139, 0x13b, 0x3, 0x2, 0x2, 0x2, 0x13a, 0x138, 
       0x3, 0x2, 0x2, 0x2, 0x13b, 0x13d, 0x7, 0x1f, 0x2, 0x2, 0x13c, 0x131, 
       0x3, 0x2, 0x2, 0x2, 0x13c, 0x132, 0x3, 0x2, 0x2, 0x2, 0x13d, 0x17, 
       0x3, 0x2, 0x2, 0x2, 0x13e, 0x140, 0x7, 0x1d, 0x2, 0x2, 0x13f, 0x141, 
       0x7, 0x24, 0x2, 0x2, 0x140, 0x13f, 0x3, 0x2, 0x2, 0x2, 0x140, 0x141, 
       0x3, 0x2, 0x2, 0x2, 0x141, 0x142, 0x3, 0x2, 0x2, 0x2, 0x142, 0x143, 
       0x5, 0x6c, 0x37, 0x2, 0x143, 0x19, 0x3, 0x2, 0x2, 0x2, 0x144, 0x145, 
       0x7, 0x5, 0x2, 0x2, 0x145, 0x146, 0x7, 0x1d, 0x2, 0x2, 0x146, 0x148, 
       0x5, 0x86, 0x44, 0x2, 0x147, 0x149, 0x5, 0x24, 0x13, 0x2, 0x148, 
       0x147, 0x3, 0x2, 0x2, 0x2, 0x148, 0x149, 0x3, 0x2, 0x2, 0x2, 0x149, 
       0x1b, 0x3, 0x2, 0x2, 0x2, 0x14a, 0x14b, 0x7, 0x5, 0x2, 0x2, 0x14b, 
       0x14c, 0x5, 0x1e, 0x10, 0x2, 0x14c, 0x14d, 0x7, 0x1d, 0x2, 0x2, 0x14d, 
       0x14f, 0x5, 0x86, 0x44, 0x2, 0x14e, 0x150, 0x5, 0x24, 0x13, 0x2, 
       0x14f, 0x14e, 0x3, 0x2, 0x2, 0x2, 0x14f, 0x150, 0x3, 0x2, 0x2, 0x2, 
       0x150, 0x1d, 0x3, 0x2, 0x2, 0x2, 0x151, 0x152, 0x5, 0x8a, 0x46, 0x2, 
       0x152, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x153, 0x15f, 0x7, 0x1b, 0x2, 0x2, 
       0x154, 0x160, 0x5, 0x22, 0x12, 0x2, 0x155, 0x15b, 0x7, 0x1e, 0x2, 
       0x2, 0x156, 0x157, 0x5, 0x22, 0x12, 0x2, 0x157, 0x158, 0x5, 0xc6, 
       0x64, 0x2, 0x158, 0x15a, 0x3, 0x2, 0x2, 0x2, 0x159, 0x156, 0x3, 0x2, 
       0x2, 0x2, 0x15a, 0x15d, 0x3, 0x2, 0x2, 0x2, 0x15b, 0x159, 0x3, 0x2, 
       0x2, 0x2, 0x15b, 0x15c, 0x3, 0x2, 0x2, 0x2, 0x15c, 0x15e, 0x3, 0x2, 
       0x2, 0x2, 0x15d, 0x15b, 0x3, 0x2, 0x2, 0x2, 0x15e, 0x160, 0x7, 0x1f, 
       0x2, 0x2, 0x15f, 0x154, 0x3, 0x2, 0x2, 0x2, 0x15f, 0x155, 0x3, 0x2, 
       0x2, 0x2, 0x160, 0x21, 0x3, 0x2, 0x2, 0x2, 0x161, 0x169, 0x5, 0x12, 
       0xa, 0x2, 0x162, 0x165, 0x5, 0x6c, 0x37, 0x2, 0x163, 0x164, 0x7, 
       0x24, 0x2, 0x2, 0x164, 0x166, 0x5, 0x14, 0xb, 0x2, 0x165, 0x163, 
       0x3, 0x2, 0x2, 0x2, 0x165, 0x166, 0x3, 0x2, 0x2, 0x2, 0x166, 0x16a, 
       0x3, 0x2, 0x2, 0x2, 0x167, 0x168, 0x7, 0x24, 0x2, 0x2, 0x168, 0x16a, 
       0x5, 0x14, 0xb, 0x2, 0x169, 0x162, 0x3, 0x2, 0x2, 0x2, 0x169, 0x167, 
       0x3, 0x2, 0x2, 0x2, 0x16a, 0x23, 0x3, 0x2, 0x2, 0x2, 0x16b, 0x16f, 
       0x7, 0x20, 0x2, 0x2, 0x16c, 0x16e, 0x5, 0xc6, 0x64, 0x2, 0x16d, 0x16c, 
       0x3, 0x2, 0x2, 0x2, 0x16e, 0x171, 0x3, 0x2, 0x2, 0x2, 0x16f, 0x16d, 
       0x3, 0x2, 0x2, 0x2, 0x16f, 0x170, 0x3, 0x2, 0x2, 0x2, 0x170, 0x173, 
       0x3, 0x2, 0x2, 0x2, 0x171, 0x16f, 0x3, 0x2, 0x2, 0x2, 0x172, 0x174, 
       0x5, 0x26, 0x14, 0x2, 0x173, 0x172, 0x3, 0x2, 0x2, 0x2, 0x173, 0x174, 
       0x3, 0x2, 0x2, 0x2, 0x174, 0x175, 0x3, 0x2, 0x2, 0x2, 0x175, 0x176, 
       0x7, 0x21, 0x2, 0x2, 0x176, 0x25, 0x3, 0x2, 0x2, 0x2, 0x177, 0x179, 
       0x5, 0x28, 0x15, 0x2, 0x178, 0x17a, 0x5, 0xc6, 0x64, 0x2, 0x179, 
       0x178, 0x3, 0x2, 0x2, 0x2, 0x17a, 0x17b, 0x3, 0x2, 0x2, 0x2, 0x17b, 
       0x179, 0x3, 0x2, 0x2, 0x2, 0x17b, 0x17c, 0x3, 0x2, 0x2, 0x2, 0x17c, 
       0x17e, 0x3, 0x2, 0x2, 0x2, 0x17d, 0x177, 0x3, 0x2, 0x2, 0x2, 0x17e, 
       0x17f, 0x3, 0x2, 0x2, 0x2, 0x17f, 0x17d, 0x3, 0x2, 0x2, 0x2, 0x17f, 
       0x180, 0x3, 0x2, 0x2, 0x2, 0x180, 0x27, 0x3, 0x2, 0x2, 0x2, 0x181, 
       0x191, 0x5, 0xc, 0x7, 0x2, 0x182, 0x191, 0x5, 0x3a, 0x1e, 0x2, 0x183, 
       0x191, 0x5, 0x2a, 0x16, 0x2, 0x184, 0x191, 0x5, 0x6a, 0x36, 0x2, 
       0x185, 0x191, 0x5, 0x3c, 0x1f, 0x2, 0x186, 0x191, 0x5, 0x3e, 0x20, 
       0x2, 0x187, 0x191, 0x5, 0x40, 0x21, 0x2, 0x188, 0x191, 0x5, 0x42, 
       0x22, 0x2, 0x189, 0x191, 0x5, 0x44, 0x23, 0x2, 0x18a, 0x191, 0x5, 
       0x24, 0x13, 0x2, 0x18b, 0x191, 0x5, 0x48, 0x25, 0x2, 0x18c, 0x191, 
       0x5, 0x4a, 0x26, 0x2, 0x18d, 0x191, 0x5, 0x5c, 0x2f, 0x2, 0x18e, 
       0x191, 0x5, 0x64, 0x33, 0x2, 0x18f, 0x191, 0x5, 0x46, 0x24, 0x2, 
       0x190, 0x181, 0x3, 0x2, 0x2, 0x2, 0x190, 0x182, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x183, 0x3, 0x2, 0x2, 0x2, 0x190, 0x184, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x185, 0x3, 0x2, 0x2, 0x2, 0x190, 0x186, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x187, 0x3, 0x2, 0x2, 0x2, 0x190, 0x188, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x189, 0x3, 0x2, 0x2, 0x2, 0x190, 0x18a, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x18b, 0x3, 0x2, 0x2, 0x2, 0x190, 0x18c, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x18d, 0x3, 0x2, 0x2, 0x2, 0x190, 0x18e, 0x3, 0x2, 0x2, 0x2, 
       0x190, 0x18f, 0x3, 0x2, 0x2, 0x2, 0x191, 0x29, 0x3, 0x2, 0x2, 0x2, 
       0x192, 0x198, 0x5, 0x2e, 0x18, 0x2, 0x193, 0x198, 0x5, 0x30, 0x19, 
       0x2, 0x194, 0x198, 0x5, 0x32, 0x1a, 0x2, 0x195, 0x198, 0x5, 0x2c, 
       0x17, 0x2, 0x196, 0x198, 0x5, 0x36, 0x1c, 0x2, 0x197, 0x192, 0x3, 
       0x2, 0x2, 0x2, 0x197, 0x193, 0x3, 0x2, 0x2, 0x2, 0x197, 0x194, 0x3, 
       0x2, 0x2, 0x2, 0x197, 0x195, 0x3, 0x2, 0x2, 0x2, 0x197, 0x196, 0x3, 
       0x2, 0x2, 0x2, 0x198, 0x2b, 0x3, 0x2, 0x2, 0x2, 0x199, 0x19a, 0x5, 
       0x8e, 0x48, 0x2, 0x19a, 0x2d, 0x3, 0x2, 0x2, 0x2, 0x19b, 0x19c, 0x5, 
       0x8e, 0x48, 0x2, 0x19c, 0x19d, 0x7, 0x44, 0x2, 0x2, 0x19d, 0x19e, 
       0x5, 0x8e, 0x48, 0x2, 0x19e, 0x2f, 0x3, 0x2, 0x2, 0x2, 0x19f, 0x1a0, 
       0x5, 0x8e, 0x48, 0x2, 0x1a0, 0x1a1, 0x9, 0x3, 0x2, 0x2, 0x1a1, 0x31, 
       0x3, 0x2, 0x2, 0x2, 0x1a2, 0x1a3, 0x5, 0x14, 0xb, 0x2, 0x1a3, 0x1a4, 
       0x5, 0x34, 0x1b, 0x2, 0x1a4, 0x1a5, 0x5, 0x14, 0xb, 0x2, 0x1a5, 0x33, 
       0x3, 0x2, 0x2, 0x2, 0x1a6, 0x1a8, 0x9, 0x4, 0x2, 0x2, 0x1a7, 0x1a6, 
       0x3, 0x2, 0x2, 0x2, 0x1a7, 0x1a8, 0x3, 0x2, 0x2, 0x2, 0x1a8, 0x1a9, 
       0x3, 0x2, 0x2, 0x2, 0x1a9, 0x1aa, 0x7, 0x24, 0x2, 0x2, 0x1aa, 0x35, 
       0x3, 0x2, 0x2, 0x2, 0x1ab, 0x1ac, 0x5, 0x12, 0xa, 0x2, 0x1ac, 0x1ad, 
       0x7, 0x2d, 0x2, 0x2, 0x1ad, 0x1ae, 0x5, 0x14, 0xb, 0x2, 0x1ae, 0x37, 
       0x3, 0x2, 0x2, 0x2, 0x1af, 0x1b0, 0x9, 0x5, 0x2, 0x2, 0x1b0, 0x39, 
       0x3, 0x2, 0x2, 0x2, 0x1b1, 0x1b2, 0x7, 0x1d, 0x2, 0x2, 0x1b2, 0x1b4, 
       0x7, 0x29, 0x2, 0x2, 0x1b3, 0x1b5, 0x5, 0x28, 0x15, 0x2, 0x1b4, 0x1b3, 
       0x3, 0x2, 0x2, 0x2, 0x1b4, 0x1b5, 0x3, 0x2, 0x2, 0x2, 0x1b5, 0x3b, 
       0x3, 0x2, 0x2, 0x2, 0x1b6, 0x1b8, 0x7, 0x1a, 0x2, 0x2, 0x1b7, 0x1b9, 
       0x5, 0x14, 0xb, 0x2, 0x1b8, 0x1b7, 0x3, 0x2, 0x2, 0x2, 0x1b8, 0x1b9, 
       0x3, 0x2, 0x2, 0x2, 0x1b9, 0x3d, 0x3, 0x2, 0x2, 0x2, 0x1ba, 0x1bc, 
       0x7, 0x3, 0x2, 0x2, 0x1bb, 0x1bd, 0x7, 0x1d, 0x2, 0x2, 0x1bc, 0x1bb, 
       0x3, 0x2, 0x2, 0x2, 0x1bc, 0x1bd, 0x3, 0x2, 0x2, 0x2, 0x1bd, 0x3f, 
       0x3, 0x2, 0x2, 0x2, 0x1be, 0x1c0, 0x7, 0x17, 0x2, 0x2, 0x1bf, 0x1c1, 
       0x7, 0x1d, 0x2, 0x2, 0x1c0, 0x1bf, 0x3, 0x2, 0x2, 0x2, 0x1c0, 0x1c1, 
       0x3, 0x2, 0x2, 0x2, 0x1c1, 0x41, 0x3, 0x2, 0x2, 0x2, 0x1c2, 0x1c3, 
       0x7, 0xf, 0x2, 0x2, 0x1c3, 0x1c4, 0x7, 0x1d, 0x2, 0x2, 0x1c4, 0x43, 
       0x3, 0x2, 0x2, 0x2, 0x1c5, 0x1c6, 0x7, 0x13, 0x2, 0x2, 0x1c6, 0x45, 
       0x3, 0x2, 0x2, 0x2, 0x1c7, 0x1c8, 0x7, 0x9, 0x2, 0x2, 0x1c8, 0x1c9, 
       0x5, 0x8e, 0x48, 0x2, 0x1c9, 0x47, 0x3, 0x2, 0x2, 0x2, 0x1ca, 0x1d3, 
       0x7, 0x14, 0x2, 0x2, 0x1cb, 0x1d4, 0x5, 0x8e, 0x48, 0x2, 0x1cc, 0x1cd, 
       0x5, 0xc6, 0x64, 0x2, 0x1cd, 0x1ce, 0x5, 0x8e, 0x48, 0x2, 0x1ce, 
       0x1d4, 0x3, 0x2, 0x2, 0x2, 0x1cf, 0x1d0, 0x5, 0x2a, 0x16, 0x2, 0x1d0, 
       0x1d1, 0x5, 0xc6, 0x64, 0x2, 0x1d1, 0x1d2, 0x5, 0x8e, 0x48, 0x2, 
       0x1d2, 0x1d4, 0x3, 0x2, 0x2, 0x2, 0x1d3, 0x1cb, 0x3, 0x2, 0x2, 0x2, 
       0x1d3, 0x1cc, 0x3, 0x2, 0x2, 0x2, 0x1d3, 0x1cf, 0x3, 0x2, 0x2, 0x2, 
       0x1d4, 0x1d5, 0x3, 0x2, 0x2, 0x2, 0x1d5, 0x1db, 0x5, 0x24, 0x13, 
       0x2, 0x1d6, 0x1d9, 0x7, 0xe, 0x2, 0x2, 0x1d7, 0x1da, 0x5, 0x48, 0x25, 
       0x2, 0x1d8, 0x1da, 0x5, 0x24, 0x13, 0x2, 0x1d9, 0x1d7, 0x3, 0x2, 
       0x2, 0x2, 0x1d9, 0x1d8, 0x3, 0x2, 0x2, 0x2, 0x1da, 0x1dc, 0x3, 0x2, 
       0x2, 0x2, 0x1db, 0x1d6, 0x3, 0x2, 0x2, 0x2, 0x1db, 0x1dc, 0x3, 0x2, 
       0x2, 0x2, 0x1dc, 0x49, 0x3, 0x2, 0x2, 0x2, 0x1dd, 0x1e0, 0x5, 0x4c, 
       0x27, 0x2, 0x1de, 0x1e0, 0x5, 0x52, 0x2a, 0x2, 0x1df, 0x1dd, 0x3, 
       0x2, 0x2, 0x2, 0x1df, 0x1de, 0x3, 0x2, 0x2, 0x2, 0x1e0, 0x4b, 0x3, 
       0x2, 0x2, 0x2, 0x1e1, 0x1ec, 0x7, 0x11, 0x2, 0x2, 0x1e2, 0x1e4, 0x5, 
       0x8e, 0x48, 0x2, 0x1e3, 0x1e2, 0x3, 0x2, 0x2, 0x2, 0x1e3, 0x1e4, 
       0x3, 0x2, 0x2, 0x2, 0x1e4, 0x1ed, 0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1e7, 
       0x5, 0x2a, 0x16, 0x2, 0x1e6, 0x1e5, 0x3, 0x2, 0x2, 0x2, 0x1e6, 0x1e7, 
       0x3, 0x2, 0x2, 0x2, 0x1e7, 0x1e8, 0x3, 0x2, 0x2, 0x2, 0x1e8, 0x1ea, 
       0x5, 0xc6, 0x64, 0x2, 0x1e9, 0x1eb, 0x5, 0x8e, 0x48, 0x2, 0x1ea, 
       0x1e9, 0x3, 0x2, 0x2, 0x2, 0x1ea, 0x1eb, 0x3, 0x2, 0x2, 0x2, 0x1eb, 
       0x1ed, 0x3, 0x2, 0x2, 0x2, 0x1ec, 0x1e3, 0x3, 0x2, 0x2, 0x2, 0x1ec, 
       0x1e6, 0x3, 0x2, 0x2, 0x2, 0x1ed, 0x1ee, 0x3, 0x2, 0x2, 0x2, 0x1ee, 
       0x1f2, 0x7, 0x20, 0x2, 0x2, 0x1ef, 0x1f1, 0x5, 0x4e, 0x28, 0x2, 0x1f0, 
       0x1ef, 0x3, 0x2, 0x2, 0x2, 0x1f1, 0x1f4, 0x3, 0x2, 0x2, 0x2, 0x1f2, 
       0x1f0, 0x3, 0x2, 0x2, 0x2, 0x1f2, 0x1f3, 0x3, 0x2, 0x2, 0x2, 0x1f3, 
       0x1f5, 0x3, 0x2, 0x2, 0x2, 0x1f4, 0x1f2, 0x3, 0x2, 0x2, 0x2, 0x1f5, 
       0x1f6, 0x7, 0x21, 0x2, 0x2, 0x1f6, 0x4d, 0x3, 0x2, 0x2, 0x2, 0x1f7, 
       0x1f8, 0x5, 0x50, 0x29, 0x2, 0x1f8, 0x1fa, 0x7, 0x29, 0x2, 0x2, 0x1f9, 
       0x1fb, 0x5, 0x26, 0x14, 0x2, 0x1fa, 0x1f9, 0x3, 0x2, 0x2, 0x2, 0x1fa, 
       0x1fb, 0x3, 0x2, 0x2, 0x2, 0x1fb, 0x4f, 0x3, 0x2, 0x2, 0x2, 0x1fc, 
       0x1fd, 0x7, 0x8, 0x2, 0x2, 0x1fd, 0x200, 0x5, 0x14, 0xb, 0x2, 0x1fe, 
       0x200, 0x7, 0x4, 0x2, 0x2, 0x1ff, 0x1fc, 0x3, 0x2, 0x2, 0x2, 0x1ff, 
       0x1fe, 0x3, 0x2, 0x2, 0x2, 0x200, 0x51, 0x3, 0x2, 0x2, 0x2, 0x201, 
       0x20a, 0x7, 0x11, 0x2, 0x2, 0x202, 0x20b, 0x5, 0x54, 0x2b, 0x2, 0x203, 
       0x204, 0x5, 0xc6, 0x64, 0x2, 0x204, 0x205, 0x5, 0x54, 0x2b, 0x2, 
       0x205, 0x20b, 0x3, 0x2, 0x2, 0x2, 0x206, 0x207, 0x5, 0x2a, 0x16, 
       0x2, 0x207, 0x208, 0x5, 0xc6, 0x64, 0x2, 0x208, 0x209, 0x5, 0x54, 
       0x2b, 0x2, 0x209, 0x20b, 0x3, 0x2, 0x2, 0x2, 0x20a, 0x202, 0x3, 0x2, 
       0x2, 0x2, 0x20a, 0x203, 0x3, 0x2, 0x2, 0x2, 0x20a, 0x206, 0x3, 0x2, 
       0x2, 0x2, 0x20b, 0x20c, 0x3, 0x2, 0x2, 0x2, 0x20c, 0x210, 0x7, 0x20, 
       0x2, 0x2, 0x20d, 0x20f, 0x5, 0x56, 0x2c, 0x2, 0x20e, 0x20d, 0x3, 
       0x2, 0x2, 0x2, 0x20f, 0x212, 0x3, 0x2, 0x2, 0x2, 0x210, 0x20e, 0x3, 
       0x2, 0x2, 0x2, 0x210, 0x211, 0x3, 0x2, 0x2, 0x2, 0x211, 0x213, 0x3, 
       0x2, 0x2, 0x2, 0x212, 0x210, 0x3, 0x2, 0x2, 0x2, 0x213, 0x214, 0x7, 
       0x21, 0x2, 0x2, 0x214, 0x53, 0x3, 0x2, 0x2, 0x2, 0x215, 0x216, 0x7, 
       0x1d, 0x2, 0x2, 0x216, 0x218, 0x7, 0x2d, 0x2, 0x2, 0x217, 0x215, 
       0x3, 0x2, 0x2, 0x2, 0x217, 0x218, 0x3, 0x2, 0x2, 0x2, 0x218, 0x219, 
       0x3, 0x2, 0x2, 0x2, 0x219, 0x21a, 0x5, 0x90, 0x49, 0x2, 0x21a, 0x21b, 
       0x7, 0x2a, 0x2, 0x2, 0x21b, 0x21c, 0x7, 0x1e, 0x2, 0x2, 0x21c, 0x21d, 
       0x7, 0x16, 0x2, 0x2, 0x21d, 0x21e, 0x7, 0x1f, 0x2, 0x2, 0x21e, 0x55, 
       0x3, 0x2, 0x2, 0x2, 0x21f, 0x220, 0x5, 0x58, 0x2d, 0x2, 0x220, 0x222, 
       0x7, 0x29, 0x2, 0x2, 0x221, 0x223, 0x5, 0x26, 0x14, 0x2, 0x222, 0x221, 
       0x3, 0x2, 0x2, 0x2, 0x222, 0x223, 0x3, 0x2, 0x2, 0x2, 0x223, 0x57, 
       0x3, 0x2, 0x2, 0x2, 0x224, 0x225, 0x7, 0x8, 0x2, 0x2, 0x225, 0x228, 
       0x5, 0x5a, 0x2e, 0x2, 0x226, 0x228, 0x7, 0x4, 0x2, 0x2, 0x227, 0x224, 
       0x3, 0x2, 0x2, 0x2, 0x227, 0x226, 0x3, 0x2, 0x2, 0x2, 0x228, 0x59, 
       0x3, 0x2, 0x2, 0x2, 0x229, 0x22c, 0x5, 0x6c, 0x37, 0x2, 0x22a, 0x22c, 
       0x7, 0x1c, 0x2, 0x2, 0x22b, 0x229, 0x3, 0x2, 0x2, 0x2, 0x22b, 0x22a, 
       0x3, 0x2, 0x2, 0x2, 0x22c, 0x234, 0x3, 0x2, 0x2, 0x2, 0x22d, 0x230, 
       0x7, 0x25, 0x2, 0x2, 0x22e, 0x231, 0x5, 0x6c, 0x37, 0x2, 0x22f, 0x231, 
       0x7, 0x1c, 0x2, 0x2, 0x230, 0x22e, 0x3, 0x2, 0x2, 0x2, 0x230, 0x22f, 
       0x3, 0x2, 0x2, 0x2, 0x231, 0x233, 0x3, 0x2, 0x2, 0x2, 0x232, 0x22d, 
       0x3, 0x2, 0x2, 0x2, 0x233, 0x236, 0x3, 0x2, 0x2, 0x2, 0x234, 0x232, 
       0x3, 0x2, 0x2, 0x2, 0x234, 0x235, 0x3, 0x2, 0x2, 0x2, 0x235, 0x5b, 
       0x3, 0x2, 0x2, 0x2, 0x236, 0x234, 0x3, 0x2, 0x2, 0x2, 0x237, 0x238, 
       0x7, 0x7, 0x2, 0x2, 0x238, 0x23c, 0x7, 0x20, 0x2, 0x2, 0x239, 0x23b, 
       0x5, 0x5e, 0x30, 0x2, 0x23a, 0x239, 0x3, 0x2, 0x2, 0x2, 0x23b, 0x23e, 
       0x3, 0x2, 0x2, 0x2, 0x23c, 0x23a, 0x3, 0x2, 0x2, 0x2, 0x23c, 0x23d, 
       0x3, 0x2, 0x2, 0x2, 0x23d, 0x23f, 0x3, 0x2, 0x2, 0x2, 0x23e, 0x23c, 
       0x3, 0x2, 0x2, 0x2, 0x23f, 0x240, 0x7, 0x21, 0x2, 0x2, 0x240, 0x5d, 
       0x3, 0x2, 0x2, 0x2, 0x241, 0x242, 0x5, 0x60, 0x31, 0x2, 0x242, 0x244, 
       0x7, 0x29, 0x2, 0x2, 0x243, 0x245, 0x5, 0x26, 0x14, 0x2, 0x244, 0x243, 
       0x3, 0x2, 0x2, 0x2, 0x244, 0x245, 0x3, 0x2, 0x2, 0x2, 0x245, 0x5f, 
       0x3, 0x2, 0x2, 0x2, 0x246, 0x249, 0x7, 0x8, 0x2, 0x2, 0x247, 0x24a, 
       0x5, 0x2e, 0x18, 0x2, 0x248, 0x24a, 0x5, 0x62, 0x32, 0x2, 0x249, 
       0x247, 0x3, 0x2, 0x2, 0x2, 0x249, 0x248, 0x3, 0x2, 0x2, 0x2, 0x24a, 
       0x24d, 0x3, 0x2, 0x2, 0x2, 0x24b, 0x24d, 0x7, 0x4, 0x2, 0x2, 0x24c, 
       0x246, 0x3, 0x2, 0x2, 0x2, 0x24c, 0x24b, 0x3, 0x2, 0x2, 0x2, 0x24d, 
       0x61, 0x3, 0x2, 0x2, 0x2, 0x24e, 0x24f, 0x5, 0x14, 0xb, 0x2, 0x24f, 
       0x250, 0x7, 0x24, 0x2, 0x2, 0x250, 0x255, 0x3, 0x2, 0x2, 0x2, 0x251, 
       0x252, 0x5, 0x12, 0xa, 0x2, 0x252, 0x253, 0x7, 0x2d, 0x2, 0x2, 0x253, 
       0x255, 0x3, 0x2, 0x2, 0x2, 0x254, 0x24e, 0x3, 0x2, 0x2, 0x2, 0x254, 
       0x251, 0x3, 0x2, 0x2, 0x2, 0x254, 0x255, 0x3, 0x2, 0x2, 0x2, 0x255, 
       0x256, 0x3, 0x2, 0x2, 0x2, 0x256, 0x257, 0x5, 0x8e, 0x48, 0x2, 0x257, 
       0x63, 0x3, 0x2, 0x2, 0x2, 0x258, 0x25c, 0x7, 0x18, 0x2, 0x2, 0x259, 
       0x25d, 0x5, 0x8e, 0x48, 0x2, 0x25a, 0x25d, 0x5, 0x66, 0x34, 0x2, 
       0x25b, 0x25d, 0x5, 0x68, 0x35, 0x2, 0x25c, 0x259, 0x3, 0x2, 0x2, 
       0x2, 0x25c, 0x25a, 0x3, 0x2, 0x2, 0x2, 0x25c, 0x25b, 0x3, 0x2, 0x2, 
       0x2, 0x25c, 0x25d, 0x3, 0x2, 0x2, 0x2, 0x25d, 0x25e, 0x3, 0x2, 0x2, 
       0x2, 0x25e, 0x25f, 0x5, 0x24, 0x13, 0x2, 0x25f, 0x65, 0x3, 0x2, 0x2, 
       0x2, 0x260, 0x262, 0x5, 0x2a, 0x16, 0x2, 0x261, 0x260, 0x3, 0x2, 
       0x2, 0x2, 0x261, 0x262, 0x3, 0x2, 0x2, 0x2, 0x262, 0x263, 0x3, 0x2, 
       0x2, 0x2, 0x263, 0x265, 0x5, 0xc6, 0x64, 0x2, 0x264, 0x266, 0x5, 
       0x8e, 0x48, 0x2, 0x265, 0x264, 0x3, 0x2, 0x2, 0x2, 0x265, 0x266, 
       0x3, 0x2, 0x2, 0x2, 0x266, 0x267, 0x3, 0x2, 0x2, 0x2, 0x267, 0x269, 
       0x5, 0xc6, 0x64, 0x2, 0x268, 0x26a, 0x5, 0x2a, 0x16, 0x2, 0x269, 
       0x268, 0x3, 0x2, 0x2, 0x2, 0x269, 0x26a, 0x3, 0x2, 0x2, 0x2, 0x26a, 
       0x67, 0x3, 0x2, 0x2, 0x2, 0x26b, 0x26c, 0x5, 0x14, 0xb, 0x2, 0x26c, 
       0x26d, 0x7, 0x24, 0x2, 0x2, 0x26d, 0x272, 0x3, 0x2, 0x2, 0x2, 0x26e, 
       0x26f, 0x5, 0x12, 0xa, 0x2, 0x26f, 0x270, 0x7, 0x2d, 0x2, 0x2, 0x270, 
       0x272, 0x3, 0x2, 0x2, 0x2, 0x271, 0x26b, 0x3, 0x2, 0x2, 0x2, 0x271, 
       0x26e, 0x3, 0x2, 0x2, 0x2, 0x271, 0x272, 0x3, 0x2, 0x2, 0x2, 0x272, 
       0x273, 0x3, 0x2, 0x2, 0x2, 0x273, 0x274, 0x7, 0x15, 0x2, 0x2, 0x274, 
       0x275, 0x5, 0x8e, 0x48, 0x2, 0x275, 0x69, 0x3, 0x2, 0x2, 0x2, 0x276, 
       0x277, 0x7, 0xa, 0x2, 0x2, 0x277, 0x278, 0x5, 0x8e, 0x48, 0x2, 0x278, 
       0x6b, 0x3, 0x2, 0x2, 0x2, 0x279, 0x280, 0x5, 0x6e, 0x38, 0x2, 0x27a, 
       0x280, 0x5, 0x70, 0x39, 0x2, 0x27b, 0x27c, 0x7, 0x1e, 0x2, 0x2, 0x27c, 
       0x27d, 0x5, 0x6c, 0x37, 0x2, 0x27d, 0x27e, 0x7, 0x1f, 0x2, 0x2, 0x27e, 
       0x280, 0x3, 0x2, 0x2, 0x2, 0x27f, 0x279, 0x3, 0x2, 0x2, 0x2, 0x27f, 
       0x27a, 0x3, 0x2, 0x2, 0x2, 0x27f, 0x27b, 0x3, 0x2, 0x2, 0x2, 0x280, 
       0x6d, 0x3, 0x2, 0x2, 0x2, 0x281, 0x284, 0x5, 0xa0, 0x51, 0x2, 0x282, 
       0x284, 0x7, 0x1d, 0x2, 0x2, 0x283, 0x281, 0x3, 0x2, 0x2, 0x2, 0x283, 
       0x282, 0x3, 0x2, 0x2, 0x2, 0x284, 0x6f, 0x3, 0x2, 0x2, 0x2, 0x285, 
       0x28e, 0x5, 0x72, 0x3a, 0x2, 0x286, 0x28e, 0x5, 0xb0, 0x59, 0x2, 
       0x287, 0x28e, 0x5, 0x78, 0x3d, 0x2, 0x288, 0x28e, 0x5, 0x84, 0x43, 
       0x2, 0x289, 0x28e, 0x5, 0x7a, 0x3e, 0x2, 0x28a, 0x28e, 0x5, 0x7c, 
       0x3f, 0x2, 0x28b, 0x28e, 0x5, 0x7e, 0x40, 0x2, 0x28c, 0x28e, 0x5, 
       0x80, 0x41, 0x2, 0x28d, 0x285, 0x3, 0x2, 0x2, 0x2, 0x28d, 0x286, 
       0x3, 0x2, 0x2, 0x2, 0x28d, 0x287, 0x3, 0x2, 0x2, 0x2, 0x28d, 0x288, 
       0x3, 0x2, 0x2, 0x2, 0x28d, 0x289, 0x3, 0x2, 0x2, 0x2, 0x28d, 0x28a, 
       0x3, 0x2, 0x2, 0x2, 0x28d, 0x28b, 0x3, 0x2, 0x2, 0x2, 0x28d, 0x28c, 
       0x3, 0x2, 0x2, 0x2, 0x28e, 0x71, 0x3, 0x2, 0x2, 0x2, 0x28f, 0x290, 
       0x7, 0x22, 0x2, 0x2, 0x290, 0x291, 0x5, 0x74, 0x3b, 0x2, 0x291, 0x292, 
       0x7, 0x23, 0x2, 0x2, 0x292, 0x293, 0x5, 0x76, 0x3c, 0x2, 0x293, 0x73, 
       0x3, 0x2, 0x2, 0x2, 0x294, 0x295, 0x5, 0x8e, 0x48, 0x2, 0x295, 0x75, 
       0x3, 0x2, 0x2, 0x2, 0x296, 0x297, 0x5, 0x6c, 0x37, 0x2, 0x297, 0x77, 
       0x3, 0x2, 0x2, 0x2, 0x298, 0x299, 0x7, 0x42, 0x2, 0x2, 0x299, 0x29a, 
       0x5, 0x6c, 0x37, 0x2, 0x29a, 0x79, 0x3, 0x2, 0x2, 0x2, 0x29b, 0x29c, 
       0x7, 0x6, 0x2, 0x2, 0x29c, 0x2a5, 0x7, 0x20, 0x2, 0x2, 0x29d, 0x2a0, 
       0x5, 0x82, 0x42, 0x2, 0x29e, 0x2a0, 0x5, 0x6e, 0x38, 0x2, 0x29f, 
       0x29d, 0x3, 0x2, 0x2, 0x2, 0x29f, 0x29e, 0x3, 0x2, 0x2, 0x2, 0x2a0, 
       0x2a1, 0x3, 0x2, 0x2, 0x2, 0x2a1, 0x2a2, 0x5, 0xc6, 0x64, 0x2, 0x2a2, 
       0x2a4, 0x3, 0x2, 0x2, 0x2, 0x2a3, 0x29f, 0x3, 0x2, 0x2, 0x2, 0x2a4, 
       0x2a7, 0x3, 0x2, 0x2, 0x2, 0x2a5, 0x2a3, 0x3, 0x2, 0x2, 0x2, 0x2a5, 
       0x2a6, 0x3, 0x2, 0x2, 0x2, 0x2a6, 0x2a8, 0x3, 0x2, 0x2, 0x2, 0x2a7, 
       0x2a5, 0x3, 0x2, 0x2, 0x2, 0x2a8, 0x2a9, 0x7, 0x21, 0x2, 0x2, 0x2a9, 
       0x7b, 0x3, 0x2, 0x2, 0x2, 0x2aa, 0x2ab, 0x7, 0x22, 0x2, 0x2, 0x2ab, 
       0x2ac, 0x7, 0x23, 0x2, 0x2, 0x2ac, 0x2ad, 0x5, 0x76, 0x3c, 0x2, 0x2ad, 
       0x7d, 0x3, 0x2, 0x2, 0x2, 0x2ae, 0x2af, 0x7, 0xb, 0x2, 0x2, 0x2af, 
       0x2b0, 0x7, 0x22, 0x2, 0x2, 0x2b0, 0x2b1, 0x5, 0x6c, 0x37, 0x2, 0x2b1, 
       0x2b2, 0x7, 0x23, 0x2, 0x2, 0x2b2, 0x2b3, 0x5, 0x76, 0x3c, 0x2, 0x2b3, 
       0x7f, 0x3, 0x2, 0x2, 0x2, 0x2b4, 0x2ba, 0x7, 0xd, 0x2, 0x2, 0x2b5, 
       0x2b6, 0x7, 0xd, 0x2, 0x2, 0x2b6, 0x2ba, 0x7, 0x44, 0x2, 0x2, 0x2b7, 
       0x2b8, 0x7, 0x44, 0x2, 0x2, 0x2b8, 0x2ba, 0x7, 0xd, 0x2, 0x2, 0x2b9, 
       0x2b4, 0x3, 0x2, 0x2, 0x2, 0x2b9, 0x2b5, 0x3, 0x2, 0x2, 0x2, 0x2b9, 
       0x2b7, 0x3, 0x2, 0x2, 0x2, 0x2ba, 0x2bb, 0x3, 0x2, 0x2, 0x2, 0x2bb, 
       0x2bc, 0x5, 0x76, 0x3c, 0x2, 0x2bc, 0x81, 0x3, 0x2, 0x2, 0x2, 0x2bd, 
       0x2be, 0x7, 0x1d, 0x2, 0x2, 0x2be, 0x2bf, 0x5, 0x8a, 0x46, 0x2, 0x2bf, 
       0x2c0, 0x5, 0x88, 0x45, 0x2, 0x2c0, 0x2c4, 0x3, 0x2, 0x2, 0x2, 0x2c1, 
       0x2c2, 0x7, 0x1d, 0x2, 0x2, 0x2c2, 0x2c4, 0x5, 0x8a, 0x46, 0x2, 0x2c3, 
       0x2bd, 0x3, 0x2, 0x2, 0x2, 0x2c3, 0x2c1, 0x3, 0x2, 0x2, 0x2, 0x2c4, 
       0x83, 0x3, 0x2, 0x2, 0x2, 0x2c5, 0x2c6, 0x7, 0x5, 0x2, 0x2, 0x2c6, 
       0x2c7, 0x5, 0x86, 0x44, 0x2, 0x2c7, 0x85, 0x3, 0x2, 0x2, 0x2, 0x2c8, 
       0x2c9, 0x5, 0x8a, 0x46, 0x2, 0x2c9, 0x2ca, 0x5, 0x88, 0x45, 0x2, 
       0x2ca, 0x2cd, 0x3, 0x2, 0x2, 0x2, 0x2cb, 0x2cd, 0x5, 0x8a, 0x46, 
       0x2, 0x2cc, 0x2c8, 0x3, 0x2, 0x2, 0x2, 0x2cc, 0x2cb, 0x3, 0x2, 0x2, 
       0x2, 0x2cd, 0x87, 0x3, 0x2, 0x2, 0x2, 0x2ce, 0x2d1, 0x5, 0x8a, 0x46, 
       0x2, 0x2cf, 0x2d1, 0x5, 0x6c, 0x37, 0x2, 0x2d0, 0x2ce, 0x3, 0x2, 
       0x2, 0x2, 0x2d0, 0x2cf, 0x3, 0x2, 0x2, 0x2, 0x2d1, 0x89, 0x3, 0x2, 
       0x2, 0x2, 0x2d2, 0x2de, 0x7, 0x1e, 0x2, 0x2, 0x2d3, 0x2d8, 0x5, 0x8c, 
       0x47, 0x2, 0x2d4, 0x2d5, 0x7, 0x25, 0x2, 0x2, 0x2d5, 0x2d7, 0x5, 
       0x8c, 0x47, 0x2, 0x2d6, 0x2d4, 0x3, 0x2, 0x2, 0x2, 0x2d7, 0x2da, 
       0x3, 0x2, 0x2, 0x2, 0x2d8, 0x2d6, 0x3, 0x2, 0x2, 0x2, 0x2d8, 0x2d9, 
       0x3, 0x2, 0x2, 0x2, 0x2d9, 0x2dc, 0x3, 0x2, 0x2, 0x2, 0x2da, 0x2d8, 
       0x3, 0x2, 0x2, 0x2, 0x2db, 0x2dd, 0x7, 0x25, 0x2, 0x2, 0x2dc, 0x2db, 
       0x3, 0x2, 0x2, 0x2, 0x2dc, 0x2dd, 0x3, 0x2, 0x2, 0x2, 0x2dd, 0x2df, 
       0x3, 0x2, 0x2, 0x2, 0x2de, 0x2d3, 0x3, 0x2, 0x2, 0x2, 0x2de, 0x2df, 
       0x3, 0x2, 0x2, 0x2, 0x2df, 0x2e0, 0x3, 0x2, 0x2, 0x2, 0x2e0, 0x2e1, 
       0x7, 0x1f, 0x2, 0x2, 0x2e1, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x2e2, 0x2e4, 
       0x5, 0x12, 0xa, 0x2, 0x2e3, 0x2e2, 0x3, 0x2, 0x2, 0x2, 0x2e3, 0x2e4, 
       0x3, 0x2, 0x2, 0x2, 0x2e4, 0x2e6, 0x3, 0x2, 0x2, 0x2, 0x2e5, 0x2e7, 
       0x7, 0x2e, 0x2, 0x2, 0x2e6, 0x2e5, 0x3, 0x2, 0x2, 0x2, 0x2e6, 0x2e7, 
       0x3, 0x2, 0x2, 0x2, 0x2e7, 0x2e8, 0x3, 0x2, 0x2, 0x2, 0x2e8, 0x2e9, 
       0x5, 0x6c, 0x37, 0x2, 0x2e9, 0x8d, 0x3, 0x2, 0x2, 0x2, 0x2ea, 0x2eb, 
       0x8, 0x48, 0x1, 0x2, 0x2eb, 0x2ef, 0x5, 0x90, 0x49, 0x2, 0x2ec, 0x2ed, 
       0x9, 0x6, 0x2, 0x2, 0x2ed, 0x2ef, 0x5, 0x8e, 0x48, 0x8, 0x2ee, 0x2ea, 
       0x3, 0x2, 0x2, 0x2, 0x2ee, 0x2ec, 0x3, 0x2, 0x2, 0x2, 0x2ef, 0x301, 
       0x3, 0x2, 0x2, 0x2, 0x2f0, 0x2f1, 0xc, 0x7, 0x2, 0x2, 0x2f1, 0x2f2, 
       0x9, 0x7, 0x2, 0x2, 0x2f2, 0x300, 0x5, 0x8e, 0x48, 0x8, 0x2f3, 0x2f4, 
       0xc, 0x6, 0x2, 0x2, 0x2f4, 0x2f5, 0x9, 0x8, 0x2, 0x2, 0x2f5, 0x300, 
       0x5, 0x8e, 0x48, 0x7, 0x2f6, 0x2f7, 0xc, 0x5, 0x2, 0x2, 0x2f7, 0x2f8, 
       0x9, 0x9, 0x2, 0x2, 0x2f8, 0x300, 0x5, 0x8e, 0x48, 0x6, 0x2f9, 0x2fa, 
       0xc, 0x4, 0x2, 0x2, 0x2fa, 0x2fb, 0x7, 0x31, 0x2, 0x2, 0x2fb, 0x300, 
       0x5, 0x8e, 0x48, 0x5, 0x2fc, 0x2fd, 0xc, 0x3, 0x2, 0x2, 0x2fd, 0x2fe, 
       0x7, 0x30, 0x2, 0x2, 0x2fe, 0x300, 0x5, 0x8e, 0x48, 0x4, 0x2ff, 0x2f0, 
       0x3, 0x2, 0x2, 0x2, 0x2ff, 0x2f3, 0x3, 0x2, 0x2, 0x2, 0x2ff, 0x2f6, 
       0x3, 0x2, 0x2, 0x2, 0x2ff, 0x2f9, 0x3, 0x2, 0x2, 0x2, 0x2ff, 0x2fc, 
       0x3, 0x2, 0x2, 0x2, 0x300, 0x303, 0x3, 0x2, 0x2, 0x2, 0x301, 0x2ff, 
       0x3, 0x2, 0x2, 0x2, 0x301, 0x302, 0x3, 0x2, 0x2, 0x2, 0x302, 0x8f, 
       0x3, 0x2, 0x2, 0x2, 0x303, 0x301, 0x3, 0x2, 0x2, 0x2, 0x304, 0x305, 
       0x8, 0x49, 0x1, 0x2, 0x305, 0x309, 0x5, 0x96, 0x4c, 0x2, 0x306, 0x309, 
       0x5, 0x92, 0x4a, 0x2, 0x307, 0x309, 0x5, 0xc2, 0x62, 0x2, 0x308, 
       0x304, 0x3, 0x2, 0x2, 0x2, 0x308, 0x306, 0x3, 0x2, 0x2, 0x2, 0x308, 
       0x307, 0x3, 0x2, 0x2, 0x2, 0x309, 0x315, 0x3, 0x2, 0x2, 0x2, 0x30a, 
       0x311, 0xc, 0x3, 0x2, 0x2, 0x30b, 0x30c, 0x7, 0x2a, 0x2, 0x2, 0x30c, 
       0x312, 0x7, 0x1d, 0x2, 0x2, 0x30d, 0x312, 0x5, 0xba, 0x5e, 0x2, 0x30e, 
       0x312, 0x5, 0xbc, 0x5f, 0x2, 0x30f, 0x312, 0x5, 0xbe, 0x60, 0x2, 
       0x310, 0x312, 0x5, 0xc0, 0x61, 0x2, 0x311, 0x30b, 0x3, 0x2, 0x2, 
       0x2, 0x311, 0x30d, 0x3, 0x2, 0x2, 0x2, 0x311, 0x30e, 0x3, 0x2, 0x2, 
       0x2, 0x311, 0x30f, 0x3, 0x2, 0x2, 0x2, 0x311, 0x310, 0x3, 0x2, 0x2, 
       0x2, 0x312, 0x314, 0x3, 0x2, 0x2, 0x2, 0x313, 0x30a, 0x3, 0x2, 0x2, 
       0x2, 0x314, 0x317, 0x3, 0x2, 0x2, 0x2, 0x315, 0x313, 0x3, 0x2, 0x2, 
       0x2, 0x315, 0x316, 0x3, 0x2, 0x2, 0x2, 0x316, 0x91, 0x3, 0x2, 0x2, 
       0x2, 0x317, 0x315, 0x3, 0x2, 0x2, 0x2, 0x318, 0x319, 0x5, 0x94, 0x4b, 
       0x2, 0x319, 0x31a, 0x7, 0x1e, 0x2, 0x2, 0x31a, 0x31c, 0x5, 0x8e, 
       0x48, 0x2, 0x31b, 0x31d, 0x7, 0x25, 0x2, 0x2, 0x31c, 0x31b, 0x3, 
       0x2, 0x2, 0x2, 0x31c, 0x31d, 0x3, 0x2, 0x2, 0x2, 0x31d, 0x31e, 0x3, 
       0x2, 0x2, 0x2, 0x31e, 0x31f, 0x7, 0x1f, 0x2, 0x2, 0x31f, 0x93, 0x3, 
       0x2, 0x2, 0x2, 0x320, 0x326, 0x5, 0x70, 0x39, 0x2, 0x321, 0x322, 
       0x7, 0x1e, 0x2, 0x2, 0x322, 0x323, 0x5, 0x94, 0x4b, 0x2, 0x323, 0x324, 
       0x7, 0x1f, 0x2, 0x2, 0x324, 0x326, 0x3, 0x2, 0x2, 0x2, 0x325, 0x320, 
       0x3, 0x2, 0x2, 0x2, 0x325, 0x321, 0x3, 0x2, 0x2, 0x2, 0x326, 0x95, 
       0x3, 0x2, 0x2, 0x2, 0x327, 0x32e, 0x5, 0x98, 0x4d, 0x2, 0x328, 0x32e, 
       0x5, 0x9e, 0x50, 0x2, 0x329, 0x32a, 0x7, 0x1e, 0x2, 0x2, 0x32a, 0x32b, 
       0x5, 0x8e, 0x48, 0x2, 0x32b, 0x32c, 0x7, 0x1f, 0x2, 0x2, 0x32c, 0x32e, 
       0x3, 0x2, 0x2, 0x2, 0x32d, 0x327, 0x3, 0x2, 0x2, 0x2, 0x32d, 0x328, 
       0x3, 0x2, 0x2, 0x2, 0x32d, 0x329, 0x3, 0x2, 0x2, 0x2, 0x32e, 0x97, 
       0x3, 0x2, 0x2, 0x2, 0x32f, 0x333, 0x5, 0x9a, 0x4e, 0x2, 0x330, 0x333, 
       0x5, 0xa2, 0x52, 0x2, 0x331, 0x333, 0x5, 0xb8, 0x5d, 0x2, 0x332, 
       0x32f, 0x3, 0x2, 0x2, 0x2, 0x332, 0x330, 0x3, 0x2, 0x2, 0x2, 0x332, 
       0x331, 0x3, 0x2, 0x2, 0x2, 0x333, 0x99, 0x3, 0x2, 0x2, 0x2, 0x334, 
       0x339, 0x7, 0x1c, 0x2, 0x2, 0x335, 0x339, 0x5, 0x9c, 0x4f, 0x2, 0x336, 
       0x339, 0x5, 0xb4, 0x5b, 0x2, 0x337, 0x339, 0x7, 0x49, 0x2, 0x2, 0x338, 
       0x334, 0x3, 0x2, 0x2, 0x2, 0x338, 0x335, 0x3, 0x2, 0x2, 0x2, 0x338, 
       0x336, 0x3, 0x2, 0x2, 0x2, 0x338, 0x337, 0x3, 0x2, 0x2, 0x2, 0x339, 
       0x9b, 0x3, 0x2, 0x2, 0x2, 0x33a, 0x33b, 0x9, 0xa, 0x2, 0x2, 0x33b, 
       0x9d, 0x3, 0x2, 0x2, 0x2, 0x33c, 0x33d, 0x7, 0x1d, 0x2, 0x2, 0x33d, 
       0x9f, 0x3, 0x2, 0x2, 0x2, 0x33e, 0x33f, 0x7, 0x1d, 0x2, 0x2, 0x33f, 
       0x340, 0x7, 0x2a, 0x2, 0x2, 0x340, 0x341, 0x7, 0x1d, 0x2, 0x2, 0x341, 
       0xa1, 0x3, 0x2, 0x2, 0x2, 0x342, 0x343, 0x5, 0xa4, 0x53, 0x2, 0x343, 
       0x344, 0x5, 0xa6, 0x54, 0x2, 0x344, 0xa3, 0x3, 0x2, 0x2, 0x2, 0x345, 
       0x34f, 0x5, 0xb0, 0x59, 0x2, 0x346, 0x34f, 0x5, 0x72, 0x3a, 0x2, 
       0x347, 0x348, 0x7, 0x22, 0x2, 0x2, 0x348, 0x349, 0x7, 0x2e, 0x2, 
       0x2, 0x349, 0x34a, 0x7, 0x23, 0x2, 0x2, 0x34a, 0x34f, 0x5, 0x76, 
       0x3c, 0x2, 0x34b, 0x34f, 0x5, 0x7c, 0x3f, 0x2, 0x34c, 0x34f, 0x5, 
       0x7e, 0x40, 0x2, 0x34d, 0x34f, 0x5, 0x6e, 0x38, 0x2, 0x34e, 0x345, 
       0x3, 0x2, 0x2, 0x2, 0x34e, 0x346, 0x3, 0x2, 0x2, 0x2, 0x34e, 0x347, 
       0x3, 0x2, 0x2, 0x2, 0x34e, 0x34b, 0x3, 0x2, 0x2, 0x2, 0x34e, 0x34c, 
       0x3, 0x2, 0x2, 0x2, 0x34e, 0x34d, 0x3, 0x2, 0x2, 0x2, 0x34f, 0xa5, 
       0x3, 0x2, 0x2, 0x2, 0x350, 0x355, 0x7, 0x20, 0x2, 0x2, 0x351, 0x353, 
       0x5, 0xa8, 0x55, 0x2, 0x352, 0x354, 0x7, 0x25, 0x2, 0x2, 0x353, 0x352, 
       0x3, 0x2, 0x2, 0x2, 0x353, 0x354, 0x3, 0x2, 0x2, 0x2, 0x354, 0x356, 
       0x3, 0x2, 0x2, 0x2, 0x355, 0x351, 0x3, 0x2, 0x2, 0x2, 0x355, 0x356, 
       0x3, 0x2, 0x2, 0x2, 0x356, 0x357, 0x3, 0x2, 0x2, 0x2, 0x357, 0x358, 
       0x7, 0x21, 0x2, 0x2, 0x358, 0xa7, 0x3, 0x2, 0x2, 0x2, 0x359, 0x35e, 
       0x5, 0xaa, 0x56, 0x2, 0x35a, 0x35b, 0x7, 0x25, 0x2, 0x2, 0x35b, 0x35d, 
       0x5, 0xaa, 0x56, 0x2, 0x35c, 0x35a, 0x3, 0x2, 0x2, 0x2, 0x35d, 0x360, 
       0x3, 0x2, 0x2, 0x2, 0x35e, 0x35c, 0x3, 0x2, 0x2, 0x2, 0x35e, 0x35f, 
       0x3, 0x2, 0x2, 0x2, 0x35f, 0xa9, 0x3, 0x2, 0x2, 0x2, 0x360, 0x35e, 
       0x3, 0x2, 0x2, 0x2, 0x361, 0x362, 0x5, 0xac, 0x57, 0x2, 0x362, 0x363, 
       0x7, 0x29, 0x2, 0x2, 0x363, 0x365, 0x3, 0x2, 0x2, 0x2, 0x364, 0x361, 
       0x3, 0x2, 0x2, 0x2, 0x364, 0x365, 0x3, 0x2, 0x2, 0x2, 0x365, 0x366, 
       0x3, 0x2, 0x2, 0x2, 0x366, 0x367, 0x5, 0xae, 0x58, 0x2, 0x367, 0xab, 
       0x3, 0x2, 0x2, 0x2, 0x368, 0x36b, 0x5, 0x8e, 0x48, 0x2, 0x369, 0x36b, 
       0x5, 0xa6, 0x54, 0x2, 0x36a, 0x368, 0x3, 0x2, 0x2, 0x2, 0x36a, 0x369, 
       0x3, 0x2, 0x2, 0x2, 0x36b, 0xad, 0x3, 0x2, 0x2, 0x2, 0x36c, 0x36f, 
       0x5, 0x8e, 0x48, 0x2, 0x36d, 0x36f, 0x5, 0xa6, 0x54, 0x2, 0x36e, 
       0x36c, 0x3, 0x2, 0x2, 0x2, 0x36e, 0x36d, 0x3, 0x2, 0x2, 0x2, 0x36f, 
       0xaf, 0x3, 0x2, 0x2, 0x2, 0x370, 0x371, 0x7, 0xc, 0x2, 0x2, 0x371, 
       0x377, 0x7, 0x20, 0x2, 0x2, 0x372, 0x373, 0x5, 0xb2, 0x5a, 0x2, 0x373, 
       0x374, 0x5, 0xc6, 0x64, 0x2, 0x374, 0x376, 0x3, 0x2, 0x2, 0x2, 0x375, 
       0x372, 0x3, 0x2, 0x2, 0x2, 0x376, 0x379, 0x3, 0x2, 0x2, 0x2, 0x377, 
       0x375, 0x3, 0x2, 0x2, 0x2, 0x377, 0x378, 0x3, 0x2, 0x2, 0x2, 0x378, 
       0x37a, 0x3, 0x2, 0x2, 0x2, 0x379, 0x377, 0x3, 0x2, 0x2, 0x2, 0x37a, 
       0x37b, 0x7, 0x21, 0x2, 0x2, 0x37b, 0xb1, 0x3, 0x2, 0x2, 0x2, 0x37c, 
       0x37d, 0x5, 0x12, 0xa, 0x2, 0x37d, 0x37e, 0x5, 0x6c, 0x37, 0x2, 0x37e, 
       0x381, 0x3, 0x2, 0x2, 0x2, 0x37f, 0x381, 0x5, 0xb6, 0x5c, 0x2, 0x380, 
       0x37c, 0x3, 0x2, 0x2, 0x2, 0x380, 0x37f, 0x3, 0x2, 0x2, 0x2, 0x381, 
       0x383, 0x3, 0x2, 0x2, 0x2, 0x382, 0x384, 0x5, 0xb4, 0x5b, 0x2, 0x383, 
       0x382, 0x3, 0x2, 0x2, 0x2, 0x383, 0x384, 0x3, 0x2, 0x2, 0x2, 0x384, 
       0xb3, 0x3, 0x2, 0x2, 0x2, 0x385, 0x386, 0x9, 0xb, 0x2, 0x2, 0x386, 
       0xb5, 0x3, 0x2, 0x2, 0x2, 0x387, 0x389, 0x7, 0x42, 0x2, 0x2, 0x388, 
       0x387, 0x3, 0x2, 0x2, 0x2, 0x388, 0x389, 0x3, 0x2, 0x2, 0x2, 0x389, 
       0x38a, 0x3, 0x2, 0x2, 0x2, 0x38a, 0x38b, 0x5, 0x6e, 0x38, 0x2, 0x38b, 
       0xb7, 0x3, 0x2, 0x2, 0x2, 0x38c, 0x38d, 0x7, 0x5, 0x2, 0x2, 0x38d, 
       0x38e, 0x5, 0x86, 0x44, 0x2, 0x38e, 0x38f, 0x5, 0x24, 0x13, 0x2, 
       0x38f, 0xb9, 0x3, 0x2, 0x2, 0x2, 0x390, 0x391, 0x7, 0x22, 0x2, 0x2, 
       0x391, 0x392, 0x5, 0x8e, 0x48, 0x2, 0x392, 0x393, 0x7, 0x23, 0x2, 
       0x2, 0x393, 0xbb, 0x3, 0x2, 0x2, 0x2, 0x394, 0x3a4, 0x7, 0x22, 0x2, 
       0x2, 0x395, 0x397, 0x5, 0x8e, 0x48, 0x2, 0x396, 0x395, 0x3, 0x2, 
       0x2, 0x2, 0x396, 0x397, 0x3, 0x2, 0x2, 0x2, 0x397, 0x398, 0x3, 0x2, 
       0x2, 0x2, 0x398, 0x39a, 0x7, 0x29, 0x2, 0x2, 0x399, 0x39b, 0x5, 0x8e, 
       0x48, 0x2, 0x39a, 0x399, 0x3, 0x2, 0x2, 0x2, 0x39a, 0x39b, 0x3, 0x2, 
       0x2, 0x2, 0x39b, 0x3a5, 0x3, 0x2, 0x2, 0x2, 0x39c, 0x39e, 0x5, 0x8e, 
       0x48, 0x2, 0x39d, 0x39c, 0x3, 0x2, 0x2, 0x2, 0x39d, 0x39e, 0x3, 0x2, 
       0x2, 0x2, 0x39e, 0x39f, 0x3, 0x2, 0x2, 0x2, 0x39f, 0x3a0, 0x7, 0x29, 
       0x2, 0x2, 0x3a0, 0x3a1, 0x5, 0x8e, 0x48, 0x2, 0x3a1, 0x3a2, 0x7, 
       0x29, 0x2, 0x2, 0x3a2, 0x3a3, 0x5, 0x8e, 0x48, 0x2, 0x3a3, 0x3a5, 
       0x3, 0x2, 0x2, 0x2, 0x3a4, 0x396, 0x3, 0x2, 0x2, 0x2, 0x3a4, 0x39d, 
       0x3, 0x2, 0x2, 0x2, 0x3a5, 0x3a6, 0x3, 0x2, 0x2, 0x2, 0x3a6, 0x3a7, 
       0x7, 0x23, 0x2, 0x2, 0x3a7, 0xbd, 0x3, 0x2, 0x2, 0x2, 0x3a8, 0x3a9, 
       0x7, 0x2a, 0x2, 0x2, 0x3a9, 0x3aa, 0x7, 0x1e, 0x2, 0x2, 0x3aa, 0x3ab, 
       0x5, 0x6c, 0x37, 0x2, 0x3ab, 0x3ac, 0x7, 0x1f, 0x2, 0x2, 0x3ac, 0xbf, 
       0x3, 0x2, 0x2, 0x2, 0x3ad, 0x3bc, 0x7, 0x1e, 0x2, 0x2, 0x3ae, 0x3b5, 
       0x5, 0x14, 0xb, 0x2, 0x3af, 0x3b2, 0x5, 0x94, 0x4b, 0x2, 0x3b0, 0x3b1, 
       0x7, 0x25, 0x2, 0x2, 0x3b1, 0x3b3, 0x5, 0x14, 0xb, 0x2, 0x3b2, 0x3b0, 
       0x3, 0x2, 0x2, 0x2, 0x3b2, 0x3b3, 0x3, 0x2, 0x2, 0x2, 0x3b3, 0x3b5, 
       0x3, 0x2, 0x2, 0x2, 0x3b4, 0x3ae, 0x3, 0x2, 0x2, 0x2, 0x3b4, 0x3af, 
       0x3, 0x2, 0x2, 0x2, 0x3b5, 0x3b7, 0x3, 0x2, 0x2, 0x2, 0x3b6, 0x3b8, 
       0x7, 0x2e, 0x2, 0x2, 0x3b7, 0x3b6, 0x3, 0x2, 0x2, 0x2, 0x3b7, 0x3b8, 
       0x3, 0x2, 0x2, 0x2, 0x3b8, 0x3ba, 0x3, 0x2, 0x2, 0x2, 0x3b9, 0x3bb, 
       0x7, 0x25, 0x2, 0x2, 0x3ba, 0x3b9, 0x3, 0x2, 0x2, 0x2, 0x3ba, 0x3bb, 
       0x3, 0x2, 0x2, 0x2, 0x3bb, 0x3bd, 0x3, 0x2, 0x2, 0x2, 0x3bc, 0x3b4, 
       0x3, 0x2, 0x2, 0x2, 0x3bc, 0x3bd, 0x3, 0x2, 0x2, 0x2, 0x3bd, 0x3be, 
       0x3, 0x2, 0x2, 0x2, 0x3be, 0x3bf, 0x7, 0x1f, 0x2, 0x2, 0x3bf, 0xc1, 
       0x3, 0x2, 0x2, 0x2, 0x3c0, 0x3c1, 0x5, 0x94, 0x4b, 0x2, 0x3c1, 0x3c2, 
       0x7, 0x2a, 0x2, 0x2, 0x3c2, 0x3c3, 0x7, 0x1d, 0x2, 0x2, 0x3c3, 0xc3, 
       0x3, 0x2, 0x2, 0x2, 0x3c4, 0x3c5, 0x5, 0x6c, 0x37, 0x2, 0x3c5, 0xc5, 
       0x3, 0x2, 0x2, 0x2, 0x3c6, 0x3c7, 0x9, 0xc, 0x2, 0x2, 0x3c7, 0xc7, 
       0x3, 0x2, 0x2, 0x2, 0x70, 0xcc, 0xd3, 0xd8, 0xde, 0xe3, 0xe8, 0xf8, 
       0xfc, 0xff, 0x108, 0x112, 0x116, 0x11a, 0x11e, 0x125, 0x12d, 0x138, 
       0x13c, 0x140, 0x148, 0x14f, 0x15b, 0x15f, 0x165, 0x169, 0x16f, 0x173, 
       0x17b, 0x17f, 0x190, 0x197, 0x1a7, 0x1b4, 0x1b8, 0x1bc, 0x1c0, 0x1d3, 
       0x1d9, 0x1db, 0x1df, 0x1e3, 0x1e6, 0x1ea, 0x1ec, 0x1f2, 0x1fa, 0x1ff, 
       0x20a, 0x210, 0x217, 0x222, 0x227, 0x22b, 0x230, 0x234, 0x23c, 0x244, 
       0x249, 0x24c, 0x254, 0x25c, 0x261, 0x265, 0x269, 0x271, 0x27f, 0x283, 
       0x28d, 0x29f, 0x2a5, 0x2b9, 0x2c3, 0x2cc, 0x2d0, 0x2d8, 0x2dc, 0x2de, 
       0x2e3, 0x2e6, 0x2ee, 0x2ff, 0x301, 0x308, 0x311, 0x315, 0x31c, 0x325, 
       0x32d, 0x332, 0x338, 0x34e, 0x353, 0x355, 0x35e, 0x364, 0x36a, 0x36e, 
       0x377, 0x380, 0x383, 0x388, 0x396, 0x39a, 0x39d, 0x3a4, 0x3b2, 0x3b4, 
       0x3b7, 0x3ba, 0x3bc, 
  };

  _serializedATN.insert(_serializedATN.end(), serializedATNSegment0,
    serializedATNSegment0 + sizeof(serializedATNSegment0) / sizeof(serializedATNSegment0[0]));


  atn::ATNDeserializer deserializer;
  _atn = deserializer.deserialize(_serializedATN);

  size_t count = _atn.getNumberOfDecisions();
  _decisionToDFA.reserve(count);
  for (size_t i = 0; i < count; i++) { 
    _decisionToDFA.emplace_back(_atn.getDecisionState(i), i);
  }
}

GoParser::Initializer GoParser::_init;
