COMMA() { return getTokens(GoParser.COMMA); }
+ public TerminalNode COMMA(int i) {
+ return getToken(GoParser.COMMA, i);
+ }
+ public ArgumentsContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_arguments; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).enterArguments(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).exitArguments(this);
+ }
+ }
+
+ public final ArgumentsContext arguments() throws RecognitionException {
+ ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState());
+ enterRule(_localctx, 202, RULE_arguments);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(993);
+ match(L_PAREN);
+ setState(1008);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FUNC) | (1L << INTERFACE) | (1L << MAP) | (1L << STRUCT) | (1L << CHAN) | (1L << NIL_LIT) | (1L << IDENTIFIER) | (1L << L_PAREN) | (1L << L_BRACKET) | (1L << EXCLAMATION) | (1L << PLUS) | (1L << MINUS) | (1L << CARET) | (1L << STAR) | (1L << AMPERSAND))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (RECEIVE - 64)) | (1L << (DECIMAL_LIT - 64)) | (1L << (BINARY_LIT - 64)) | (1L << (OCTAL_LIT - 64)) | (1L << (HEX_LIT - 64)) | (1L << (FLOAT_LIT - 64)) | (1L << (IMAGINARY_LIT - 64)) | (1L << (RUNE_LIT - 64)) | (1L << (RAW_STRING_LIT - 64)) | (1L << (INTERPRETED_STRING_LIT - 64)))) != 0)) {
+ {
+ setState(1000);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
+ case 1:
+ {
+ setState(994);
+ expressionList();
+ }
+ break;
+ case 2:
+ {
+ setState(995);
+ type_();
+ setState(998);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
+ case 1:
+ {
+ setState(996);
+ match(COMMA);
+ setState(997);
+ expressionList();
+ }
+ break;
+ }
+ }
+ break;
+ }
+ setState(1003);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==ELLIPSIS) {
+ {
+ setState(1002);
+ match(ELLIPSIS);
+ }
+ }
+
+ setState(1006);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ if (_la==COMMA) {
+ {
+ setState(1005);
+ match(COMMA);
+ }
+ }
+
+ }
+ }
+
+ setState(1010);
+ match(R_PAREN);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class MethodExprContext extends ParserRuleContext {
+ public Type_Context type_() {
+ return getRuleContext(Type_Context.class,0);
+ }
+ public TerminalNode DOT() { return getToken(GoParser.DOT, 0); }
+ public TerminalNode IDENTIFIER() { return getToken(GoParser.IDENTIFIER, 0); }
+ public MethodExprContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_methodExpr; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).enterMethodExpr(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).exitMethodExpr(this);
+ }
+ }
+
+ public final MethodExprContext methodExpr() throws RecognitionException {
+ MethodExprContext _localctx = new MethodExprContext(_ctx, getState());
+ enterRule(_localctx, 204, RULE_methodExpr);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1012);
+ type_();
+ setState(1013);
+ match(DOT);
+ setState(1014);
+ match(IDENTIFIER);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class EosContext extends ParserRuleContext {
+ public TerminalNode SEMI() { return getToken(GoParser.SEMI, 0); }
+ public TerminalNode EOF() { return getToken(GoParser.EOF, 0); }
+ public TerminalNode EOS() { return getToken(GoParser.EOS, 0); }
+ public EosContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_eos; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).enterEos(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof GoParserListener) ((GoParserListener)listener).exitEos(this);
+ }
+ }
+
+ public final EosContext eos() throws RecognitionException {
+ EosContext _localctx = new EosContext(_ctx, getState());
+ enterRule(_localctx, 206, RULE_eos);
+ try {
+ setState(1020);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
+ case 1:
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(1016);
+ match(SEMI);
+ }
+ break;
+ case 2:
+ enterOuterAlt(_localctx, 2);
+ {
+ setState(1017);
+ match(EOF);
+ }
+ break;
+ case 3:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(1018);
+ match(EOS);
+ }
+ break;
+ case 4:
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(1019);
+ if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()");
+ }
+ break;
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
+ switch (ruleIndex) {
+ case 25:
+ return statementList_sempred((StatementListContext)_localctx, predIndex);
+ case 77:
+ return expression_sempred((ExpressionContext)_localctx, predIndex);
+ case 78:
+ return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex);
+ case 103:
+ return eos_sempred((EosContext)_localctx, predIndex);
+ }
+ return true;
+ }
+ private boolean statementList_sempred(StatementListContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 0:
+ return this.closingBracket();
+ }
+ return true;
+ }
+ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 1:
+ return precpred(_ctx, 5);
+ case 2:
+ return precpred(_ctx, 4);
+ case 3:
+ return precpred(_ctx, 3);
+ case 4:
+ return precpred(_ctx, 2);
+ case 5:
+ return precpred(_ctx, 1);
+ }
+ return true;
+ }
+ private boolean primaryExpr_sempred(PrimaryExprContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 6:
+ return precpred(_ctx, 1);
+ }
+ return true;
+ }
+ private boolean eos_sempred(EosContext _localctx, int predIndex) {
+ switch (predIndex) {
+ case 7:
+ return this.closingBracket();
+ }
+ return true;
+ }
+
+ public static final String _serializedATN =
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\\\u0401\4\2\t\2\4"+
+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
+ "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
+ "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\3\2\3\2\3\2"+
+ "\3\2\3\2\7\2\u00d8\n\2\f\2\16\2\u00db\13\2\3\2\3\2\3\2\5\2\u00e0\n\2\3"+
+ "\2\3\2\7\2\u00e4\n\2\f\2\16\2\u00e7\13\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3"+
+ "\4\3\4\3\4\3\4\7\4\u00f4\n\4\f\4\16\4\u00f7\13\4\3\4\5\4\u00fa\n\4\3\5"+
+ "\5\5\u00fd\n\5\3\5\3\5\3\6\3\6\3\7\3\7\3\7\5\7\u0106\n\7\3\b\3\b\3\b\3"+
+ "\b\3\b\3\b\7\b\u010e\n\b\f\b\16\b\u0111\13\b\3\b\5\b\u0114\n\b\3\t\3\t"+
+ "\5\t\u0118\n\t\3\t\3\t\5\t\u011c\n\t\3\n\3\n\3\n\7\n\u0121\n\n\f\n\16"+
+ "\n\u0124\13\n\3\13\3\13\3\13\7\13\u0129\n\13\f\13\16\13\u012c\13\13\3"+
+ "\f\3\f\3\r\7\r\u0131\n\r\f\r\16\r\u0134\13\r\3\r\3\r\3\r\3\r\3\r\3\r\7"+
+ "\r\u013c\n\r\f\r\16\r\u013f\13\r\3\r\5\r\u0142\n\r\3\16\3\16\5\16\u0146"+
+ "\n\16\3\17\3\17\3\17\3\17\3\20\3\20\5\20\u014e\n\20\3\20\3\20\3\21\3\21"+
+ "\3\21\3\21\7\21\u0156\n\21\f\21\16\21\u0159\13\21\3\21\3\21\3\22\3\22"+
+ "\3\22\3\23\3\23\3\23\7\23\u0163\n\23\f\23\16\23\u0166\13\23\3\24\5\24"+
+ "\u0169\n\24\3\24\3\24\3\25\3\25\3\25\5\25\u0170\n\25\3\25\3\25\5\25\u0174"+
+ "\n\25\3\26\3\26\3\26\3\26\3\26\5\26\u017b\n\26\3\27\3\27\3\30\3\30\3\30"+
+ "\3\30\3\30\3\30\7\30\u0185\n\30\f\30\16\30\u0188\13\30\3\30\5\30\u018b"+
+ "\n\30\3\31\3\31\3\31\3\31\5\31\u0191\n\31\3\31\3\31\5\31\u0195\n\31\3"+
+ "\32\3\32\5\32\u0199\n\32\3\32\3\32\3\33\5\33\u019e\n\33\3\33\5\33\u01a1"+
+ "\n\33\3\33\5\33\u01a4\n\33\3\33\3\33\3\33\6\33\u01a9\n\33\r\33\16\33\u01aa"+
+ "\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
+ "\3\34\5\34\u01bc\n\34\3\35\3\35\3\35\3\35\3\35\5\35\u01c3\n\35\3\36\3"+
+ "\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\5\"\u01d3\n\"\3\"\3\""+
+ "\3#\3#\3#\3#\3$\3$\3$\5$\u01de\n$\3%\3%\5%\u01e2\n%\3&\3&\5&\u01e6\n&"+
+ "\3\'\3\'\5\'\u01ea\n\'\3(\3(\3(\3)\3)\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3"+
+ "+\3+\5+\u01fd\n+\3+\3+\3+\3+\5+\u0203\n+\5+\u0205\n+\3,\3,\5,\u0209\n"+
+ ",\3-\3-\5-\u020d\n-\3-\5-\u0210\n-\3-\3-\5-\u0214\n-\5-\u0216\n-\3-\3"+
+ "-\7-\u021a\n-\f-\16-\u021d\13-\3-\3-\3.\3.\3.\5.\u0224\n.\3/\3/\3/\5/"+
+ "\u0229\n/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u0234\n\60"+
+ "\3\60\3\60\7\60\u0238\n\60\f\60\16\60\u023b\13\60\3\60\3\60\3\61\3\61"+
+ "\5\61\u0241\n\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\5\62\u024c"+
+ "\n\62\3\63\3\63\3\63\5\63\u0251\n\63\3\64\3\64\5\64\u0255\n\64\3\64\3"+
+ "\64\3\64\5\64\u025a\n\64\7\64\u025c\n\64\f\64\16\64\u025f\13\64\3\65\3"+
+ "\65\3\65\7\65\u0264\n\65\f\65\16\65\u0267\13\65\3\65\3\65\3\66\3\66\3"+
+ "\66\5\66\u026e\n\66\3\67\3\67\3\67\5\67\u0273\n\67\3\67\5\67\u0276\n\67"+
+ "\38\38\38\38\38\38\58\u027e\n8\38\38\39\39\59\u0284\n9\39\39\59\u0288"+
+ "\n9\59\u028a\n9\39\39\3:\5:\u028f\n:\3:\3:\5:\u0293\n:\3:\3:\5:\u0297"+
+ "\n:\3;\3;\3;\3;\3;\3;\5;\u029f\n;\3;\3;\3;\3<\3<\3<\3=\3=\5=\u02a9\n="+
+ "\3=\3=\3=\3=\3=\5=\u02b0\n=\3>\3>\3>\5>\u02b5\n>\3>\3>\3?\3?\5?\u02bb"+
+ "\n?\3@\3@\3@\3@\3@\3@\3@\3@\5@\u02c5\n@\3A\3A\3A\3A\3A\3B\3B\3C\3C\3D"+
+ "\3D\3D\3E\3E\3E\3E\5E\u02d7\nE\3E\3E\7E\u02db\nE\fE\16E\u02de\13E\3E\3"+
+ "E\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\5H\u02f1\nH\3H\3H\3I\3"+
+ "I\3I\3I\3I\3I\5I\u02fb\nI\3J\3J\3J\3K\3K\5K\u0302\nK\3L\3L\5L\u0306\n"+
+ "L\3M\3M\3M\3M\7M\u030c\nM\fM\16M\u030f\13M\3M\5M\u0312\nM\5M\u0314\nM"+
+ "\3M\3M\3N\5N\u0319\nN\3N\5N\u031c\nN\3N\3N\3O\3O\3O\3O\5O\u0324\nO\3O"+
+ "\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\7O\u0335\nO\fO\16O\u0338\13"+
+ "O\3P\3P\3P\3P\5P\u033e\nP\3P\3P\3P\3P\3P\3P\3P\5P\u0347\nP\7P\u0349\n"+
+ "P\fP\16P\u034c\13P\3Q\3Q\3Q\3Q\5Q\u0352\nQ\3Q\3Q\3R\3R\3R\5R\u0359\nR"+
+ "\3R\3R\3R\3R\5R\u035f\nR\3S\3S\3S\5S\u0364\nS\3T\3T\3T\3T\5T\u036a\nT"+
+ "\3U\3U\3V\3V\3W\3W\3W\3W\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\5Y\u0381"+
+ "\nY\5Y\u0383\nY\3Z\3Z\3Z\5Z\u0388\nZ\5Z\u038a\nZ\3Z\3Z\3[\3[\3[\7[\u0391"+
+ "\n[\f[\16[\u0394\13[\3\\\3\\\3\\\5\\\u0399\n\\\3\\\3\\\3]\3]\5]\u039f"+
+ "\n]\3^\3^\5^\u03a3\n^\3_\3_\3_\3_\3_\7_\u03aa\n_\f_\16_\u03ad\13_\3_\3"+
+ "_\3`\3`\3`\3`\5`\u03b5\n`\3`\5`\u03b8\n`\3a\3a\3b\5b\u03bd\nb\3b\3b\5"+
+ "b\u03c1\nb\3c\3c\3c\3c\3d\3d\3d\3d\3e\3e\5e\u03cd\ne\3e\3e\5e\u03d1\n"+
+ "e\3e\5e\u03d4\ne\3e\3e\3e\3e\3e\5e\u03db\ne\3e\3e\3f\3f\3f\3f\3f\3g\3"+
+ "g\3g\3g\3g\5g\u03e9\ng\5g\u03eb\ng\3g\5g\u03ee\ng\3g\5g\u03f1\ng\5g\u03f3"+
+ "\ng\3g\3g\3h\3h\3h\3h\3i\3i\3i\3i\5i\u03ff\ni\3i\2\4\u009c\u009ej\2\4"+
+ "\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNP"+
+ "RTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+
+ "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+
+ "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+
+ "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\2\f\4\2\35\35("+
+ "(\4\2TTVV\3\2)*\4\2\65:=A\3\2\u01ca\3\2\2\2@\u01cd\3\2\2\2B\u01d2\3\2\2\2D\u01d6\3\2\2\2F\u01da"+
+ "\3\2\2\2H\u01df\3\2\2\2J\u01e3\3\2\2\2L\u01e7\3\2\2\2N\u01eb\3\2\2\2P"+
+ "\u01ee\3\2\2\2R\u01f0\3\2\2\2T\u01f3\3\2\2\2V\u0208\3\2\2\2X\u020a\3\2"+
+ "\2\2Z\u0220\3\2\2\2\\\u0228\3\2\2\2^\u022a\3\2\2\2`\u0240\3\2\2\2b\u0248"+
+ "\3\2\2\2d\u0250\3\2\2\2f\u0254\3\2\2\2h\u0260\3\2\2\2j\u026a\3\2\2\2l"+
+ "\u0275\3\2\2\2n\u027d\3\2\2\2p\u0281\3\2\2\2r\u028e\3\2\2\2t\u029e\3\2"+
+ "\2\2v\u02a3\3\2\2\2x\u02af\3\2\2\2z\u02b1\3\2\2\2|\u02ba\3\2\2\2~\u02c4"+
+ "\3\2\2\2\u0080\u02c6\3\2\2\2\u0082\u02cb\3\2\2\2\u0084\u02cd\3\2\2\2\u0086"+
+ "\u02cf\3\2\2\2\u0088\u02d2\3\2\2\2\u008a\u02e1\3\2\2\2\u008c\u02e5\3\2"+
+ "\2\2\u008e\u02f0\3\2\2\2\u0090\u02fa\3\2\2\2\u0092\u02fc\3\2\2\2\u0094"+
+ "\u02ff\3\2\2\2\u0096\u0305\3\2\2\2\u0098\u0307\3\2\2\2\u009a\u0318\3\2"+
+ "\2\2\u009c\u0323\3\2\2\2\u009e\u033d\3\2\2\2\u00a0\u034d\3\2\2\2\u00a2"+
+ "\u035e\3\2\2\2\u00a4\u0363\3\2\2\2\u00a6\u0369\3\2\2\2\u00a8\u036b\3\2"+
+ "\2\2\u00aa\u036d\3\2\2\2\u00ac\u036f\3\2\2\2\u00ae\u0373\3\2\2\2\u00b0"+
+ "\u0382\3\2\2\2\u00b2\u0384\3\2\2\2\u00b4\u038d\3\2\2\2\u00b6\u0398\3\2"+
+ "\2\2\u00b8\u039e\3\2\2\2\u00ba\u03a2\3\2\2\2\u00bc\u03a4\3\2\2\2\u00be"+
+ "\u03b4\3\2\2\2\u00c0\u03b9\3\2\2\2\u00c2\u03bc\3\2\2\2\u00c4\u03c2\3\2"+
+ "\2\2\u00c6\u03c6\3\2\2\2\u00c8\u03ca\3\2\2\2\u00ca\u03de\3\2\2\2\u00cc"+
+ "\u03e3\3\2\2\2\u00ce\u03f6\3\2\2\2\u00d0\u03fe\3\2\2\2\u00d2\u00d3\5\4"+
+ "\3\2\u00d3\u00d9\5\u00d0i\2\u00d4\u00d5\5\6\4\2\u00d5\u00d6\5\u00d0i\2"+
+ "\u00d6\u00d8\3\2\2\2\u00d7\u00d4\3\2\2\2\u00d8\u00db\3\2\2\2\u00d9\u00d7"+
+ "\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00e5\3\2\2\2\u00db\u00d9\3\2\2\2\u00dc"+
+ "\u00e0\5(\25\2\u00dd\u00e0\5*\26\2\u00de\u00e0\5\f\7\2\u00df\u00dc\3\2"+
+ "\2\2\u00df\u00dd\3\2\2\2\u00df\u00de\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1"+
+ "\u00e2\5\u00d0i\2\u00e2\u00e4\3\2\2\2\u00e3\u00df\3\2\2\2\u00e4\u00e7"+
+ "\3\2\2\2\u00e5\u00e3\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00e8\3\2\2\2\u00e7"+
+ "\u00e5\3\2\2\2\u00e8\u00e9\7\2\2\3\u00e9\3\3\2\2\2\u00ea\u00eb\7\20\2"+
+ "\2\u00eb\u00ec\7\35\2\2\u00ec\5\3\2\2\2\u00ed\u00f9\7\31\2\2\u00ee\u00fa"+
+ "\5\b\5\2\u00ef\u00f5\7\36\2\2\u00f0\u00f1\5\b\5\2\u00f1\u00f2\5\u00d0"+
+ "i\2\u00f2\u00f4\3\2\2\2\u00f3\u00f0\3\2\2\2\u00f4\u00f7\3\2\2\2\u00f5"+
+ "\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f8\3\2\2\2\u00f7\u00f5\3\2"+
+ "\2\2\u00f8\u00fa\7\37\2\2\u00f9\u00ee\3\2\2\2\u00f9\u00ef\3\2\2\2\u00fa"+
+ "\7\3\2\2\2\u00fb\u00fd\t\2\2\2\u00fc\u00fb\3\2\2\2\u00fc\u00fd\3\2\2\2"+
+ "\u00fd\u00fe\3\2\2\2\u00fe\u00ff\5\n\6\2\u00ff\t\3\2\2\2\u0100\u0101\5"+
+ "\u00c0a\2\u0101\13\3\2\2\2\u0102\u0106\5\16\b\2\u0103\u0106\5\30\r\2\u0104"+
+ "\u0106\5.\30\2\u0105\u0102\3\2\2\2\u0105\u0103\3\2\2\2\u0105\u0104\3\2"+
+ "\2\2\u0106\r\3\2\2\2\u0107\u0113\7\22\2\2\u0108\u0114\5\20\t\2\u0109\u010f"+
+ "\7\36\2\2\u010a\u010b\5\20\t\2\u010b\u010c\5\u00d0i\2\u010c\u010e\3\2"+
+ "\2\2\u010d\u010a\3\2\2\2\u010e\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f"+
+ "\u0110\3\2\2\2\u0110\u0112\3\2\2\2\u0111\u010f\3\2\2\2\u0112\u0114\7\37"+
+ "\2\2\u0113\u0108\3\2\2\2\u0113\u0109\3\2\2\2\u0114\17\3\2\2\2\u0115\u011b"+
+ "\5\22\n\2\u0116\u0118\5x=\2\u0117\u0116\3\2\2\2\u0117\u0118\3\2\2\2\u0118"+
+ "\u0119\3\2\2\2\u0119\u011a\7$\2\2\u011a\u011c\5\24\13\2\u011b\u0117\3"+
+ "\2\2\2\u011b\u011c\3\2\2\2\u011c\21\3\2\2\2\u011d\u0122\7\35\2\2\u011e"+
+ "\u011f\7%\2\2\u011f\u0121\7\35\2\2\u0120\u011e\3\2\2\2\u0121\u0124\3\2"+
+ "\2\2\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123\23\3\2\2\2\u0124\u0122"+
+ "\3\2\2\2\u0125\u012a\5\u009cO\2\u0126\u0127\7%\2\2\u0127\u0129\5\u009c"+
+ "O\2\u0128\u0126\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2\2\2\u012a"+
+ "\u012b\3\2\2\2\u012b\25\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u012e\t\3\2"+
+ "\2\u012e\27\3\2\2\2\u012f\u0131\5\26\f\2\u0130\u012f\3\2\2\2\u0131\u0134"+
+ "\3\2\2\2\u0132\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0135\3\2\2\2\u0134"+
+ "\u0132\3\2\2\2\u0135\u0141\7\26\2\2\u0136\u0142\5\32\16\2\u0137\u013d"+
+ "\7\36\2\2\u0138\u0139\5\32\16\2\u0139\u013a\5\u00d0i\2\u013a\u013c\3\2"+
+ "\2\2\u013b\u0138\3\2\2\2\u013c\u013f\3\2\2\2\u013d\u013b\3\2\2\2\u013d"+
+ "\u013e\3\2\2\2\u013e\u0140\3\2\2\2\u013f\u013d\3\2\2\2\u0140\u0142\7\37"+
+ "\2\2\u0141\u0136\3\2\2\2\u0141\u0137\3\2\2\2\u0142\31\3\2\2\2\u0143\u0146"+
+ "\5\34\17\2\u0144\u0146\5\36\20\2\u0145\u0143\3\2\2\2\u0145\u0144\3\2\2"+
+ "\2\u0146\33\3\2\2\2\u0147\u0148\7\35\2\2\u0148\u0149\7$\2\2\u0149\u014a"+
+ "\5x=\2\u014a\35\3\2\2\2\u014b\u014d\7\35\2\2\u014c\u014e\5 \21\2\u014d"+
+ "\u014c\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0150\5x"+
+ "=\2\u0150\37\3\2\2\2\u0151\u0152\7\"\2\2\u0152\u0157\5\"\22\2\u0153\u0154"+
+ "\7%\2\2\u0154\u0156\5\"\22\2\u0155\u0153\3\2\2\2\u0156\u0159\3\2\2\2\u0157"+
+ "\u0155\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u015a\3\2\2\2\u0159\u0157\3\2"+
+ "\2\2\u015a\u015b\7#\2\2\u015b!\3\2\2\2\u015c\u015d\5\22\n\2\u015d\u015e"+
+ "\5$\23\2\u015e#\3\2\2\2\u015f\u0164\5&\24\2\u0160\u0161\7\65\2\2\u0161"+
+ "\u0163\5&\24\2\u0162\u0160\3\2\2\2\u0163\u0166\3\2\2\2\u0164\u0162\3\2"+
+ "\2\2\u0164\u0165\3\2\2\2\u0165%\3\2\2\2\u0166\u0164\3\2\2\2\u0167\u0169"+
+ "\7;\2\2\u0168\u0167\3\2\2\2\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a"+
+ "\u016b\5x=\2\u016b\'\3\2\2\2\u016c\u016d\7\5\2\2\u016d\u016f\7\35\2\2"+
+ "\u016e\u0170\5 \21\2\u016f\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171"+
+ "\3\2\2\2\u0171\u0173\5\u0094K\2\u0172\u0174\5\62\32\2\u0173\u0172\3\2"+
+ "\2\2\u0173\u0174\3\2\2\2\u0174)\3\2\2\2\u0175\u0176\7\5\2\2\u0176\u0177"+
+ "\5,\27\2\u0177\u0178\7\35\2\2\u0178\u017a\5\u0094K\2\u0179\u017b\5\62"+
+ "\32\2\u017a\u0179\3\2\2\2\u017a\u017b\3\2\2\2\u017b+\3\2\2\2\u017c\u017d"+
+ "\5\u0098M\2\u017d-\3\2\2\2\u017e\u018a\7\33\2\2\u017f\u018b\5\60\31\2"+
+ "\u0180\u0186\7\36\2\2\u0181\u0182\5\60\31\2\u0182\u0183\5\u00d0i\2\u0183"+
+ "\u0185\3\2\2\2\u0184\u0181\3\2\2\2\u0185\u0188\3\2\2\2\u0186\u0184\3\2"+
+ "\2\2\u0186\u0187\3\2\2\2\u0187\u0189\3\2\2\2\u0188\u0186\3\2\2\2\u0189"+
+ "\u018b\7\37\2\2\u018a\u017f\3\2\2\2\u018a\u0180\3\2\2\2\u018b/\3\2\2\2"+
+ "\u018c\u0194\5\22\n\2\u018d\u0190\5x=\2\u018e\u018f\7$\2\2\u018f\u0191"+
+ "\5\24\13\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0195\3\2\2\2"+
+ "\u0192\u0193\7$\2\2\u0193\u0195\5\24\13\2\u0194\u018d\3\2\2\2\u0194\u0192"+
+ "\3\2\2\2\u0195\61\3\2\2\2\u0196\u0198\7 \2\2\u0197\u0199\5\64\33\2\u0198"+
+ "\u0197\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7!"+
+ "\2\2\u019b\63\3\2\2\2\u019c\u019e\7&\2\2\u019d\u019c\3\2\2\2\u019d\u019e"+
+ "\3\2\2\2\u019e\u01a4\3\2\2\2\u019f\u01a1\7[\2\2\u01a0\u019f\3\2\2\2\u01a0"+
+ "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a4\6\33\2\2\u01a3\u019d\3"+
+ "\2\2\2\u01a3\u01a0\3\2\2\2\u01a3\u01a2\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5"+
+ "\u01a6\5\66\34\2\u01a6\u01a7\5\u00d0i\2\u01a7\u01a9\3\2\2\2\u01a8\u01a3"+
+ "\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab"+
+ "\65\3\2\2\2\u01ac\u01bc\5\f\7\2\u01ad\u01bc\5F$\2\u01ae\u01bc\58\35\2"+
+ "\u01af\u01bc\5v<\2\u01b0\u01bc\5H%\2\u01b1\u01bc\5J&\2\u01b2\u01bc\5L"+
+ "\'\2\u01b3\u01bc\5N(\2\u01b4\u01bc\5P)\2\u01b5\u01bc\5\62\32\2\u01b6\u01bc"+
+ "\5T+\2\u01b7\u01bc\5V,\2\u01b8\u01bc\5h\65\2\u01b9\u01bc\5p9\2\u01ba\u01bc"+
+ "\5R*\2\u01bb\u01ac\3\2\2\2\u01bb\u01ad\3\2\2\2\u01bb\u01ae\3\2\2\2\u01bb"+
+ "\u01af\3\2\2\2\u01bb\u01b0\3\2\2\2\u01bb\u01b1\3\2\2\2\u01bb\u01b2\3\2"+
+ "\2\2\u01bb\u01b3\3\2\2\2\u01bb\u01b4\3\2\2\2\u01bb\u01b5\3\2\2\2\u01bb"+
+ "\u01b6\3\2\2\2\u01bb\u01b7\3\2\2\2\u01bb\u01b8\3\2\2\2\u01bb\u01b9\3\2"+
+ "\2\2\u01bb\u01ba\3\2\2\2\u01bc\67\3\2\2\2\u01bd\u01c3\5<\37\2\u01be\u01c3"+
+ "\5> \2\u01bf\u01c3\5@!\2\u01c0\u01c3\5:\36\2\u01c1\u01c3\5D#\2\u01c2\u01bd"+
+ "\3\2\2\2\u01c2\u01be\3\2\2\2\u01c2\u01bf\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c2"+
+ "\u01c1\3\2\2\2\u01c39\3\2\2\2\u01c4\u01c5\5\u009cO\2\u01c5;\3\2\2\2\u01c6"+
+ "\u01c7\5\u009cO\2\u01c7\u01c8\7B\2\2\u01c8\u01c9\5\u009cO\2\u01c9=\3\2"+
+ "\2\2\u01ca\u01cb\5\u009cO\2\u01cb\u01cc\t\4\2\2\u01cc?\3\2\2\2\u01cd\u01ce"+
+ "\5\24\13\2\u01ce\u01cf\5B\"\2\u01cf\u01d0\5\24\13\2\u01d0A\3\2\2\2\u01d1"+
+ "\u01d3\t\5\2\2\u01d2\u01d1\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2"+
+ "\2\2\u01d4\u01d5\7$\2\2\u01d5C\3\2\2\2\u01d6\u01d7\5\22\n\2\u01d7\u01d8"+
+ "\7+\2\2\u01d8\u01d9\5\24\13\2\u01d9E\3\2\2\2\u01da\u01db\7\35\2\2\u01db"+
+ "\u01dd\7\'\2\2\u01dc\u01de\5\66\34\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3"+
+ "\2\2\2\u01deG\3\2\2\2\u01df\u01e1\7\32\2\2\u01e0\u01e2\5\24\13\2\u01e1"+
+ "\u01e0\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2I\3\2\2\2\u01e3\u01e5\7\3\2\2"+
+ "\u01e4\u01e6\7\35\2\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6K\3"+
+ "\2\2\2\u01e7\u01e9\7\27\2\2\u01e8\u01ea\7\35\2\2\u01e9\u01e8\3\2\2\2\u01e9"+
+ "\u01ea\3\2\2\2\u01eaM\3\2\2\2\u01eb\u01ec\7\17\2\2\u01ec\u01ed\7\35\2"+
+ "\2\u01edO\3\2\2\2\u01ee\u01ef\7\23\2\2\u01efQ\3\2\2\2\u01f0\u01f1\7\t"+
+ "\2\2\u01f1\u01f2\5\u009cO\2\u01f2S\3\2\2\2\u01f3\u01fc\7\24\2\2\u01f4"+
+ "\u01fd\5\u009cO\2\u01f5\u01f6\5\u00d0i\2\u01f6\u01f7\5\u009cO\2\u01f7"+
+ "\u01fd\3\2\2\2\u01f8\u01f9\58\35\2\u01f9\u01fa\5\u00d0i\2\u01fa\u01fb"+
+ "\5\u009cO\2\u01fb\u01fd\3\2\2\2\u01fc\u01f4\3\2\2\2\u01fc\u01f5\3\2\2"+
+ "\2\u01fc\u01f8\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u0204\5\62\32\2\u01ff"+
+ "\u0202\7\16\2\2\u0200\u0203\5T+\2\u0201\u0203\5\62\32\2\u0202\u0200\3"+
+ "\2\2\2\u0202\u0201\3\2\2\2\u0203\u0205\3\2\2\2\u0204\u01ff\3\2\2\2\u0204"+
+ "\u0205\3\2\2\2\u0205U\3\2\2\2\u0206\u0209\5X-\2\u0207\u0209\5^\60\2\u0208"+
+ "\u0206\3\2\2\2\u0208\u0207\3\2\2\2\u0209W\3\2\2\2\u020a\u0215\7\21\2\2"+
+ "\u020b\u020d\5\u009cO\2\u020c\u020b\3\2\2\2\u020c\u020d\3\2\2\2\u020d"+
+ "\u0216\3\2\2\2\u020e\u0210\58\35\2\u020f\u020e\3\2\2\2\u020f\u0210\3\2"+
+ "\2\2\u0210\u0211\3\2\2\2\u0211\u0213\5\u00d0i\2\u0212\u0214\5\u009cO\2"+
+ "\u0213\u0212\3\2\2\2\u0213\u0214\3\2\2\2\u0214\u0216\3\2\2\2\u0215\u020c"+
+ "\3\2\2\2\u0215\u020f\3\2\2\2\u0216\u0217\3\2\2\2\u0217\u021b\7 \2\2\u0218"+
+ "\u021a\5Z.\2\u0219\u0218\3\2\2\2\u021a\u021d\3\2\2\2\u021b\u0219\3\2\2"+
+ "\2\u021b\u021c\3\2\2\2\u021c\u021e\3\2\2\2\u021d\u021b\3\2\2\2\u021e\u021f"+
+ "\7!\2\2\u021fY\3\2\2\2\u0220\u0221\5\\/\2\u0221\u0223\7\'\2\2\u0222\u0224"+
+ "\5\64\33\2\u0223\u0222\3\2\2\2\u0223\u0224\3\2\2\2\u0224[\3\2\2\2\u0225"+
+ "\u0226\7\b\2\2\u0226\u0229\5\24\13\2\u0227\u0229\7\4\2\2\u0228\u0225\3"+
+ "\2\2\2\u0228\u0227\3\2\2\2\u0229]\3\2\2\2\u022a\u0233\7\21\2\2\u022b\u0234"+
+ "\5`\61\2\u022c\u022d\5\u00d0i\2\u022d\u022e\5`\61\2\u022e\u0234\3\2\2"+
+ "\2\u022f\u0230\58\35\2\u0230\u0231\5\u00d0i\2\u0231\u0232\5`\61\2\u0232"+
+ "\u0234\3\2\2\2\u0233\u022b\3\2\2\2\u0233\u022c\3\2\2\2\u0233\u022f\3\2"+
+ "\2\2\u0234\u0235\3\2\2\2\u0235\u0239\7 \2\2\u0236\u0238\5b\62\2\u0237"+
+ "\u0236\3\2\2\2\u0238\u023b\3\2\2\2\u0239\u0237\3\2\2\2\u0239\u023a\3\2"+
+ "\2\2\u023a\u023c\3\2\2\2\u023b\u0239\3\2\2\2\u023c\u023d\7!\2\2\u023d"+
+ "_\3\2\2\2\u023e\u023f\7\35\2\2\u023f\u0241\7+\2\2\u0240\u023e\3\2\2\2"+
+ "\u0240\u0241\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\5\u009eP\2\u0243"+
+ "\u0244\7(\2\2\u0244\u0245\7\36\2\2\u0245\u0246\7\26\2\2\u0246\u0247\7"+
+ "\37\2\2\u0247a\3\2\2\2\u0248\u0249\5d\63\2\u0249\u024b\7\'\2\2\u024a\u024c"+
+ "\5\64\33\2\u024b\u024a\3\2\2\2\u024b\u024c\3\2\2\2\u024cc\3\2\2\2\u024d"+
+ "\u024e\7\b\2\2\u024e\u0251\5f\64\2\u024f\u0251\7\4\2\2\u0250\u024d\3\2"+
+ "\2\2\u0250\u024f\3\2\2\2\u0251e\3\2\2\2\u0252\u0255\5x=\2\u0253\u0255"+
+ "\7\34\2\2\u0254\u0252\3\2\2\2\u0254\u0253\3\2\2\2\u0255\u025d\3\2\2\2"+
+ "\u0256\u0259\7%\2\2\u0257\u025a\5x=\2\u0258\u025a\7\34\2\2\u0259\u0257"+
+ "\3\2\2\2\u0259\u0258\3\2\2\2\u025a\u025c\3\2\2\2\u025b\u0256\3\2\2\2\u025c"+
+ "\u025f\3\2\2\2\u025d\u025b\3\2\2\2\u025d\u025e\3\2\2\2\u025eg\3\2\2\2"+
+ "\u025f\u025d\3\2\2\2\u0260\u0261\7\7\2\2\u0261\u0265\7 \2\2\u0262\u0264"+
+ "\5j\66\2\u0263\u0262\3\2\2\2\u0264\u0267\3\2\2\2\u0265\u0263\3\2\2\2\u0265"+
+ "\u0266\3\2\2\2\u0266\u0268\3\2\2\2\u0267\u0265\3\2\2\2\u0268\u0269\7!"+
+ "\2\2\u0269i\3\2\2\2\u026a\u026b\5l\67\2\u026b\u026d\7\'\2\2\u026c\u026e"+
+ "\5\64\33\2\u026d\u026c\3\2\2\2\u026d\u026e\3\2\2\2\u026ek\3\2\2\2\u026f"+
+ "\u0272\7\b\2\2\u0270\u0273\5<\37\2\u0271\u0273\5n8\2\u0272\u0270\3\2\2"+
+ "\2\u0272\u0271\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0276\7\4\2\2\u0275\u026f"+
+ "\3\2\2\2\u0275\u0274\3\2\2\2\u0276m\3\2\2\2\u0277\u0278\5\24\13\2\u0278"+
+ "\u0279\7$\2\2\u0279\u027e\3\2\2\2\u027a\u027b\5\22\n\2\u027b\u027c\7+"+
+ "\2\2\u027c\u027e\3\2\2\2\u027d\u0277\3\2\2\2\u027d\u027a\3\2\2\2\u027d"+
+ "\u027e\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u0280\5\u009cO\2\u0280o\3\2\2"+
+ "\2\u0281\u0289\7\30\2\2\u0282\u0284\5\u009cO\2\u0283\u0282\3\2\2\2\u0283"+
+ "\u0284\3\2\2\2\u0284\u028a\3\2\2\2\u0285\u028a\5r:\2\u0286\u0288\5t;\2"+
+ "\u0287\u0286\3\2\2\2\u0287\u0288\3\2\2\2\u0288\u028a\3\2\2\2\u0289\u0283"+
+ "\3\2\2\2\u0289\u0285\3\2\2\2\u0289\u0287\3\2\2\2\u028a\u028b\3\2\2\2\u028b"+
+ "\u028c\5\62\32\2\u028cq\3\2\2\2\u028d\u028f\58\35\2\u028e\u028d\3\2\2"+
+ "\2\u028e\u028f\3\2\2\2\u028f\u0290\3\2\2\2\u0290\u0292\5\u00d0i\2\u0291"+
+ "\u0293\5\u009cO\2\u0292\u0291\3\2\2\2\u0292\u0293\3\2\2\2\u0293\u0294"+
+ "\3\2\2\2\u0294\u0296\5\u00d0i\2\u0295\u0297\58\35\2\u0296\u0295\3\2\2"+
+ "\2\u0296\u0297\3\2\2\2\u0297s\3\2\2\2\u0298\u0299\5\24\13\2\u0299\u029a"+
+ "\7$\2\2\u029a\u029f\3\2\2\2\u029b\u029c\5\22\n\2\u029c\u029d\7+\2\2\u029d"+
+ "\u029f\3\2\2\2\u029e\u0298\3\2\2\2\u029e\u029b\3\2\2\2\u029e\u029f\3\2"+
+ "\2\2\u029f\u02a0\3\2\2\2\u02a0\u02a1\7\25\2\2\u02a1\u02a2\5\u009cO\2\u02a2"+
+ "u\3\2\2\2\u02a3\u02a4\7\n\2\2\u02a4\u02a5\5\u009cO\2\u02a5w\3\2\2\2\u02a6"+
+ "\u02a8\5|?\2\u02a7\u02a9\5z>\2\u02a8\u02a7\3\2\2\2\u02a8\u02a9\3\2\2\2"+
+ "\u02a9\u02b0\3\2\2\2\u02aa\u02b0\5~@\2\u02ab\u02ac\7\36\2\2\u02ac\u02ad"+
+ "\5x=\2\u02ad\u02ae\7\37\2\2\u02ae\u02b0\3\2\2\2\u02af\u02a6\3\2\2\2\u02af"+
+ "\u02aa\3\2\2\2\u02af\u02ab\3\2\2\2\u02b0y\3\2\2\2\u02b1\u02b2\7\"\2\2"+
+ "\u02b2\u02b4\5f\64\2\u02b3\u02b5\7%\2\2\u02b4\u02b3\3\2\2\2\u02b4\u02b5"+
+ "\3\2\2\2\u02b5\u02b6\3\2\2\2\u02b6\u02b7\7#\2\2\u02b7{\3\2\2\2\u02b8\u02bb"+
+ "\5\u00acW\2\u02b9\u02bb\7\35\2\2\u02ba\u02b8\3\2\2\2\u02ba\u02b9\3\2\2"+
+ "\2\u02bb}\3\2\2\2\u02bc\u02c5\5\u0080A\2\u02bd\u02c5\5\u00bc_\2\u02be"+
+ "\u02c5\5\u0086D\2\u02bf\u02c5\5\u0092J\2\u02c0\u02c5\5\u0088E\2\u02c1"+
+ "\u02c5\5\u008aF\2\u02c2\u02c5\5\u008cG\2\u02c3\u02c5\5\u008eH\2\u02c4"+
+ "\u02bc\3\2\2\2\u02c4\u02bd\3\2\2\2\u02c4\u02be\3\2\2\2\u02c4\u02bf\3\2"+
+ "\2\2\u02c4\u02c0\3\2\2\2\u02c4\u02c1\3\2\2\2\u02c4\u02c2\3\2\2\2\u02c4"+
+ "\u02c3\3\2\2\2\u02c5\177\3\2\2\2\u02c6\u02c7\7\"\2\2\u02c7\u02c8\5\u0082"+
+ "B\2\u02c8\u02c9\7#\2\2\u02c9\u02ca\5\u0084C\2\u02ca\u0081\3\2\2\2\u02cb"+
+ "\u02cc\5\u009cO\2\u02cc\u0083\3\2\2\2\u02cd\u02ce\5x=\2\u02ce\u0085\3"+
+ "\2\2\2\u02cf\u02d0\7@\2\2\u02d0\u02d1\5x=\2\u02d1\u0087\3\2\2\2\u02d2"+
+ "\u02d3\7\6\2\2\u02d3\u02dc\7 \2\2\u02d4\u02d7\5\u0090I\2\u02d5\u02d7\5"+
+ "$\23\2\u02d6\u02d4\3\2\2\2\u02d6\u02d5\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8"+
+ "\u02d9\5\u00d0i\2\u02d9\u02db\3\2\2\2\u02da\u02d6\3\2\2\2\u02db\u02de"+
+ "\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd\u02df\3\2\2\2\u02de"+
+ "\u02dc\3\2\2\2\u02df\u02e0\7!\2\2\u02e0\u0089\3\2\2\2\u02e1\u02e2\7\""+
+ "\2\2\u02e2\u02e3\7#\2\2\u02e3\u02e4\5\u0084C\2\u02e4\u008b\3\2\2\2\u02e5"+
+ "\u02e6\7\13\2\2\u02e6\u02e7\7\"\2\2\u02e7\u02e8\5x=\2\u02e8\u02e9\7#\2"+
+ "\2\u02e9\u02ea\5\u0084C\2\u02ea\u008d\3\2\2\2\u02eb\u02f1\7\r\2\2\u02ec"+
+ "\u02ed\7\r\2\2\u02ed\u02f1\7B\2\2\u02ee\u02ef\7B\2\2\u02ef\u02f1\7\r\2"+
+ "\2\u02f0\u02eb\3\2\2\2\u02f0\u02ec\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1\u02f2"+
+ "\3\2\2\2\u02f2\u02f3\5\u0084C\2\u02f3\u008f\3\2\2\2\u02f4\u02f5\7\35\2"+
+ "\2\u02f5\u02f6\5\u0098M\2\u02f6\u02f7\5\u0096L\2\u02f7\u02fb\3\2\2\2\u02f8"+
+ "\u02f9\7\35\2\2\u02f9\u02fb\5\u0098M\2\u02fa\u02f4\3\2\2\2\u02fa\u02f8"+
+ "\3\2\2\2\u02fb\u0091\3\2\2\2\u02fc\u02fd\7\5\2\2\u02fd\u02fe\5\u0094K"+
+ "\2\u02fe\u0093\3\2\2\2\u02ff\u0301\5\u0098M\2\u0300\u0302\5\u0096L\2\u0301"+
+ "\u0300\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0095\3\2\2\2\u0303\u0306\5\u0098"+
+ "M\2\u0304\u0306\5x=\2\u0305\u0303\3\2\2\2\u0305\u0304\3\2\2\2\u0306\u0097"+
+ "\3\2\2\2\u0307\u0313\7\36\2\2\u0308\u030d\5\u009aN\2\u0309\u030a\7%\2"+
+ "\2\u030a\u030c\5\u009aN\2\u030b\u0309\3\2\2\2\u030c\u030f\3\2\2\2\u030d"+
+ "\u030b\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d\3\2"+
+ "\2\2\u0310\u0312\7%\2\2\u0311\u0310\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+
+ "\u0314\3\2\2\2\u0313\u0308\3\2\2\2\u0313\u0314\3\2\2\2\u0314\u0315\3\2"+
+ "\2\2\u0315\u0316\7\37\2\2\u0316\u0099\3\2\2\2\u0317\u0319\5\22\n\2\u0318"+
+ "\u0317\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031b\3\2\2\2\u031a\u031c\7,"+
+ "\2\2\u031b\u031a\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u031d\3\2\2\2\u031d"+
+ "\u031e\5x=\2\u031e\u009b\3\2\2\2\u031f\u0320\bO\1\2\u0320\u0324\5\u009e"+
+ "P\2\u0321\u0322\t\6\2\2\u0322\u0324\5\u009cO\b\u0323\u031f\3\2\2\2\u0323"+
+ "\u0321\3\2\2\2\u0324\u0336\3\2\2\2\u0325\u0326\f\7\2\2\u0326\u0327\t\7"+
+ "\2\2\u0327\u0335\5\u009cO\b\u0328\u0329\f\6\2\2\u0329\u032a\t\b\2\2\u032a"+
+ "\u0335\5\u009cO\7\u032b\u032c\f\5\2\2\u032c\u032d\t\t\2\2\u032d\u0335"+
+ "\5\u009cO\6\u032e\u032f\f\4\2\2\u032f\u0330\7.\2\2\u0330\u0335\5\u009c"+
+ "O\5\u0331\u0332\f\3\2\2\u0332\u0333\7-\2\2\u0333\u0335\5\u009cO\4\u0334"+
+ "\u0325\3\2\2\2\u0334\u0328\3\2\2\2\u0334\u032b\3\2\2\2\u0334\u032e\3\2"+
+ "\2\2\u0334\u0331\3\2\2\2\u0335\u0338\3\2\2\2\u0336\u0334\3\2\2\2\u0336"+
+ "\u0337\3\2\2\2\u0337\u009d\3\2\2\2\u0338\u0336\3\2\2\2\u0339\u033a\bP"+
+ "\1\2\u033a\u033e\5\u00a2R\2\u033b\u033e\5\u00a0Q\2\u033c\u033e\5\u00ce"+
+ "h\2\u033d\u0339\3\2\2\2\u033d\u033b\3\2\2\2\u033d\u033c\3\2\2\2\u033e"+
+ "\u034a\3\2\2\2\u033f\u0346\f\3\2\2\u0340\u0341\7(\2\2\u0341\u0347\7\35"+
+ "\2\2\u0342\u0347\5\u00c6d\2\u0343\u0347\5\u00c8e\2\u0344\u0347\5\u00ca"+
+ "f\2\u0345\u0347\5\u00ccg\2\u0346\u0340\3\2\2\2\u0346\u0342\3\2\2\2\u0346"+
+ "\u0343\3\2\2\2\u0346\u0344\3\2\2\2\u0346\u0345\3\2\2\2\u0347\u0349\3\2"+
+ "\2\2\u0348\u033f\3\2\2\2\u0349\u034c\3\2\2\2\u034a\u0348\3\2\2\2\u034a"+
+ "\u034b\3\2\2\2\u034b\u009f\3\2\2\2\u034c\u034a\3\2\2\2\u034d\u034e\5x"+
+ "=\2\u034e\u034f\7\36\2\2\u034f\u0351\5\u009cO\2\u0350\u0352\7%\2\2\u0351"+
+ "\u0350\3\2\2\2\u0351\u0352\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0354\7\37"+
+ "\2\2\u0354\u00a1\3\2\2\2\u0355\u035f\5\u00a4S\2\u0356\u0358\5\u00aaV\2"+
+ "\u0357\u0359\5z>\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u035f"+
+ "\3\2\2\2\u035a\u035b\7\36\2\2\u035b\u035c\5\u009cO\2\u035c\u035d\7\37"+
+ "\2\2\u035d\u035f\3\2\2\2\u035e\u0355\3\2\2\2\u035e\u0356\3\2\2\2\u035e"+
+ "\u035a\3\2\2\2\u035f\u00a3\3\2\2\2\u0360\u0364\5\u00a6T\2\u0361\u0364"+
+ "\5\u00aeX\2\u0362\u0364\5\u00c4c\2\u0363\u0360\3\2\2\2\u0363\u0361\3\2"+
+ "\2\2\u0363\u0362\3\2\2\2\u0364\u00a5\3\2\2\2\u0365\u036a\7\34\2\2\u0366"+
+ "\u036a\5\u00a8U\2\u0367\u036a\5\u00c0a\2\u0368\u036a\7G\2\2\u0369\u0365"+
+ "\3\2\2\2\u0369\u0366\3\2\2\2\u0369\u0367\3\2\2\2\u0369\u0368\3\2\2\2\u036a"+
+ "\u00a7\3\2\2\2\u036b\u036c\t\n\2\2\u036c\u00a9\3\2\2\2\u036d\u036e\7\35"+
+ "\2\2\u036e\u00ab\3\2\2\2\u036f\u0370\7\35\2\2\u0370\u0371\7(\2\2\u0371"+
+ "\u0372\7\35\2\2\u0372\u00ad\3\2\2\2\u0373\u0374\5\u00b0Y\2\u0374\u0375"+
+ "\5\u00b2Z\2\u0375\u00af\3\2\2\2\u0376\u0383\5\u00bc_\2\u0377\u0383\5\u0080"+
+ "A\2\u0378\u0379\7\"\2\2\u0379\u037a\7,\2\2\u037a\u037b\7#\2\2\u037b\u0383"+
+ "\5\u0084C\2\u037c\u0383\5\u008aF\2\u037d\u0383\5\u008cG\2\u037e\u0380"+
+ "\5|?\2\u037f\u0381\5z>\2\u0380\u037f\3\2\2\2\u0380\u0381\3\2\2\2\u0381"+
+ "\u0383\3\2\2\2\u0382\u0376\3\2\2\2\u0382\u0377\3\2\2\2\u0382\u0378\3\2"+
+ "\2\2\u0382\u037c\3\2\2\2\u0382\u037d\3\2\2\2\u0382\u037e\3\2\2\2\u0383"+
+ "\u00b1\3\2\2\2\u0384\u0389\7 \2\2\u0385\u0387\5\u00b4[\2\u0386\u0388\7"+
+ "%\2\2\u0387\u0386\3\2\2\2\u0387\u0388\3\2\2\2\u0388\u038a\3\2\2\2\u0389"+
+ "\u0385\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u038b\3\2\2\2\u038b\u038c\7!"+
+ "\2\2\u038c\u00b3\3\2\2\2\u038d\u0392\5\u00b6\\\2\u038e\u038f\7%\2\2\u038f"+
+ "\u0391\5\u00b6\\\2\u0390\u038e\3\2\2\2\u0391\u0394\3\2\2\2\u0392\u0390"+
+ "\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u00b5\3\2\2\2\u0394\u0392\3\2\2\2\u0395"+
+ "\u0396\5\u00b8]\2\u0396\u0397\7\'\2\2\u0397\u0399\3\2\2\2\u0398\u0395"+
+ "\3\2\2\2\u0398\u0399\3\2\2\2\u0399\u039a\3\2\2\2\u039a\u039b\5\u00ba^"+
+ "\2\u039b\u00b7\3\2\2\2\u039c\u039f\5\u009cO\2\u039d\u039f\5\u00b2Z\2\u039e"+
+ "\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f\u00b9\3\2\2\2\u03a0\u03a3\5\u009c"+
+ "O\2\u03a1\u03a3\5\u00b2Z\2\u03a2\u03a0\3\2\2\2\u03a2\u03a1\3\2\2\2\u03a3"+
+ "\u00bb\3\2\2\2\u03a4\u03a5\7\f\2\2\u03a5\u03ab\7 \2\2\u03a6\u03a7\5\u00be"+
+ "`\2\u03a7\u03a8\5\u00d0i\2\u03a8\u03aa\3\2\2\2\u03a9\u03a6\3\2\2\2\u03aa"+
+ "\u03ad\3\2\2\2\u03ab\u03a9\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac\u03ae\3\2"+
+ "\2\2\u03ad\u03ab\3\2\2\2\u03ae\u03af\7!\2\2\u03af\u00bd\3\2\2\2\u03b0"+
+ "\u03b1\5\22\n\2\u03b1\u03b2\5x=\2\u03b2\u03b5\3\2\2\2\u03b3\u03b5\5\u00c2"+
+ "b\2\u03b4\u03b0\3\2\2\2\u03b4\u03b3\3\2\2\2\u03b5\u03b7\3\2\2\2\u03b6"+
+ "\u03b8\5\u00c0a\2\u03b7\u03b6\3\2\2\2\u03b7\u03b8\3\2\2\2\u03b8\u00bf"+
+ "\3\2\2\2\u03b9\u03ba\t\13\2\2\u03ba\u00c1\3\2\2\2\u03bb\u03bd\7@\2\2\u03bc"+
+ "\u03bb\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03c0\5|"+
+ "?\2\u03bf\u03c1\5z>\2\u03c0\u03bf\3\2\2\2\u03c0\u03c1\3\2\2\2\u03c1\u00c3"+
+ "\3\2\2\2\u03c2\u03c3\7\5\2\2\u03c3\u03c4\5\u0094K\2\u03c4\u03c5\5\62\32"+
+ "\2\u03c5\u00c5\3\2\2\2\u03c6\u03c7\7\"\2\2\u03c7\u03c8\5\u009cO\2\u03c8"+
+ "\u03c9\7#\2\2\u03c9\u00c7\3\2\2\2\u03ca\u03da\7\"\2\2\u03cb\u03cd\5\u009c"+
+ "O\2\u03cc\u03cb\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce"+
+ "\u03d0\7\'\2\2\u03cf\u03d1\5\u009cO\2\u03d0\u03cf\3\2\2\2\u03d0\u03d1"+
+ "\3\2\2\2\u03d1\u03db\3\2\2\2\u03d2\u03d4\5\u009cO\2\u03d3\u03d2\3\2\2"+
+ "\2\u03d3\u03d4\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5\u03d6\7\'\2\2\u03d6\u03d7"+
+ "\5\u009cO\2\u03d7\u03d8\7\'\2\2\u03d8\u03d9\5\u009cO\2\u03d9\u03db\3\2"+
+ "\2\2\u03da\u03cc\3\2\2\2\u03da\u03d3\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc"+
+ "\u03dd\7#\2\2\u03dd\u00c9\3\2\2\2\u03de\u03df\7(\2\2\u03df\u03e0\7\36"+
+ "\2\2\u03e0\u03e1\5x=\2\u03e1\u03e2\7\37\2\2\u03e2\u00cb\3\2\2\2\u03e3"+
+ "\u03f2\7\36\2\2\u03e4\u03eb\5\24\13\2\u03e5\u03e8\5x=\2\u03e6\u03e7\7"+
+ "%\2\2\u03e7\u03e9\5\24\13\2\u03e8\u03e6\3\2\2\2\u03e8\u03e9\3\2\2\2\u03e9"+
+ "\u03eb\3\2\2\2\u03ea\u03e4\3\2\2\2\u03ea\u03e5\3\2\2\2\u03eb\u03ed\3\2"+
+ "\2\2\u03ec\u03ee\7,\2\2\u03ed\u03ec\3\2\2\2\u03ed\u03ee\3\2\2\2\u03ee"+
+ "\u03f0\3\2\2\2\u03ef\u03f1\7%\2\2\u03f0\u03ef\3\2\2\2\u03f0\u03f1\3\2"+
+ "\2\2\u03f1\u03f3\3\2\2\2\u03f2\u03ea\3\2\2\2\u03f2\u03f3\3\2\2\2\u03f3"+
+ "\u03f4\3\2\2\2\u03f4\u03f5\7\37\2\2\u03f5\u00cd\3\2\2\2\u03f6\u03f7\5"+
+ "x=\2\u03f7\u03f8\7(\2\2\u03f8\u03f9\7\35\2\2\u03f9\u00cf\3\2\2\2\u03fa"+
+ "\u03ff\7&\2\2\u03fb\u03ff\7\2\2\3\u03fc\u03ff\7[\2\2\u03fd\u03ff\6i\t"+
+ "\2\u03fe\u03fa\3\2\2\2\u03fe\u03fb\3\2\2\2\u03fe\u03fc\3\2\2\2\u03fe\u03fd"+
+ "\3\2\2\2\u03ff\u00d1\3\2\2\2{\u00d9\u00df\u00e5\u00f5\u00f9\u00fc\u0105"+
+ "\u010f\u0113\u0117\u011b\u0122\u012a\u0132\u013d\u0141\u0145\u014d\u0157"+
+ "\u0164\u0168\u016f\u0173\u017a\u0186\u018a\u0190\u0194\u0198\u019d\u01a0"+
+ "\u01a3\u01aa\u01bb\u01c2\u01d2\u01dd\u01e1\u01e5\u01e9\u01fc\u0202\u0204"+
+ "\u0208\u020c\u020f\u0213\u0215\u021b\u0223\u0228\u0233\u0239\u0240\u024b"+
+ "\u0250\u0254\u0259\u025d\u0265\u026d\u0272\u0275\u027d\u0283\u0287\u0289"+
+ "\u028e\u0292\u0296\u029e\u02a8\u02af\u02b4\u02ba\u02c4\u02d6\u02dc\u02f0"+
+ "\u02fa\u0301\u0305\u030d\u0311\u0313\u0318\u031b\u0323\u0334\u0336\u033d"+
+ "\u0346\u034a\u0351\u0358\u035e\u0363\u0369\u0380\u0382\u0387\u0389\u0392"+
+ "\u0398\u039e\u03a2\u03ab\u03b4\u03b7\u03bc\u03c0\u03cc\u03d0\u03d3\u03da"+
+ "\u03e8\u03ea\u03ed\u03f0\u03f2\u03fe";
+ public static final ATN _ATN =
+ new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+ static {
+ _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+ for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+ _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParser.tokens b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParser.tokens
new file mode 100644
index 000000000..3d04e655a
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParser.tokens
@@ -0,0 +1,153 @@
+BREAK=1
+DEFAULT=2
+FUNC=3
+INTERFACE=4
+SELECT=5
+CASE=6
+DEFER=7
+GO=8
+MAP=9
+STRUCT=10
+CHAN=11
+ELSE=12
+GOTO=13
+PACKAGE=14
+SWITCH=15
+CONST=16
+FALLTHROUGH=17
+IF=18
+RANGE=19
+TYPE=20
+CONTINUE=21
+FOR=22
+IMPORT=23
+RETURN=24
+VAR=25
+NIL_LIT=26
+IDENTIFIER=27
+L_PAREN=28
+R_PAREN=29
+L_CURLY=30
+R_CURLY=31
+L_BRACKET=32
+R_BRACKET=33
+ASSIGN=34
+COMMA=35
+SEMI=36
+COLON=37
+DOT=38
+PLUS_PLUS=39
+MINUS_MINUS=40
+DECLARE_ASSIGN=41
+ELLIPSIS=42
+LOGICAL_OR=43
+LOGICAL_AND=44
+EQUALS=45
+NOT_EQUALS=46
+LESS=47
+LESS_OR_EQUALS=48
+GREATER=49
+GREATER_OR_EQUALS=50
+OR=51
+DIV=52
+MOD=53
+LSHIFT=54
+RSHIFT=55
+BIT_CLEAR=56
+UNDERLYING=57
+EXCLAMATION=58
+PLUS=59
+MINUS=60
+CARET=61
+STAR=62
+AMPERSAND=63
+RECEIVE=64
+DECIMAL_LIT=65
+BINARY_LIT=66
+OCTAL_LIT=67
+HEX_LIT=68
+FLOAT_LIT=69
+DECIMAL_FLOAT_LIT=70
+HEX_FLOAT_LIT=71
+IMAGINARY_LIT=72
+RUNE_LIT=73
+BYTE_VALUE=74
+OCTAL_BYTE_VALUE=75
+HEX_BYTE_VALUE=76
+LITTLE_U_VALUE=77
+BIG_U_VALUE=78
+RAW_STRING_LIT=79
+INTERPRETED_STRING_LIT=80
+WS=81
+COMMENT=82
+TERMINATOR=83
+LINE_COMMENT=84
+NEWLINE=85
+WS_NLSEMI=86
+COMMENT_NLSEMI=87
+LINE_COMMENT_NLSEMI=88
+EOS=89
+OTHER=90
+'break'=1
+'default'=2
+'func'=3
+'interface'=4
+'select'=5
+'case'=6
+'defer'=7
+'go'=8
+'map'=9
+'struct'=10
+'chan'=11
+'else'=12
+'goto'=13
+'package'=14
+'switch'=15
+'const'=16
+'fallthrough'=17
+'if'=18
+'range'=19
+'type'=20
+'continue'=21
+'for'=22
+'import'=23
+'return'=24
+'var'=25
+'nil'=26
+'('=28
+')'=29
+'{'=30
+'}'=31
+'['=32
+']'=33
+'='=34
+','=35
+';'=36
+':'=37
+'.'=38
+'++'=39
+'--'=40
+':='=41
+'...'=42
+'||'=43
+'&&'=44
+'=='=45
+'!='=46
+'<'=47
+'<='=48
+'>'=49
+'>='=50
+'|'=51
+'/'=52
+'%'=53
+'<<'=54
+'>>'=55
+'&^'=56
+'~'=57
+'!'=58
+'+'=59
+'-'=60
+'^'=61
+'*'=62
+'&'=63
+'<-'=64
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBase.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBase.java
new file mode 100644
index 000000000..6aa5c5da0
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBase.java
@@ -0,0 +1,28 @@
+package run.mone.antlr.golang;
+
+import org.antlr.v4.runtime.BufferedTokenStream;
+import org.antlr.v4.runtime.Parser;
+import org.antlr.v4.runtime.TokenStream;
+
+/**
+ * @author goodjava@qq.com
+ * @date 2024/1/29 16:33
+ */
+public abstract class GoParserBase extends Parser
+{
+ protected GoParserBase(TokenStream input) {
+ super(input);
+ }
+
+
+ /**
+ * Returns true if the current Token is a closing bracket (")" or "}")
+ */
+ protected boolean closingBracket()
+ {
+ BufferedTokenStream stream = (BufferedTokenStream)_input;
+ int prevTokenType = stream.LA(1);
+
+ return prevTokenType == GoParser.R_CURLY || prevTokenType == GoParser.R_PAREN;
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBaseListener.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBaseListener.java
new file mode 100644
index 000000000..ac039b2dd
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserBaseListener.java
@@ -0,0 +1,1286 @@
+package run.mone.antlr.golang;// Generated from GoParser.g4 by ANTLR 4.7.1
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link GoParserListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class GoParserBaseListener implements GoParserListener {
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSourceFile(GoParser.SourceFileContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSourceFile(GoParser.SourceFileContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPackageClause(GoParser.PackageClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPackageClause(GoParser.PackageClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterImportDecl(GoParser.ImportDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitImportDecl(GoParser.ImportDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterImportSpec(GoParser.ImportSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitImportSpec(GoParser.ImportSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterImportPath(GoParser.ImportPathContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitImportPath(GoParser.ImportPathContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterDeclaration(GoParser.DeclarationContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitDeclaration(GoParser.DeclarationContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConstDecl(GoParser.ConstDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConstDecl(GoParser.ConstDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConstSpec(GoParser.ConstSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConstSpec(GoParser.ConstSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterIdentifierList(GoParser.IdentifierListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitIdentifierList(GoParser.IdentifierListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpressionList(GoParser.ExpressionListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpressionList(GoParser.ExpressionListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterComment(GoParser.CommentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitComment(GoParser.CommentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeDecl(GoParser.TypeDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeDecl(GoParser.TypeDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeSpec(GoParser.TypeSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeSpec(GoParser.TypeSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAliasDecl(GoParser.AliasDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAliasDecl(GoParser.AliasDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeDef(GoParser.TypeDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeDef(GoParser.TypeDefContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeParameters(GoParser.TypeParametersContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeParameters(GoParser.TypeParametersContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeParameterDecl(GoParser.TypeParameterDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeParameterDecl(GoParser.TypeParameterDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeElement(GoParser.TypeElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeElement(GoParser.TypeElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeTerm(GoParser.TypeTermContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeTerm(GoParser.TypeTermContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunctionDecl(GoParser.FunctionDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunctionDecl(GoParser.FunctionDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMethodDecl(GoParser.MethodDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMethodDecl(GoParser.MethodDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterReceiver(GoParser.ReceiverContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitReceiver(GoParser.ReceiverContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterVarDecl(GoParser.VarDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitVarDecl(GoParser.VarDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterVarSpec(GoParser.VarSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitVarSpec(GoParser.VarSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterBlock(GoParser.BlockContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitBlock(GoParser.BlockContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterStatementList(GoParser.StatementListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStatementList(GoParser.StatementListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterStatement(GoParser.StatementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStatement(GoParser.StatementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSimpleStmt(GoParser.SimpleStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSimpleStmt(GoParser.SimpleStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpressionStmt(GoParser.ExpressionStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpressionStmt(GoParser.ExpressionStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSendStmt(GoParser.SendStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSendStmt(GoParser.SendStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterIncDecStmt(GoParser.IncDecStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitIncDecStmt(GoParser.IncDecStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAssignment(GoParser.AssignmentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAssignment(GoParser.AssignmentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAssign_op(GoParser.Assign_opContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAssign_op(GoParser.Assign_opContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterShortVarDecl(GoParser.ShortVarDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitShortVarDecl(GoParser.ShortVarDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLabeledStmt(GoParser.LabeledStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLabeledStmt(GoParser.LabeledStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterReturnStmt(GoParser.ReturnStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitReturnStmt(GoParser.ReturnStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterBreakStmt(GoParser.BreakStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitBreakStmt(GoParser.BreakStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterContinueStmt(GoParser.ContinueStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitContinueStmt(GoParser.ContinueStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGotoStmt(GoParser.GotoStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGotoStmt(GoParser.GotoStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFallthroughStmt(GoParser.FallthroughStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFallthroughStmt(GoParser.FallthroughStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterDeferStmt(GoParser.DeferStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitDeferStmt(GoParser.DeferStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterIfStmt(GoParser.IfStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitIfStmt(GoParser.IfStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSwitchStmt(GoParser.SwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSwitchStmt(GoParser.SwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExprSwitchStmt(GoParser.ExprSwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExprSwitchStmt(GoParser.ExprSwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExprCaseClause(GoParser.ExprCaseClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExprCaseClause(GoParser.ExprCaseClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExprSwitchCase(GoParser.ExprSwitchCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExprSwitchCase(GoParser.ExprSwitchCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeSwitchStmt(GoParser.TypeSwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeSwitchStmt(GoParser.TypeSwitchStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeSwitchGuard(GoParser.TypeSwitchGuardContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeSwitchGuard(GoParser.TypeSwitchGuardContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeCaseClause(GoParser.TypeCaseClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeCaseClause(GoParser.TypeCaseClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeSwitchCase(GoParser.TypeSwitchCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeSwitchCase(GoParser.TypeSwitchCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeList(GoParser.TypeListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeList(GoParser.TypeListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSelectStmt(GoParser.SelectStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSelectStmt(GoParser.SelectStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCommClause(GoParser.CommClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCommClause(GoParser.CommClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCommCase(GoParser.CommCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCommCase(GoParser.CommCaseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterRecvStmt(GoParser.RecvStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitRecvStmt(GoParser.RecvStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterForStmt(GoParser.ForStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitForStmt(GoParser.ForStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterForClause(GoParser.ForClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitForClause(GoParser.ForClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterRangeClause(GoParser.RangeClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitRangeClause(GoParser.RangeClauseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterGoStmt(GoParser.GoStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitGoStmt(GoParser.GoStmtContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterType_(GoParser.Type_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitType_(GoParser.Type_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeArgs(GoParser.TypeArgsContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeArgs(GoParser.TypeArgsContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeName(GoParser.TypeNameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeName(GoParser.TypeNameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeLit(GoParser.TypeLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeLit(GoParser.TypeLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArrayType(GoParser.ArrayTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArrayType(GoParser.ArrayTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArrayLength(GoParser.ArrayLengthContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArrayLength(GoParser.ArrayLengthContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterElementType(GoParser.ElementTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitElementType(GoParser.ElementTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPointerType(GoParser.PointerTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPointerType(GoParser.PointerTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInterfaceType(GoParser.InterfaceTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInterfaceType(GoParser.InterfaceTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSliceType(GoParser.SliceTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSliceType(GoParser.SliceTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMapType(GoParser.MapTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMapType(GoParser.MapTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterChannelType(GoParser.ChannelTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitChannelType(GoParser.ChannelTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMethodSpec(GoParser.MethodSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMethodSpec(GoParser.MethodSpecContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunctionType(GoParser.FunctionTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunctionType(GoParser.FunctionTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSignature(GoParser.SignatureContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSignature(GoParser.SignatureContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterResult(GoParser.ResultContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitResult(GoParser.ResultContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterParameters(GoParser.ParametersContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitParameters(GoParser.ParametersContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterParameterDecl(GoParser.ParameterDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitParameterDecl(GoParser.ParameterDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExpression(GoParser.ExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExpression(GoParser.ExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterPrimaryExpr(GoParser.PrimaryExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitPrimaryExpr(GoParser.PrimaryExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConversion(GoParser.ConversionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConversion(GoParser.ConversionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterOperand(GoParser.OperandContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitOperand(GoParser.OperandContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLiteral(GoParser.LiteralContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLiteral(GoParser.LiteralContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterBasicLit(GoParser.BasicLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitBasicLit(GoParser.BasicLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterInteger(GoParser.IntegerContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitInteger(GoParser.IntegerContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterOperandName(GoParser.OperandNameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitOperandName(GoParser.OperandNameContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterQualifiedIdent(GoParser.QualifiedIdentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitQualifiedIdent(GoParser.QualifiedIdentContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterCompositeLit(GoParser.CompositeLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitCompositeLit(GoParser.CompositeLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLiteralType(GoParser.LiteralTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLiteralType(GoParser.LiteralTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLiteralValue(GoParser.LiteralValueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLiteralValue(GoParser.LiteralValueContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterElementList(GoParser.ElementListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitElementList(GoParser.ElementListContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterKeyedElement(GoParser.KeyedElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitKeyedElement(GoParser.KeyedElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterKey(GoParser.KeyContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitKey(GoParser.KeyContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterElement(GoParser.ElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitElement(GoParser.ElementContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterStructType(GoParser.StructTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitStructType(GoParser.StructTypeContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFieldDecl(GoParser.FieldDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFieldDecl(GoParser.FieldDeclContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterString_(GoParser.String_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitString_(GoParser.String_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEmbeddedField(GoParser.EmbeddedFieldContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEmbeddedField(GoParser.EmbeddedFieldContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterFunctionLit(GoParser.FunctionLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitFunctionLit(GoParser.FunctionLitContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterIndex(GoParser.IndexContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitIndex(GoParser.IndexContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterSlice_(GoParser.Slice_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitSlice_(GoParser.Slice_Context ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterTypeAssertion(GoParser.TypeAssertionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitTypeAssertion(GoParser.TypeAssertionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArguments(GoParser.ArgumentsContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArguments(GoParser.ArgumentsContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterMethodExpr(GoParser.MethodExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitMethodExpr(GoParser.MethodExprContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEos(GoParser.EosContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEos(GoParser.EosContext ctx) { }
+
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitEveryRule(ParserRuleContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitTerminal(TerminalNode node) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserListener.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserListener.java
new file mode 100644
index 000000000..63a6b2b43
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/GoParserListener.java
@@ -0,0 +1,1049 @@
+package run.mone.antlr.golang;// Generated from GoParser.g4 by ANTLR 4.7.1
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link GoParser}.
+ */
+public interface GoParserListener extends ParseTreeListener {
+ /**
+ * Enter a parse tree produced by {@link GoParser#sourceFile}.
+ * @param ctx the parse tree
+ */
+ void enterSourceFile(GoParser.SourceFileContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#sourceFile}.
+ * @param ctx the parse tree
+ */
+ void exitSourceFile(GoParser.SourceFileContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#packageClause}.
+ * @param ctx the parse tree
+ */
+ void enterPackageClause(GoParser.PackageClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#packageClause}.
+ * @param ctx the parse tree
+ */
+ void exitPackageClause(GoParser.PackageClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#importDecl}.
+ * @param ctx the parse tree
+ */
+ void enterImportDecl(GoParser.ImportDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#importDecl}.
+ * @param ctx the parse tree
+ */
+ void exitImportDecl(GoParser.ImportDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#importSpec}.
+ * @param ctx the parse tree
+ */
+ void enterImportSpec(GoParser.ImportSpecContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#importSpec}.
+ * @param ctx the parse tree
+ */
+ void exitImportSpec(GoParser.ImportSpecContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#importPath}.
+ * @param ctx the parse tree
+ */
+ void enterImportPath(GoParser.ImportPathContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#importPath}.
+ * @param ctx the parse tree
+ */
+ void exitImportPath(GoParser.ImportPathContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#declaration}.
+ * @param ctx the parse tree
+ */
+ void enterDeclaration(GoParser.DeclarationContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#declaration}.
+ * @param ctx the parse tree
+ */
+ void exitDeclaration(GoParser.DeclarationContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#constDecl}.
+ * @param ctx the parse tree
+ */
+ void enterConstDecl(GoParser.ConstDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#constDecl}.
+ * @param ctx the parse tree
+ */
+ void exitConstDecl(GoParser.ConstDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#constSpec}.
+ * @param ctx the parse tree
+ */
+ void enterConstSpec(GoParser.ConstSpecContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#constSpec}.
+ * @param ctx the parse tree
+ */
+ void exitConstSpec(GoParser.ConstSpecContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#identifierList}.
+ * @param ctx the parse tree
+ */
+ void enterIdentifierList(GoParser.IdentifierListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#identifierList}.
+ * @param ctx the parse tree
+ */
+ void exitIdentifierList(GoParser.IdentifierListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#expressionList}.
+ * @param ctx the parse tree
+ */
+ void enterExpressionList(GoParser.ExpressionListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#expressionList}.
+ * @param ctx the parse tree
+ */
+ void exitExpressionList(GoParser.ExpressionListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#comment}.
+ * @param ctx the parse tree
+ */
+ void enterComment(GoParser.CommentContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#comment}.
+ * @param ctx the parse tree
+ */
+ void exitComment(GoParser.CommentContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeDecl}.
+ * @param ctx the parse tree
+ */
+ void enterTypeDecl(GoParser.TypeDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeDecl}.
+ * @param ctx the parse tree
+ */
+ void exitTypeDecl(GoParser.TypeDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeSpec}.
+ * @param ctx the parse tree
+ */
+ void enterTypeSpec(GoParser.TypeSpecContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeSpec}.
+ * @param ctx the parse tree
+ */
+ void exitTypeSpec(GoParser.TypeSpecContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#aliasDecl}.
+ * @param ctx the parse tree
+ */
+ void enterAliasDecl(GoParser.AliasDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#aliasDecl}.
+ * @param ctx the parse tree
+ */
+ void exitAliasDecl(GoParser.AliasDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeDef}.
+ * @param ctx the parse tree
+ */
+ void enterTypeDef(GoParser.TypeDefContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeDef}.
+ * @param ctx the parse tree
+ */
+ void exitTypeDef(GoParser.TypeDefContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeParameters}.
+ * @param ctx the parse tree
+ */
+ void enterTypeParameters(GoParser.TypeParametersContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeParameters}.
+ * @param ctx the parse tree
+ */
+ void exitTypeParameters(GoParser.TypeParametersContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeParameterDecl}.
+ * @param ctx the parse tree
+ */
+ void enterTypeParameterDecl(GoParser.TypeParameterDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeParameterDecl}.
+ * @param ctx the parse tree
+ */
+ void exitTypeParameterDecl(GoParser.TypeParameterDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeElement}.
+ * @param ctx the parse tree
+ */
+ void enterTypeElement(GoParser.TypeElementContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeElement}.
+ * @param ctx the parse tree
+ */
+ void exitTypeElement(GoParser.TypeElementContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeTerm}.
+ * @param ctx the parse tree
+ */
+ void enterTypeTerm(GoParser.TypeTermContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeTerm}.
+ * @param ctx the parse tree
+ */
+ void exitTypeTerm(GoParser.TypeTermContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#functionDecl}.
+ * @param ctx the parse tree
+ */
+ void enterFunctionDecl(GoParser.FunctionDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#functionDecl}.
+ * @param ctx the parse tree
+ */
+ void exitFunctionDecl(GoParser.FunctionDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#methodDecl}.
+ * @param ctx the parse tree
+ */
+ void enterMethodDecl(GoParser.MethodDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#methodDecl}.
+ * @param ctx the parse tree
+ */
+ void exitMethodDecl(GoParser.MethodDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#receiver}.
+ * @param ctx the parse tree
+ */
+ void enterReceiver(GoParser.ReceiverContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#receiver}.
+ * @param ctx the parse tree
+ */
+ void exitReceiver(GoParser.ReceiverContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#varDecl}.
+ * @param ctx the parse tree
+ */
+ void enterVarDecl(GoParser.VarDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#varDecl}.
+ * @param ctx the parse tree
+ */
+ void exitVarDecl(GoParser.VarDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#varSpec}.
+ * @param ctx the parse tree
+ */
+ void enterVarSpec(GoParser.VarSpecContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#varSpec}.
+ * @param ctx the parse tree
+ */
+ void exitVarSpec(GoParser.VarSpecContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#block}.
+ * @param ctx the parse tree
+ */
+ void enterBlock(GoParser.BlockContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#block}.
+ * @param ctx the parse tree
+ */
+ void exitBlock(GoParser.BlockContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#statementList}.
+ * @param ctx the parse tree
+ */
+ void enterStatementList(GoParser.StatementListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#statementList}.
+ * @param ctx the parse tree
+ */
+ void exitStatementList(GoParser.StatementListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#statement}.
+ * @param ctx the parse tree
+ */
+ void enterStatement(GoParser.StatementContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#statement}.
+ * @param ctx the parse tree
+ */
+ void exitStatement(GoParser.StatementContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#simpleStmt}.
+ * @param ctx the parse tree
+ */
+ void enterSimpleStmt(GoParser.SimpleStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#simpleStmt}.
+ * @param ctx the parse tree
+ */
+ void exitSimpleStmt(GoParser.SimpleStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#expressionStmt}.
+ * @param ctx the parse tree
+ */
+ void enterExpressionStmt(GoParser.ExpressionStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#expressionStmt}.
+ * @param ctx the parse tree
+ */
+ void exitExpressionStmt(GoParser.ExpressionStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#sendStmt}.
+ * @param ctx the parse tree
+ */
+ void enterSendStmt(GoParser.SendStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#sendStmt}.
+ * @param ctx the parse tree
+ */
+ void exitSendStmt(GoParser.SendStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#incDecStmt}.
+ * @param ctx the parse tree
+ */
+ void enterIncDecStmt(GoParser.IncDecStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#incDecStmt}.
+ * @param ctx the parse tree
+ */
+ void exitIncDecStmt(GoParser.IncDecStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#assignment}.
+ * @param ctx the parse tree
+ */
+ void enterAssignment(GoParser.AssignmentContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#assignment}.
+ * @param ctx the parse tree
+ */
+ void exitAssignment(GoParser.AssignmentContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#assign_op}.
+ * @param ctx the parse tree
+ */
+ void enterAssign_op(GoParser.Assign_opContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#assign_op}.
+ * @param ctx the parse tree
+ */
+ void exitAssign_op(GoParser.Assign_opContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#shortVarDecl}.
+ * @param ctx the parse tree
+ */
+ void enterShortVarDecl(GoParser.ShortVarDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#shortVarDecl}.
+ * @param ctx the parse tree
+ */
+ void exitShortVarDecl(GoParser.ShortVarDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#labeledStmt}.
+ * @param ctx the parse tree
+ */
+ void enterLabeledStmt(GoParser.LabeledStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#labeledStmt}.
+ * @param ctx the parse tree
+ */
+ void exitLabeledStmt(GoParser.LabeledStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#returnStmt}.
+ * @param ctx the parse tree
+ */
+ void enterReturnStmt(GoParser.ReturnStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#returnStmt}.
+ * @param ctx the parse tree
+ */
+ void exitReturnStmt(GoParser.ReturnStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#breakStmt}.
+ * @param ctx the parse tree
+ */
+ void enterBreakStmt(GoParser.BreakStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#breakStmt}.
+ * @param ctx the parse tree
+ */
+ void exitBreakStmt(GoParser.BreakStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#continueStmt}.
+ * @param ctx the parse tree
+ */
+ void enterContinueStmt(GoParser.ContinueStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#continueStmt}.
+ * @param ctx the parse tree
+ */
+ void exitContinueStmt(GoParser.ContinueStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#gotoStmt}.
+ * @param ctx the parse tree
+ */
+ void enterGotoStmt(GoParser.GotoStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#gotoStmt}.
+ * @param ctx the parse tree
+ */
+ void exitGotoStmt(GoParser.GotoStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#fallthroughStmt}.
+ * @param ctx the parse tree
+ */
+ void enterFallthroughStmt(GoParser.FallthroughStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#fallthroughStmt}.
+ * @param ctx the parse tree
+ */
+ void exitFallthroughStmt(GoParser.FallthroughStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#deferStmt}.
+ * @param ctx the parse tree
+ */
+ void enterDeferStmt(GoParser.DeferStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#deferStmt}.
+ * @param ctx the parse tree
+ */
+ void exitDeferStmt(GoParser.DeferStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#ifStmt}.
+ * @param ctx the parse tree
+ */
+ void enterIfStmt(GoParser.IfStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#ifStmt}.
+ * @param ctx the parse tree
+ */
+ void exitIfStmt(GoParser.IfStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#switchStmt}.
+ * @param ctx the parse tree
+ */
+ void enterSwitchStmt(GoParser.SwitchStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#switchStmt}.
+ * @param ctx the parse tree
+ */
+ void exitSwitchStmt(GoParser.SwitchStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#exprSwitchStmt}.
+ * @param ctx the parse tree
+ */
+ void enterExprSwitchStmt(GoParser.ExprSwitchStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#exprSwitchStmt}.
+ * @param ctx the parse tree
+ */
+ void exitExprSwitchStmt(GoParser.ExprSwitchStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#exprCaseClause}.
+ * @param ctx the parse tree
+ */
+ void enterExprCaseClause(GoParser.ExprCaseClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#exprCaseClause}.
+ * @param ctx the parse tree
+ */
+ void exitExprCaseClause(GoParser.ExprCaseClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#exprSwitchCase}.
+ * @param ctx the parse tree
+ */
+ void enterExprSwitchCase(GoParser.ExprSwitchCaseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#exprSwitchCase}.
+ * @param ctx the parse tree
+ */
+ void exitExprSwitchCase(GoParser.ExprSwitchCaseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeSwitchStmt}.
+ * @param ctx the parse tree
+ */
+ void enterTypeSwitchStmt(GoParser.TypeSwitchStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeSwitchStmt}.
+ * @param ctx the parse tree
+ */
+ void exitTypeSwitchStmt(GoParser.TypeSwitchStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeSwitchGuard}.
+ * @param ctx the parse tree
+ */
+ void enterTypeSwitchGuard(GoParser.TypeSwitchGuardContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeSwitchGuard}.
+ * @param ctx the parse tree
+ */
+ void exitTypeSwitchGuard(GoParser.TypeSwitchGuardContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeCaseClause}.
+ * @param ctx the parse tree
+ */
+ void enterTypeCaseClause(GoParser.TypeCaseClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeCaseClause}.
+ * @param ctx the parse tree
+ */
+ void exitTypeCaseClause(GoParser.TypeCaseClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeSwitchCase}.
+ * @param ctx the parse tree
+ */
+ void enterTypeSwitchCase(GoParser.TypeSwitchCaseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeSwitchCase}.
+ * @param ctx the parse tree
+ */
+ void exitTypeSwitchCase(GoParser.TypeSwitchCaseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeList}.
+ * @param ctx the parse tree
+ */
+ void enterTypeList(GoParser.TypeListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeList}.
+ * @param ctx the parse tree
+ */
+ void exitTypeList(GoParser.TypeListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#selectStmt}.
+ * @param ctx the parse tree
+ */
+ void enterSelectStmt(GoParser.SelectStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#selectStmt}.
+ * @param ctx the parse tree
+ */
+ void exitSelectStmt(GoParser.SelectStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#commClause}.
+ * @param ctx the parse tree
+ */
+ void enterCommClause(GoParser.CommClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#commClause}.
+ * @param ctx the parse tree
+ */
+ void exitCommClause(GoParser.CommClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#commCase}.
+ * @param ctx the parse tree
+ */
+ void enterCommCase(GoParser.CommCaseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#commCase}.
+ * @param ctx the parse tree
+ */
+ void exitCommCase(GoParser.CommCaseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#recvStmt}.
+ * @param ctx the parse tree
+ */
+ void enterRecvStmt(GoParser.RecvStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#recvStmt}.
+ * @param ctx the parse tree
+ */
+ void exitRecvStmt(GoParser.RecvStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#forStmt}.
+ * @param ctx the parse tree
+ */
+ void enterForStmt(GoParser.ForStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#forStmt}.
+ * @param ctx the parse tree
+ */
+ void exitForStmt(GoParser.ForStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#forClause}.
+ * @param ctx the parse tree
+ */
+ void enterForClause(GoParser.ForClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#forClause}.
+ * @param ctx the parse tree
+ */
+ void exitForClause(GoParser.ForClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#rangeClause}.
+ * @param ctx the parse tree
+ */
+ void enterRangeClause(GoParser.RangeClauseContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#rangeClause}.
+ * @param ctx the parse tree
+ */
+ void exitRangeClause(GoParser.RangeClauseContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#goStmt}.
+ * @param ctx the parse tree
+ */
+ void enterGoStmt(GoParser.GoStmtContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#goStmt}.
+ * @param ctx the parse tree
+ */
+ void exitGoStmt(GoParser.GoStmtContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#type_}.
+ * @param ctx the parse tree
+ */
+ void enterType_(GoParser.Type_Context ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#type_}.
+ * @param ctx the parse tree
+ */
+ void exitType_(GoParser.Type_Context ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeArgs}.
+ * @param ctx the parse tree
+ */
+ void enterTypeArgs(GoParser.TypeArgsContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeArgs}.
+ * @param ctx the parse tree
+ */
+ void exitTypeArgs(GoParser.TypeArgsContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeName}.
+ * @param ctx the parse tree
+ */
+ void enterTypeName(GoParser.TypeNameContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeName}.
+ * @param ctx the parse tree
+ */
+ void exitTypeName(GoParser.TypeNameContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeLit}.
+ * @param ctx the parse tree
+ */
+ void enterTypeLit(GoParser.TypeLitContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeLit}.
+ * @param ctx the parse tree
+ */
+ void exitTypeLit(GoParser.TypeLitContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#arrayType}.
+ * @param ctx the parse tree
+ */
+ void enterArrayType(GoParser.ArrayTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#arrayType}.
+ * @param ctx the parse tree
+ */
+ void exitArrayType(GoParser.ArrayTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#arrayLength}.
+ * @param ctx the parse tree
+ */
+ void enterArrayLength(GoParser.ArrayLengthContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#arrayLength}.
+ * @param ctx the parse tree
+ */
+ void exitArrayLength(GoParser.ArrayLengthContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#elementType}.
+ * @param ctx the parse tree
+ */
+ void enterElementType(GoParser.ElementTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#elementType}.
+ * @param ctx the parse tree
+ */
+ void exitElementType(GoParser.ElementTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#pointerType}.
+ * @param ctx the parse tree
+ */
+ void enterPointerType(GoParser.PointerTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#pointerType}.
+ * @param ctx the parse tree
+ */
+ void exitPointerType(GoParser.PointerTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#interfaceType}.
+ * @param ctx the parse tree
+ */
+ void enterInterfaceType(GoParser.InterfaceTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#interfaceType}.
+ * @param ctx the parse tree
+ */
+ void exitInterfaceType(GoParser.InterfaceTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#sliceType}.
+ * @param ctx the parse tree
+ */
+ void enterSliceType(GoParser.SliceTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#sliceType}.
+ * @param ctx the parse tree
+ */
+ void exitSliceType(GoParser.SliceTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#mapType}.
+ * @param ctx the parse tree
+ */
+ void enterMapType(GoParser.MapTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#mapType}.
+ * @param ctx the parse tree
+ */
+ void exitMapType(GoParser.MapTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#channelType}.
+ * @param ctx the parse tree
+ */
+ void enterChannelType(GoParser.ChannelTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#channelType}.
+ * @param ctx the parse tree
+ */
+ void exitChannelType(GoParser.ChannelTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#methodSpec}.
+ * @param ctx the parse tree
+ */
+ void enterMethodSpec(GoParser.MethodSpecContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#methodSpec}.
+ * @param ctx the parse tree
+ */
+ void exitMethodSpec(GoParser.MethodSpecContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#functionType}.
+ * @param ctx the parse tree
+ */
+ void enterFunctionType(GoParser.FunctionTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#functionType}.
+ * @param ctx the parse tree
+ */
+ void exitFunctionType(GoParser.FunctionTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#signature}.
+ * @param ctx the parse tree
+ */
+ void enterSignature(GoParser.SignatureContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#signature}.
+ * @param ctx the parse tree
+ */
+ void exitSignature(GoParser.SignatureContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#result}.
+ * @param ctx the parse tree
+ */
+ void enterResult(GoParser.ResultContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#result}.
+ * @param ctx the parse tree
+ */
+ void exitResult(GoParser.ResultContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#parameters}.
+ * @param ctx the parse tree
+ */
+ void enterParameters(GoParser.ParametersContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#parameters}.
+ * @param ctx the parse tree
+ */
+ void exitParameters(GoParser.ParametersContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#parameterDecl}.
+ * @param ctx the parse tree
+ */
+ void enterParameterDecl(GoParser.ParameterDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#parameterDecl}.
+ * @param ctx the parse tree
+ */
+ void exitParameterDecl(GoParser.ParameterDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#expression}.
+ * @param ctx the parse tree
+ */
+ void enterExpression(GoParser.ExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#expression}.
+ * @param ctx the parse tree
+ */
+ void exitExpression(GoParser.ExpressionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#primaryExpr}.
+ * @param ctx the parse tree
+ */
+ void enterPrimaryExpr(GoParser.PrimaryExprContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#primaryExpr}.
+ * @param ctx the parse tree
+ */
+ void exitPrimaryExpr(GoParser.PrimaryExprContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#conversion}.
+ * @param ctx the parse tree
+ */
+ void enterConversion(GoParser.ConversionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#conversion}.
+ * @param ctx the parse tree
+ */
+ void exitConversion(GoParser.ConversionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#operand}.
+ * @param ctx the parse tree
+ */
+ void enterOperand(GoParser.OperandContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#operand}.
+ * @param ctx the parse tree
+ */
+ void exitOperand(GoParser.OperandContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#literal}.
+ * @param ctx the parse tree
+ */
+ void enterLiteral(GoParser.LiteralContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#literal}.
+ * @param ctx the parse tree
+ */
+ void exitLiteral(GoParser.LiteralContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#basicLit}.
+ * @param ctx the parse tree
+ */
+ void enterBasicLit(GoParser.BasicLitContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#basicLit}.
+ * @param ctx the parse tree
+ */
+ void exitBasicLit(GoParser.BasicLitContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#integer}.
+ * @param ctx the parse tree
+ */
+ void enterInteger(GoParser.IntegerContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#integer}.
+ * @param ctx the parse tree
+ */
+ void exitInteger(GoParser.IntegerContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#operandName}.
+ * @param ctx the parse tree
+ */
+ void enterOperandName(GoParser.OperandNameContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#operandName}.
+ * @param ctx the parse tree
+ */
+ void exitOperandName(GoParser.OperandNameContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#qualifiedIdent}.
+ * @param ctx the parse tree
+ */
+ void enterQualifiedIdent(GoParser.QualifiedIdentContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#qualifiedIdent}.
+ * @param ctx the parse tree
+ */
+ void exitQualifiedIdent(GoParser.QualifiedIdentContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#compositeLit}.
+ * @param ctx the parse tree
+ */
+ void enterCompositeLit(GoParser.CompositeLitContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#compositeLit}.
+ * @param ctx the parse tree
+ */
+ void exitCompositeLit(GoParser.CompositeLitContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#literalType}.
+ * @param ctx the parse tree
+ */
+ void enterLiteralType(GoParser.LiteralTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#literalType}.
+ * @param ctx the parse tree
+ */
+ void exitLiteralType(GoParser.LiteralTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#literalValue}.
+ * @param ctx the parse tree
+ */
+ void enterLiteralValue(GoParser.LiteralValueContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#literalValue}.
+ * @param ctx the parse tree
+ */
+ void exitLiteralValue(GoParser.LiteralValueContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#elementList}.
+ * @param ctx the parse tree
+ */
+ void enterElementList(GoParser.ElementListContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#elementList}.
+ * @param ctx the parse tree
+ */
+ void exitElementList(GoParser.ElementListContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#keyedElement}.
+ * @param ctx the parse tree
+ */
+ void enterKeyedElement(GoParser.KeyedElementContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#keyedElement}.
+ * @param ctx the parse tree
+ */
+ void exitKeyedElement(GoParser.KeyedElementContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#key}.
+ * @param ctx the parse tree
+ */
+ void enterKey(GoParser.KeyContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#key}.
+ * @param ctx the parse tree
+ */
+ void exitKey(GoParser.KeyContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#element}.
+ * @param ctx the parse tree
+ */
+ void enterElement(GoParser.ElementContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#element}.
+ * @param ctx the parse tree
+ */
+ void exitElement(GoParser.ElementContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#structType}.
+ * @param ctx the parse tree
+ */
+ void enterStructType(GoParser.StructTypeContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#structType}.
+ * @param ctx the parse tree
+ */
+ void exitStructType(GoParser.StructTypeContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#fieldDecl}.
+ * @param ctx the parse tree
+ */
+ void enterFieldDecl(GoParser.FieldDeclContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#fieldDecl}.
+ * @param ctx the parse tree
+ */
+ void exitFieldDecl(GoParser.FieldDeclContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#string_}.
+ * @param ctx the parse tree
+ */
+ void enterString_(GoParser.String_Context ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#string_}.
+ * @param ctx the parse tree
+ */
+ void exitString_(GoParser.String_Context ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#embeddedField}.
+ * @param ctx the parse tree
+ */
+ void enterEmbeddedField(GoParser.EmbeddedFieldContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#embeddedField}.
+ * @param ctx the parse tree
+ */
+ void exitEmbeddedField(GoParser.EmbeddedFieldContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#functionLit}.
+ * @param ctx the parse tree
+ */
+ void enterFunctionLit(GoParser.FunctionLitContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#functionLit}.
+ * @param ctx the parse tree
+ */
+ void exitFunctionLit(GoParser.FunctionLitContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#index}.
+ * @param ctx the parse tree
+ */
+ void enterIndex(GoParser.IndexContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#index}.
+ * @param ctx the parse tree
+ */
+ void exitIndex(GoParser.IndexContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#slice_}.
+ * @param ctx the parse tree
+ */
+ void enterSlice_(GoParser.Slice_Context ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#slice_}.
+ * @param ctx the parse tree
+ */
+ void exitSlice_(GoParser.Slice_Context ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#typeAssertion}.
+ * @param ctx the parse tree
+ */
+ void enterTypeAssertion(GoParser.TypeAssertionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#typeAssertion}.
+ * @param ctx the parse tree
+ */
+ void exitTypeAssertion(GoParser.TypeAssertionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#arguments}.
+ * @param ctx the parse tree
+ */
+ void enterArguments(GoParser.ArgumentsContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#arguments}.
+ * @param ctx the parse tree
+ */
+ void exitArguments(GoParser.ArgumentsContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#methodExpr}.
+ * @param ctx the parse tree
+ */
+ void enterMethodExpr(GoParser.MethodExprContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#methodExpr}.
+ * @param ctx the parse tree
+ */
+ void exitMethodExpr(GoParser.MethodExprContext ctx);
+ /**
+ * Enter a parse tree produced by {@link GoParser#eos}.
+ * @param ctx the parse tree
+ */
+ void enterEos(GoParser.EosContext ctx);
+ /**
+ * Exit a parse tree produced by {@link GoParser#eos}.
+ * @param ctx the parse tree
+ */
+ void exitEos(GoParser.EosContext ctx);
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/ParseResult.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/ParseResult.java
new file mode 100644
index 000000000..f9ddc0b83
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/antlr/golang/ParseResult.java
@@ -0,0 +1,22 @@
+package run.mone.antlr.golang;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author goodjava@qq.com
+ * @date 2024/2/1 22:48
+ */
+@Data
+@Builder
+public class ParseResult {
+
+
+ private List fieldList;
+
+ private Map> methodMap;
+
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/controller/TestController.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/controller/TestController.java
new file mode 100644
index 000000000..3c82b0e34
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/controller/TestController.java
@@ -0,0 +1,29 @@
+package run.mone.z.desensitization.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import run.mone.z.desensitization.domain.gateway.DemoGateway;
+import run.mone.z.desensitization.domain.model.DemoReqEntiry;
+
+/**
+ * @author wm
+ */
+@RestController
+public class TestController {
+
+ @Autowired
+ private DemoGateway demoGateway;
+
+ @ResponseBody
+ @RequestMapping(value = "/md5", method = RequestMethod.GET)
+ public String getStr(){
+ DemoReqEntiry req = new DemoReqEntiry();
+ req.setTest("abc");
+ return demoGateway.demoTest(req).getTest();
+ }
+
+
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/dto/DesensitizeRsp.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/dto/DesensitizeRsp.java
new file mode 100644
index 000000000..e404ebcd7
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/dto/DesensitizeRsp.java
@@ -0,0 +1,22 @@
+package run.mone.z.desensitization.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author wmin
+ * @date 2024/1/31
+ */
+@Data
+@Builder
+public class DesensitizeRsp {
+ private String textBefore;
+
+ private String textAfter;
+
+ private String username;
+
+ private int status;
+
+ private long durationTime;
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/mapper/ZDesensitizationRecordMapper.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/mapper/ZDesensitizationRecordMapper.java
new file mode 100644
index 000000000..758ef6e45
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/mapper/ZDesensitizationRecordMapper.java
@@ -0,0 +1,40 @@
+package run.mone.z.desensitization.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import run.mone.z.desensitization.pojo.ZDesensitizationRecord;
+import run.mone.z.desensitization.pojo.ZDesensitizationRecordExample;
+
+public interface ZDesensitizationRecordMapper {
+ long countByExample(ZDesensitizationRecordExample example);
+
+ int deleteByExample(ZDesensitizationRecordExample example);
+
+ int deleteByPrimaryKey(Long id);
+
+ int insert(ZDesensitizationRecord record);
+
+ int insertSelective(ZDesensitizationRecord record);
+
+ List selectByExampleWithBLOBs(ZDesensitizationRecordExample example);
+
+ List selectByExample(ZDesensitizationRecordExample example);
+
+ ZDesensitizationRecord selectByPrimaryKey(Long id);
+
+ int updateByExampleSelective(@Param("record") ZDesensitizationRecord record, @Param("example") ZDesensitizationRecordExample example);
+
+ int updateByExampleWithBLOBs(@Param("record") ZDesensitizationRecord record, @Param("example") ZDesensitizationRecordExample example);
+
+ int updateByExample(@Param("record") ZDesensitizationRecord record, @Param("example") ZDesensitizationRecordExample example);
+
+ int updateByPrimaryKeySelective(ZDesensitizationRecord record);
+
+ int updateByPrimaryKeyWithBLOBs(ZDesensitizationRecord record);
+
+ int updateByPrimaryKey(ZDesensitizationRecord record);
+
+ int batchInsert(@Param("list") List list);
+
+ int batchInsertSelective(@Param("list") List list, @Param("selective") ZDesensitizationRecord.Column ... selective);
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecord.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecord.java
new file mode 100644
index 000000000..82e555caa
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecord.java
@@ -0,0 +1,154 @@
+package run.mone.z.desensitization.pojo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+
+public class ZDesensitizationRecord {
+ private Long id;
+
+ private Date gmtCreate;
+
+ private String creator;
+
+ private Integer status;
+
+ private Long durationTime;
+
+ private String textBefore;
+
+ private String textAfter;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Date getGmtCreate() {
+ return gmtCreate;
+ }
+
+ public void setGmtCreate(Date gmtCreate) {
+ this.gmtCreate = gmtCreate;
+ }
+
+ public String getCreator() {
+ return creator;
+ }
+
+ public void setCreator(String creator) {
+ this.creator = creator == null ? null : creator.trim();
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public Long getDurationTime() {
+ return durationTime;
+ }
+
+ public void setDurationTime(Long durationTime) {
+ this.durationTime = durationTime;
+ }
+
+ public String getTextBefore() {
+ return textBefore;
+ }
+
+ public void setTextBefore(String textBefore) {
+ this.textBefore = textBefore == null ? null : textBefore.trim();
+ }
+
+ public String getTextAfter() {
+ return textAfter;
+ }
+
+ public void setTextAfter(String textAfter) {
+ this.textAfter = textAfter == null ? null : textAfter.trim();
+ }
+
+ public enum Column {
+ id("id", "id", "BIGINT", false),
+ gmtCreate("gmt_create", "gmtCreate", "TIMESTAMP", false),
+ creator("creator", "creator", "VARCHAR", false),
+ status("status", "status", "INTEGER", false),
+ durationTime("duration_time", "durationTime", "BIGINT", false),
+ textBefore("text_before", "textBefore", "LONGVARCHAR", false),
+ textAfter("text_after", "textAfter", "LONGVARCHAR", false);
+
+ private static final String BEGINNING_DELIMITER = "\"";
+
+ private static final String ENDING_DELIMITER = "\"";
+
+ private final String column;
+
+ private final boolean isColumnNameDelimited;
+
+ private final String javaProperty;
+
+ private final String jdbcType;
+
+ public String value() {
+ return this.column;
+ }
+
+ public String getValue() {
+ return this.column;
+ }
+
+ public String getJavaProperty() {
+ return this.javaProperty;
+ }
+
+ public String getJdbcType() {
+ return this.jdbcType;
+ }
+
+ Column(String column, String javaProperty, String jdbcType, boolean isColumnNameDelimited) {
+ this.column = column;
+ this.javaProperty = javaProperty;
+ this.jdbcType = jdbcType;
+ this.isColumnNameDelimited = isColumnNameDelimited;
+ }
+
+ public String desc() {
+ return this.getEscapedColumnName() + " DESC";
+ }
+
+ public String asc() {
+ return this.getEscapedColumnName() + " ASC";
+ }
+
+ public static Column[] excludes(Column ... excludes) {
+ ArrayList columns = new ArrayList<>(Arrays.asList(Column.values()));
+ if (excludes != null && excludes.length > 0) {
+ columns.removeAll(new ArrayList<>(Arrays.asList(excludes)));
+ }
+ return columns.toArray(new Column[]{});
+ }
+
+ public static Column[] all() {
+ return Column.values();
+ }
+
+ public String getEscapedColumnName() {
+ if (this.isColumnNameDelimited) {
+ return new StringBuilder().append(BEGINNING_DELIMITER).append(this.column).append(ENDING_DELIMITER).toString();
+ } else {
+ return this.column;
+ }
+ }
+
+ public String getAliasedEscapedColumnName() {
+ return this.getEscapedColumnName();
+ }
+ }
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecordExample.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecordExample.java
new file mode 100644
index 000000000..2145a11c9
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/pojo/ZDesensitizationRecordExample.java
@@ -0,0 +1,511 @@
+package run.mone.z.desensitization.pojo;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ZDesensitizationRecordExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public ZDesensitizationRecordExample() {
+ oredCriteria = new ArrayList();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Long value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Long value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Long value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Long value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Long value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Long value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Long value1, Long value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Long value1, Long value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateIsNull() {
+ addCriterion("gmt_create is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateIsNotNull() {
+ addCriterion("gmt_create is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateEqualTo(Date value) {
+ addCriterion("gmt_create =", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateNotEqualTo(Date value) {
+ addCriterion("gmt_create <>", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateGreaterThan(Date value) {
+ addCriterion("gmt_create >", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateGreaterThanOrEqualTo(Date value) {
+ addCriterion("gmt_create >=", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateLessThan(Date value) {
+ addCriterion("gmt_create <", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateLessThanOrEqualTo(Date value) {
+ addCriterion("gmt_create <=", value, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateIn(List values) {
+ addCriterion("gmt_create in", values, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateNotIn(List values) {
+ addCriterion("gmt_create not in", values, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateBetween(Date value1, Date value2) {
+ addCriterion("gmt_create between", value1, value2, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andGmtCreateNotBetween(Date value1, Date value2) {
+ addCriterion("gmt_create not between", value1, value2, "gmtCreate");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorIsNull() {
+ addCriterion("creator is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorIsNotNull() {
+ addCriterion("creator is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorEqualTo(String value) {
+ addCriterion("creator =", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorNotEqualTo(String value) {
+ addCriterion("creator <>", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorGreaterThan(String value) {
+ addCriterion("creator >", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorGreaterThanOrEqualTo(String value) {
+ addCriterion("creator >=", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorLessThan(String value) {
+ addCriterion("creator <", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorLessThanOrEqualTo(String value) {
+ addCriterion("creator <=", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorLike(String value) {
+ addCriterion("creator like", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorNotLike(String value) {
+ addCriterion("creator not like", value, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorIn(List values) {
+ addCriterion("creator in", values, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorNotIn(List values) {
+ addCriterion("creator not in", values, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorBetween(String value1, String value2) {
+ addCriterion("creator between", value1, value2, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreatorNotBetween(String value1, String value2) {
+ addCriterion("creator not between", value1, value2, "creator");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIsNull() {
+ addCriterion("status is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIsNotNull() {
+ addCriterion("status is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusEqualTo(Integer value) {
+ addCriterion("status =", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotEqualTo(Integer value) {
+ addCriterion("status <>", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusGreaterThan(Integer value) {
+ addCriterion("status >", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+ addCriterion("status >=", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusLessThan(Integer value) {
+ addCriterion("status <", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusLessThanOrEqualTo(Integer value) {
+ addCriterion("status <=", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIn(List values) {
+ addCriterion("status in", values, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotIn(List values) {
+ addCriterion("status not in", values, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusBetween(Integer value1, Integer value2) {
+ addCriterion("status between", value1, value2, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+ addCriterion("status not between", value1, value2, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeIsNull() {
+ addCriterion("duration_time is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeIsNotNull() {
+ addCriterion("duration_time is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeEqualTo(Long value) {
+ addCriterion("duration_time =", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeNotEqualTo(Long value) {
+ addCriterion("duration_time <>", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeGreaterThan(Long value) {
+ addCriterion("duration_time >", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeGreaterThanOrEqualTo(Long value) {
+ addCriterion("duration_time >=", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeLessThan(Long value) {
+ addCriterion("duration_time <", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeLessThanOrEqualTo(Long value) {
+ addCriterion("duration_time <=", value, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeIn(List values) {
+ addCriterion("duration_time in", values, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeNotIn(List values) {
+ addCriterion("duration_time not in", values, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeBetween(Long value1, Long value2) {
+ addCriterion("duration_time between", value1, value2, "durationTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationTimeNotBetween(Long value1, Long value2) {
+ addCriterion("duration_time not between", value1, value2, "durationTime");
+ return (Criteria) this;
+ }
+ }
+
+ public static class Criteria extends GeneratedCriteria {
+
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/AiCodeDesensitizeService.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/AiCodeDesensitizeService.java
new file mode 100644
index 000000000..7d76fe0ca
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/AiCodeDesensitizeService.java
@@ -0,0 +1,49 @@
+package run.mone.z.desensitization.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xiaomi.sautumn.serverless.api.http.Http;
+import com.xiaomi.sautumn.serverless.api.http.HttpResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author wmin
+ * @date 2023/11/20
+ */
+@Service
+@Slf4j
+public class AiCodeDesensitizeService {
+
+ @Resource
+ private Http http;
+
+ public String aiCodeDesensitize(String code){
+ String res = code;
+ try {
+ log.info("aiCodeDesensitize start");
+ Map map = new HashMap<>();
+ map.put("data",code);
+ HttpResult httpResult = http.postForm("http://localhost/desensitize_form",map,new HashMap() {{
+ put("content-type", "application/x-www-form-urlencoded");
+ }},"utf-8", 5000);
+ if (200==httpResult.getCode() && StringUtils.isNotBlank(httpResult.getContent())){
+ JSONObject jsonObject = JSON.parseObject(httpResult.getContent());
+ if (0==jsonObject.getInteger("code") && StringUtils.isNotBlank(jsonObject.getString("data"))){
+ res = jsonObject.getString("data");
+ log.info("aiCodeDesensitize done.{}", res);
+ }
+ } else {
+ log.error("aiCodeDesensitize failed.{}", httpResult);
+ }
+ } catch (Exception e){
+ log.error("aiCodeDesensitize error.", e);
+ }
+ return res;
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/CodeDesensitizeServiceImpl.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/CodeDesensitizeServiceImpl.java
new file mode 100644
index 000000000..b3368bdec
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/CodeDesensitizeServiceImpl.java
@@ -0,0 +1,169 @@
+package run.mone.z.desensitization.service;
+
+import com.google.common.base.Preconditions;
+import com.google.gson.Gson;
+import com.xiaomi.youpin.infra.rpc.Result;
+import com.xiaomi.youpin.infra.rpc.errors.GeneralCodes;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import run.mone.sautumnn.springboot.starter.anno.DubboService;
+import run.mone.z.desensitization.api.bo.DesensitizeReq;
+import run.mone.z.desensitization.api.service.CodeDesensitizeService;
+import run.mone.z.desensitization.dto.DesensitizeRsp;
+import run.mone.z.desensitization.service.common.CodeDesensitizeUtils;
+import run.mone.z.desensitization.service.common.CodeExtractorUtils;
+import run.mone.z.desensitization.service.common.Consts;
+import run.mone.z.desensitization.service.common.NewCodeDesensitizeUtils;
+
+import javax.annotation.Resource;
+
+/**
+ * @author wmin
+ * @date 2023/6/5
+ */
+@DubboService(interfaceClass = CodeDesensitizeService.class, timeout = 5000, group = "${dubbo.group}", version = "1.0")
+@Slf4j
+public class CodeDesensitizeServiceImpl implements CodeDesensitizeService {
+
+ @Resource
+ private AiCodeDesensitizeService aiCodeDesensitizeService;
+
+ @Resource
+ private RecordService recordService;
+
+ private Gson gson = new Gson();
+ @Override
+ public Result codeDesensitize(String codeSnippet) {
+ try {
+ String codeSnippetAfterDesensitized = CodeDesensitizeUtils.codeDesensitizeForClass(codeSnippet);
+ if (StringUtils.isNoneBlank(codeSnippetAfterDesensitized)){
+ return Result.success(codeSnippetAfterDesensitized);
+ }
+ return Result.fail(GeneralCodes.ParamError, "The code does not comply with the syntax requirements");
+ } catch (Exception e) {
+ log.error("codeDesensitize error.", e);
+ return Result.fail(GeneralCodes.InternalError, HttpResponseStatus.INTERNAL_SERVER_ERROR.reasonPhrase());
+ }
+ }
+
+ public Result codeDesensitizeWithSpecConfig(DesensitizeReq req) {
+ try {
+ if (StringUtils.isBlank(req.getLangType())) {
+ log.warn("lang type is not specified! currently supported: java / go; WILL USE: java as lang type to desensitize!");
+ req.setLangType(Consts.LANG_JAVA);
+ }
+ String codeSnippetAfterDesensitized = req.getText();
+ switch (req.getLangType()) {
+ case Consts.LANG_GO:
+ codeSnippetAfterDesensitized = NewCodeDesensitizeUtils.codeDesensitizeForGo(req);
+ break;
+ case Consts.LANG_JAVA:
+ default:
+ codeSnippetAfterDesensitized = NewCodeDesensitizeUtils.codeDesensitizeForClass(req);
+ }
+ if (StringUtils.isNoneBlank(codeSnippetAfterDesensitized)){
+ return Result.success(codeSnippetAfterDesensitized);
+ }
+ return Result.fail(GeneralCodes.ParamError, "The code does not comply with the syntax requirements");
+ } catch (Exception e) {
+ log.error("codeDesensitize error.", e);
+ return Result.fail(GeneralCodes.InternalError, HttpResponseStatus.INTERNAL_SERVER_ERROR.reasonPhrase());
+ }
+ }
+
+ @Override
+ public Result textDesensitize(String text) {
+ try {
+ Pair rst = CodeExtractorUtils.codeExtractor(text);
+ if (rst.getKey()){
+ String[] index = rst.getValue().split("-");
+ String codeSnippet = text.substring(Integer.parseInt(index[0]), Integer.parseInt(index[1])+1);
+ Result codeRst = codeDesensitize(codeSnippet);
+ if (codeRst.getCode()==0){
+ StringBuilder sb = new StringBuilder(text);
+ sb.replace(Integer.parseInt(index[0]), Integer.parseInt(index[1])+2, codeRst.getData());
+ return Result.success(sb.toString());
+ }
+ return codeRst;
+ }
+ return Result.fail(GeneralCodes.ParamError, "codeExtractor error");
+ } catch (Exception e) {
+ log.error("textDesensitize error.", e);
+ return Result.fail(GeneralCodes.InternalError, HttpResponseStatus.INTERNAL_SERVER_ERROR.reasonPhrase());
+ }
+ }
+
+ @Override
+ public Result textDesensitizeWithAi(DesensitizeReq req) {
+ long startTime = System.currentTimeMillis();
+ Result rst = null;
+ DesensitizeRsp rsp = DesensitizeRsp.builder()
+ .textBefore(req.getText())
+ .username(req.getUsername())
+ .build();
+ try {
+ rst = textDesensitizeWithAiBase(req);
+ return rst;
+ } finally {
+ long endTime = System.currentTimeMillis();
+ long duration = endTime - startTime;
+ rsp.setDurationTime(duration);
+ rsp.setStatus(rst.getCode()==0?1:0);
+ rsp.setTextAfter(rst.getData());
+ log.info("textDesensitizeWithAi status:{},duration:{}", rsp.getStatus(), duration);
+ recordService.saveRecord(rsp);
+ }
+ }
+
+ public Result textDesensitizeWithAiBase(DesensitizeReq req) {
+ log.info("textDesensitizeWithAi req:{}", gson.toJson(req));
+ Preconditions.checkArgument(null!=req && StringUtils.isNotBlank(req.getText()), "text can not be null");
+ String text = req.getText();
+ Boolean aiFlag = req.getAiDesensitizeFlag();
+ //保险起见,默认本地失败,只要失败就调ai
+ Boolean isLocalFailed = true;
+ String textAfterDe = text;
+
+ try {
+ // 如果需要提取代码,则提取; 否则直接脱敏
+ if (req.getNeedExtract() != null && Boolean.TRUE.equals(req.getNeedExtract())) {
+ Pair rst = CodeExtractorUtils.codeExtractorWithLabel(text);
+ log.info("Perform code extraction with res:{}", rst);
+ if (rst.getKey()) {
+ String[] index = rst.getValue().split("-");
+ String codeSnippet = text.substring(Integer.parseInt(index[0]), Integer.parseInt(index[1]));
+ log.info("codeSnippet after codeExtractorWithLabel:{}", codeSnippet);
+ req.setText(codeSnippet);
+ Result codeRst = codeDesensitizeWithSpecConfig(req);
+ if (codeRst.getCode() == 0) {
+ StringBuilder sb = new StringBuilder(text);
+ sb.replace(Integer.parseInt(index[0]), Integer.parseInt(index[1]) + 1, codeRst.getData());
+ isLocalFailed = false;
+ textAfterDe = sb.toString();
+ }
+ } else {
+ log.error("local textDesensitizeWithAi failed.");
+ }
+ } else {
+ log.info("Perform desensitization directly with req!");
+ Result codeRst = codeDesensitizeWithSpecConfig(req);
+ isLocalFailed = false;
+ textAfterDe = codeRst.getData();
+ }
+ } catch (Exception e) {
+ log.error("textDesensitizeWithAi error.", e);
+ }
+ //if (BooleanUtils.isTrue(isLocalFailed) || BooleanUtils.isTrue(aiFlag)){
+ if (BooleanUtils.isTrue(aiFlag)){
+ //call ai http
+ textAfterDe = aiCodeDesensitizeService.aiCodeDesensitize(textAfterDe);
+ }
+ if (BooleanUtils.isTrue(isLocalFailed) && BooleanUtils.isFalse(aiFlag)){
+ return Result.fail(GeneralCodes.InternalError, "local desensitization failed, and is configured not to call AI desensitization!");
+ }
+ return Result.success(textAfterDe);
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/DubboHealthServiceImpl.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/DubboHealthServiceImpl.java
new file mode 100644
index 000000000..c5bd9ee22
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/DubboHealthServiceImpl.java
@@ -0,0 +1,16 @@
+package run.mone.z.desensitization.service;
+
+import com.xiaomi.youpin.infra.rpc.Result;
+import lombok.extern.slf4j.Slf4j;
+import run.mone.sautumnn.springboot.starter.anno.DubboService;
+import run.mone.z.desensitization.api.service.DubboHealthService;
+
+@DubboService(interfaceClass = DubboHealthService.class, timeout = 1000, group = "${dubbo.group}", version = "1.0")
+@Slf4j
+public class DubboHealthServiceImpl implements DubboHealthService {
+
+ @Override
+ public Result health() {
+ return Result.success("ok");
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/RecordService.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/RecordService.java
new file mode 100644
index 000000000..0bfffe4a3
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/RecordService.java
@@ -0,0 +1,37 @@
+package run.mone.z.desensitization.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import run.mone.z.desensitization.dto.DesensitizeRsp;
+import run.mone.z.desensitization.mapper.ZDesensitizationRecordMapper;
+import run.mone.z.desensitization.pojo.ZDesensitizationRecord;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * @author wmin
+ * @date 2024/1/31
+ */
+@Slf4j
+@Service
+public class RecordService {
+
+ @Resource
+ private ZDesensitizationRecordMapper recordMapper;
+
+ public void saveRecord(DesensitizeRsp rsp) {
+ try {
+ ZDesensitizationRecord record = new ZDesensitizationRecord();
+ record.setGmtCreate(new Date());
+ record.setCreator(rsp.getUsername());
+ record.setTextBefore(rsp.getTextBefore());
+ record.setTextAfter(rsp.getTextAfter());
+ record.setStatus(rsp.getStatus());
+ record.setDurationTime(rsp.getDurationTime());
+ log.info("saveRecord :{}", recordMapper.insert(record));
+ } catch (Exception e) {
+ log.error("saveRecord", e);
+ }
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/ClassUtils.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/ClassUtils.java
new file mode 100644
index 000000000..28a591232
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/ClassUtils.java
@@ -0,0 +1,57 @@
+package run.mone.z.desensitization.service.common;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.util.JavacTask;
+import com.sun.source.util.Trees;
+import com.sun.tools.javac.api.JavacTool;
+
+import javax.tools.*;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+
+/**
+ * @author wmin
+ * @date 2023/6/5
+ * 解析class语法树
+ */
+public class ClassUtils {
+
+ public static CompilationUnitTree getUnitTreeWithClassName(String sourceCode, String className) throws IOException {
+ JavaCompiler compiler = JavacTool.create();
+ StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
+ JavaFileObject sourceFile = new JavaSourceFromString(className, sourceCode);
+ // 设置虚拟源文件的存储位置
+ fileManager.setLocation(StandardLocation.CLASS_PATH, Arrays.asList());
+ // 编译源代码
+ JavacTask task = (JavacTask) compiler.getTask(null, fileManager, null, null, null, Arrays.asList(sourceFile));
+ // 获取编译单元树
+ Trees trees = Trees.instance(task);
+ Iterable extends CompilationUnitTree> compilationUnits = task.parse();
+ CompilationUnitTree compilationUnit = compilationUnits.iterator().next();
+ // 关闭文件管理器
+ fileManager.close();
+ return compilationUnit;
+ }
+
+ private static CompilationUnit getUnitTree(String sourceCode){
+ JavaParser javaParser = new JavaParser();
+ CompilationUnit compilationUnit = javaParser.parse(sourceCode).getResult().get();
+ return compilationUnit;
+ }
+
+ // 自定义Java源文件对象
+ static class JavaSourceFromString extends SimpleJavaFileObject {
+ final String code;
+ JavaSourceFromString(String name, String code) {
+ super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
+ this.code = code;
+ }
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return code;
+ }
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeDesensitizeUtils.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeDesensitizeUtils.java
new file mode 100644
index 000000000..a67de7c4e
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeDesensitizeUtils.java
@@ -0,0 +1,214 @@
+package run.mone.z.desensitization.service.common;
+
+import com.google.common.collect.Sets;
+import com.sun.source.tree.*;
+import com.sun.source.util.TreeScanner;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.TreeMaker;
+import com.sun.tools.javac.util.Context;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+import run.mone.z.desensitization.api.common.CodeTypeEnum;
+
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import static run.mone.z.desensitization.service.common.Consts.*;
+
+/**
+ * @author wmin
+ * @date 2023/6/5
+ * 代码脱敏
+ */
+@Slf4j
+public class CodeDesensitizeUtils {
+
+ /**
+ * 敏感词key
+ */
+ private static Set filedOrMethodNames = Sets.newHashSet("password", "pwd", "secret", "token", "ip", "host");
+
+ private static Set ipKeys = Sets.newHashSet( "ip", "host");
+ /**
+ * IP白名单
+ */
+ private static Set ipWhite = Sets.newHashSet("127.0.0.1", "0.0.0.0");
+
+ private static TreeScanner scanner;
+
+ public static String codeDesensitizeForClass(String sourceCode, String className) throws Exception {
+ CompilationUnitTree compilationUnit = ClassUtils.getUnitTreeWithClassName(sourceCode, className);
+ TreeScanner scanner = getTreeScanner();
+ scanner.scan(compilationUnit, null);
+ String codeAfterDesensitized = compilationUnit.toString();
+ if (tmpClassName.equals(className)){
+ codeAfterDesensitized = codeAfterDesensitized.substring(tmpClassNamePrefix.length()+1, codeAfterDesensitized.length()-1).replaceAll("^\\n+|\\n+$", "");
+ }
+ log.info("codeAfterDesensitized ======{}======", codeAfterDesensitized);
+ return codeAfterDesensitized;
+ }
+
+ public static String codeDesensitizeForClass(String sourceCode) throws Exception {
+ Pair rst = CodeParseUtils.codeParse(sourceCode);
+ if (rst!=null){
+ if (CodeTypeEnum.CLASS.getType().equals(rst.getKey())){
+ return codeDesensitizeForClass(sourceCode, rst.getValue());
+ }
+ if (CodeTypeEnum.METHOD.getType().equals(rst.getKey())){
+ return codeDesensitizeForClass(tmpClassNamePrefix + sourceCode + tmpClassNameSuffix, rst.getValue());
+ }
+ }
+ return "";
+ }
+
+ private static synchronized TreeScanner getTreeScanner(){
+ if (scanner!=null){
+ return scanner;
+ }
+ Context context = new Context();
+ JavacFileManager.preRegister(context);
+ TreeMaker treeMaker = TreeMaker.instance(context);
+ scanner = new TreeScanner() {
+ @Override
+ public Void visitVariable(VariableTree variableTree, Void aVoid) {
+ String key = variableTree.getName().toString();
+
+ //已初始化
+ if (variableTree.getInitializer()!=null) {
+ ExpressionTree initializer = variableTree.getInitializer();
+ if (initializer instanceof LiteralTree) {
+ String value = ((LiteralTree) initializer).getValue().toString();
+ String valueDesensitized = value;
+ if (isSensitiveKey(key.toLowerCase())){
+ valueDesensitized = maskValue(value, ipKeys.contains(key.toLowerCase())?"ip":"content");
+ }
+ Pair valuePair = isSensitiveValue(value);
+ if (valuePair.getKey()){
+ valueDesensitized = valuePair.getValue();
+ }
+ JCTree.JCLiteral newLiteral = treeMaker.Literal(valueDesensitized);
+ ((JCTree.JCVariableDecl) variableTree).init = newLiteral;
+ }
+ }
+ return super.visitVariable(variableTree, aVoid);
+ }
+
+ @Override
+ public Void visitMethod(MethodTree methodTreeTree, Void aVoid) {
+ BlockTree body = methodTreeTree.getBody();
+ if (null != body) {
+ List extends StatementTree> stats = body.getStatements();
+ stats.forEach(it -> {
+ if (it instanceof JCTree.JCExpressionStatement) {
+ JCTree.JCExpressionStatement statement = (JCTree.JCExpressionStatement) it;
+ JCTree.JCExpression expression = statement.getExpression();
+ if (expression instanceof JCTree.JCMethodInvocation) {
+ JCTree.JCMethodInvocation invocation = (JCTree.JCMethodInvocation) expression;
+ com.sun.tools.javac.util.List arguments = invocation.getArguments();
+ if (arguments.head!=null){
+ com.sun.tools.javac.util.List newArguments = null;
+ for (int i =0;i pair = isSensitiveValue(value);
+ if (pair.getKey()){
+ arg = treeMaker.Literal(pair.getValue());
+ }
+ if (newArguments==null){
+ newArguments = com.sun.tools.javac.util.List.of(arg);
+ } else {
+ newArguments = newArguments.append(arg);
+ }
+ }
+ if (arg instanceof JCTree.JCIdent) {
+ if (newArguments==null){
+ newArguments = com.sun.tools.javac.util.List.of(arg);
+ } else {
+ newArguments = newArguments.append(arg);
+ }
+ }
+ }
+ invocation.args = newArguments;
+ }
+ }
+ }
+ });
+ }
+ return super.visitMethod(methodTreeTree, aVoid);
+ }
+ };
+ return scanner;
+ }
+
+
+ private static boolean isSensitiveKey(String key){
+ //todo 只要包含就算,可能误判
+ for (String keyword : filedOrMethodNames) {
+ if (key.toLowerCase().contains(keyword.toLowerCase())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static Pair isSensitiveValue(String value){
+ Pair ipRst = hasSensitiveIP(value);
+ if (ipRst.getKey()){
+ return ipRst;
+ }
+ Pair pwdRst = hasSensitivePwd(value);
+ return pwdRst;
+ }
+
+ private static Pair hasSensitivePwd(String value){
+ if (value.length() < 8) {
+ return Pair.of(false, value);
+ }
+ String specialCharacters = "!@#$%^&*()_-";
+ boolean hasLetter = false;
+ boolean hasDigit = false;
+ boolean hasSpecialChar = false;
+
+ for (char c : value.toCharArray()) {
+ if (Character.isLetter(c)) {
+ hasLetter = true;
+ } else if (Character.isDigit(c)) {
+ hasDigit = true;
+ } else {
+ if (specialCharacters.contains(String.valueOf(c))) {
+ hasSpecialChar = true;
+ }
+ }
+ }
+ //同时包含字母/数字/特殊字符
+ if (hasLetter && hasDigit && hasSpecialChar){
+ return Pair.of(true, maskValue(value, "value"));
+ }
+
+ return Pair.of(false, value);
+ }
+
+ private static Pair hasSensitiveIP(String value){
+ String ipPattern = "^((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$";
+ if (!ipWhite.contains(value) && Pattern.matches(ipPattern, value)){
+ return Pair.of(true, maskValue(value, "ip"));
+ }
+ return Pair.of(false, value);
+ }
+
+ //对敏感信息进行脱敏
+ private static String maskValue(String value, String type) {
+ if ("ip".equals(type)){
+ if (ipWhite.contains(value)){
+ return value;
+ }
+ return "*.*.*.*";
+ }
+ return value.replaceAll(".", "*");
+ }
+
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeExtractorUtils.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeExtractorUtils.java
new file mode 100644
index 000000000..e78d782fa
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeExtractorUtils.java
@@ -0,0 +1,69 @@
+package run.mone.z.desensitization.service.common;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+
+import java.util.Stack;
+
+/**
+ * @author wmin
+ * @date 2023/6/7
+ */
+@Slf4j
+public class CodeExtractorUtils {
+
+ /**
+ * 只能处理单段代码
+ * 代码提取,返回代码片段开始和结束的index
+ */
+ public static Pair codeExtractor(String str) {
+ Stack stack = new Stack<>();
+ char[] arr = str.toCharArray();
+ int firstBra = -1;
+ int lastBra = -1;
+ for (int i=0;i codeExtractorWithLabel(String str) {
+ if (str.contains(Consts.codeExtractorStartLabel) && str.contains(Consts.codeExtractorEndLabel)){
+ int startIndex = str.indexOf(Consts.codeExtractorStartLabel);
+ int endIndex = str.indexOf(Consts.codeExtractorEndLabel, startIndex + Consts.codeExtractorStartLabel.length());
+ return Pair.of(true, startIndex + Consts.codeExtractorStartLabel.length()+"-"+endIndex);
+ }
+ return Pair.of(false,"not supported");
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeParseUtils.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeParseUtils.java
new file mode 100644
index 000000000..177aa6ef7
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/CodeParseUtils.java
@@ -0,0 +1,69 @@
+package run.mone.z.desensitization.service.common;
+
+import com.github.javaparser.JavaParser;
+import com.github.javaparser.ParseResult;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.PackageDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+import run.mone.z.desensitization.api.common.CodeTypeEnum;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * @author wmin
+ * @date 2023/6/5
+ * 代码解析
+ */
+@Slf4j
+public class CodeParseUtils {
+
+ public static Pair codeParse(String sourceCode){
+ Pair rst = null;
+ try {
+ if (isClass(sourceCode)){
+ JavaParser javaParser = new JavaParser();
+ CompilationUnit compilationUnit = javaParser.parse(sourceCode).getResult().get();
+ String className = compilationUnit.getType(0).getName().getIdentifier();
+ if (compilationUnit.getPackageDeclaration().isPresent()){
+ PackageDeclaration packageDeclaration = compilationUnit.getPackageDeclaration().get();
+ className = packageDeclaration.getName()+"."+className;
+ }
+ rst = Pair.of(CodeTypeEnum.CLASS.getType(), className);
+ } else if (isMethod(sourceCode)){
+ rst = methodCodeParse(sourceCode);
+ }
+ } catch (Exception e){
+ log.error("codeParse error", e);
+ }
+ log.info("codeParse end.rst:{}", rst);
+ return rst;
+ }
+
+ public static boolean isClass(String sourceCode){
+ Pattern pattern = Pattern.compile(".*(public|protected|private)\\s+(class|interface)\\s.*", Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(sourceCode);
+ return matcher.matches();
+ }
+
+ public static boolean isMethod(String sourceCode){
+ String regex = "\\s*(public|protected|private)?\\s+(static\\s+)?[\\w\\<\\>\\[\\]]+\\s+[\\w\\$]+\\(.*\\)\\s*\\{.*";
+ Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(sourceCode);
+ return matcher.matches();
+ }
+
+ public static Pair methodCodeParse(String sourceCode){
+ Pair rst = null;
+ JavaParser javaParser = new JavaParser();
+ ParseResult cu = javaParser.parseMethodDeclaration(sourceCode);
+ if (cu.isSuccessful()){
+ rst = Pair.of(CodeTypeEnum.METHOD.getType(), Consts.tmpClassName);
+ }
+ return rst;
+ }
+
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/Consts.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/Consts.java
new file mode 100644
index 000000000..f89ad52e6
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/Consts.java
@@ -0,0 +1,20 @@
+package run.mone.z.desensitization.service.common;
+
+/**
+ * @author wmin
+ * @date 2023/6/6
+ */
+public class Consts {
+
+ public static String tmpClassName = "TmpClassName";
+ public static String tmpClassNamePrefix = "public class TmpClassName {";
+ public static String tmpClassNameSuffix = "}";
+
+ public static String codeExtractorStartLabel = "z_desensitization_start";
+ public static String codeExtractorEndLabel = "z_desensitization_end";
+
+ public static final String LANG_JAVA = "java";
+
+ public static final String LANG_GO = "go";
+
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/HttpClientUtil.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/HttpClientUtil.java
new file mode 100644
index 000000000..6b53ce534
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/HttpClientUtil.java
@@ -0,0 +1,138 @@
+package run.mone.z.desensitization.service.common;
+
+import com.alibaba.nacos.common.utils.MapUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.LaxRedirectStrategy;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+
+/**
+ * @author HawickMason@xiaomi.com
+ * @date 1/31/24 8:15 PM
+ */
+public class HttpClientUtil {
+ private static Logger log = LoggerFactory.getLogger(HttpClientUtil.class);
+
+ private static final String APPLICATION_JSON = "application/json";
+
+ private static final String PREFIX = "Bearer ";
+
+ private static final String UTF_8 = "UTF-8";
+
+ private static CloseableHttpClient httpClient = null;
+ private static RequestConfig requestConfig = null;
+
+ static {
+ // 设置配置请求参数
+ requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
+ .setConnectionRequestTimeout(35000)// 请求超时时间
+ .setSocketTimeout(60000)// 数据读取超时时间
+ .build();
+
+ PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+ connectionManager.setMaxTotal(200);
+ connectionManager.setDefaultMaxPerRoute(20);
+ //connectionManager.setValidateAfterInactivity(TimeValue.ofMinutes(5));
+ httpClient = HttpClients.custom()
+ .setConnectionManager(connectionManager)
+ .setDefaultRequestConfig(requestConfig)
+ .setRedirectStrategy(new LaxRedirectStrategy()) // Follow Redirect 跟随重定向
+ .build();
+ }
+
+ public static String doGet(String url) {
+ return doGet(url, null, null, null);
+ }
+
+ public static String doGet(String url, Map param) {
+ return doGet(url, param, null, null);
+ }
+
+ public static String doGet(String url, Map param, Map headerParamMap, Pair headerTokenPair) {
+ String result = "";
+ CloseableHttpResponse response = null;
+ try {
+ // 创建 uri
+ URIBuilder builder = new URIBuilder(url);
+ if (MapUtils.isNotEmpty(param)) {
+ for (String key : param.keySet()) {
+ builder.addParameter(key, String.valueOf(param.get(key)));
+ }
+ }
+ URI uri = builder.build();
+
+ // 创建 http GET请求
+ HttpGet httpGet = new HttpGet(uri);
+
+ if (headerTokenPair != null) {
+ httpGet.addHeader(headerTokenPair.getKey(), PREFIX + headerTokenPair.getValue());
+ }
+
+ if (null != headerParamMap && !headerParamMap.isEmpty()) {
+ for (String key : headerParamMap.keySet()) {
+ if (!httpGet.containsHeader(key)) {
+ httpGet.addHeader(key, (String) headerParamMap.get(key));
+ }
+ }
+ }
+ // 执行请求
+ response = httpClient.execute(httpGet);
+ // 判断返回状态是否为200
+ if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+ result = EntityUtils.toString(response.getEntity(), UTF_8);
+ } else {
+ log.error("doGet error, response:{}", response);
+ }
+ } catch (Exception e) {
+ log.error("doGet error, url:{}", url, e);
+ } finally {
+ try {
+ if (response != null) {
+ response.close();
+ }
+ } catch (IOException e) {
+ log.error("doGet close response error:", e);
+ }
+ }
+ return result;
+ }
+
+ public static String doPostString(String url, String body, Map headerParamMap) {
+ try {
+ HttpPost post = new HttpPost(url);
+ if (headerParamMap != null && !headerParamMap.isEmpty()) {
+ for (String key : headerParamMap.keySet()) {
+ if (!post.containsHeader(key)) {
+ post.addHeader(key, (String) headerParamMap.get(key));
+ }
+ }
+ }
+ post.setEntity(new StringEntity(body, UTF_8));
+ CloseableHttpResponse response = httpClient.execute(post);
+ HttpEntity resEntity = response.getEntity();
+ if (resEntity == null) {
+ return null;
+ }
+ return EntityUtils.toString(resEntity);
+ } catch (Exception e) {
+ log.error("error in post request,error message={}", e);
+ }
+ return null;
+ }
+}
diff --git a/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/NewCodeDesensitizeUtils.java b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/NewCodeDesensitizeUtils.java
new file mode 100644
index 000000000..8966a8867
--- /dev/null
+++ b/m78-all/z-desensitization/z-desensitization-app/src/main/java/run/mone/z/desensitization/service/common/NewCodeDesensitizeUtils.java
@@ -0,0 +1,335 @@
+package run.mone.z.desensitization.service.common;
+
+import com.alibaba.nacos.common.utils.MapUtils;
+import com.google.common.collect.Sets;
+import com.sun.source.tree.*;
+import com.sun.source.util.TreeScanner;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.TreeMaker;
+import com.sun.tools.javac.util.Context;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.springframework.util.CollectionUtils;
+import run.mone.antlr.golang.Field;
+import run.mone.antlr.golang.GoCode;
+import run.mone.antlr.golang.ParseResult;
+import run.mone.z.desensitization.api.bo.DesensitizeReq;
+import run.mone.z.desensitization.api.bo.SensitiveWordConfigBo;
+import run.mone.z.desensitization.api.common.CodeTypeEnum;
+import run.mone.z.desensitization.api.common.SensitiveWordTypeEnum;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static run.mone.z.desensitization.service.common.Consts.*;
+
+/**
+ * @author wmin
+ * @date 2023/6/5
+ * 可根据指定的敏感词进行代码脱敏
+ */
+@Slf4j
+public class NewCodeDesensitizeUtils {
+
+ /**
+ * 敏感词key
+ */
+ private static Set filedOrMethodNames = Sets.newHashSet("password", "pwd", "secret", "token", "ip", "host");
+
+ private static Set ipKeys = Sets.newHashSet( "ip", "host");
+ /**
+ * IP白名单
+ */
+ private static Set ipWhite = Sets.newHashSet("127.0.0.1", "0.0.0.0");
+
+ private static TreeScanner scanner;
+
+ public static String codeDesensitizeForClass(String sourceCode, String className, List sensitiveWordConfigs) throws Exception {
+ CompilationUnitTree compilationUnit = ClassUtils.getUnitTreeWithClassName(sourceCode, className);
+ TreeScanner scanner = getTreeScanner(sensitiveWordConfigs);
+ scanner.scan(compilationUnit, null);
+ String codeAfterDesensitized = compilationUnit.toString();
+ if (tmpClassName.equals(className)){
+ codeAfterDesensitized = codeAfterDesensitized.substring(tmpClassNamePrefix.length()+1, codeAfterDesensitized.length()-1).replaceAll("^\\n+|\\n+$", "");
+ }
+ log.info("codeAfterDesensitized ======{}======", codeAfterDesensitized);
+ return codeAfterDesensitized;
+ }
+
+ public static String codeDesensitizeForClass(DesensitizeReq req) throws Exception {
+ String sourceCode = req.getText();
+ Pair rst = CodeParseUtils.codeParse(sourceCode);
+ if (rst!=null){
+ if (CodeTypeEnum.CLASS.getType().equals(rst.getKey())){
+ return codeDesensitizeForClass(sourceCode, rst.getValue(), req.getSensitiveWordConfigBo());
+ }
+ if (CodeTypeEnum.METHOD.getType().equals(rst.getKey())){
+ return codeDesensitizeForClass(tmpClassNamePrefix + sourceCode + tmpClassNameSuffix, rst.getValue(), req.getSensitiveWordConfigBo());
+ }
+ }
+ return "";
+ }
+
+ private static synchronized TreeScanner getTreeScanner(List sensitiveWordConfigs){
+ if (scanner!=null){
+ return scanner;
+ }
+ final List sensitiveWordConfigList = CollectionUtils.isEmpty(sensitiveWordConfigs)?new ArrayList<>():sensitiveWordConfigs;
+ Context context = new Context();
+ JavacFileManager.preRegister(context);
+ TreeMaker treeMaker = TreeMaker.instance(context);
+ scanner = new TreeScanner() {
+ List keys = getConfiguredSensitiveKeys(sensitiveWordConfigList);
+ List values = getConfiguredSensitiveValues(sensitiveWordConfigList);
+ @Override
+ public Void visitVariable(VariableTree variableTree, Void aVoid) {
+ String key = variableTree.getName().toString();
+
+ //已初始化
+ if (variableTree.getInitializer()!=null) {
+ ExpressionTree initializer = variableTree.getInitializer();
+ if (initializer instanceof LiteralTree) {
+ String value = ((LiteralTree) initializer).getValue().toString();
+ String valueDesensitized = value;
+ if (isSensitiveKey(key, keys)){
+ valueDesensitized = maskValue(value, ipKeys.contains(key.toLowerCase())?"ip":"content");
+ }
+ Pair