|
@@ -0,0 +1,250 @@
|
|
|
+using NTERA.Engine.Compiler;
|
|
|
+
|
|
|
+namespace NTERA.Engine.Runtime
|
|
|
+{
|
|
|
+ public static class BaseDefinitions
|
|
|
+ {
|
|
|
+ public static FunctionVariable[] DefaultGlobalVariables { get; } =
|
|
|
+ {
|
|
|
+ new FunctionVariable("LOCAL", ValueType.Real),
|
|
|
+ new FunctionVariable("ABL", ValueType.Real),
|
|
|
+ new FunctionVariable("RESULT", ValueType.Real),
|
|
|
+ new FunctionVariable("SOURCE", ValueType.Real),
|
|
|
+ new FunctionVariable("ARG", ValueType.Real),
|
|
|
+ new FunctionVariable("GLOBAL", ValueType.Real),
|
|
|
+ new FunctionVariable("IS", ValueType.Real),
|
|
|
+ new FunctionVariable("CUP", ValueType.Real),
|
|
|
+ new FunctionVariable("CDOWN", ValueType.Real),
|
|
|
+ new FunctionVariable("UP", ValueType.Real),
|
|
|
+ new FunctionVariable("DOWN", ValueType.Real),
|
|
|
+ new FunctionVariable("DOWNBASE", ValueType.Real),
|
|
|
+ new FunctionVariable("COUNT", ValueType.Real),
|
|
|
+ new FunctionVariable("TCVAR", ValueType.Real),
|
|
|
+ new FunctionVariable("CDFLAG", ValueType.Real),
|
|
|
+ new FunctionVariable("ITEMPRICE", ValueType.Real),
|
|
|
+ new FunctionVariable("RANDDATA", ValueType.Real),
|
|
|
+ new FunctionVariable("LINECOUNT", ValueType.Real),
|
|
|
+ new FunctionVariable("ISTIMEOUT", ValueType.Real),
|
|
|
+ new FunctionVariable("__INT_MAX__", ValueType.Real),
|
|
|
+ new FunctionVariable("__INT_MIN__", ValueType.Real),
|
|
|
+ new FunctionVariable("RAND", ValueType.Real),
|
|
|
+ new FunctionVariable("CHARANUM", ValueType.Real),
|
|
|
+ new FunctionVariable("TALENT", ValueType.Real),
|
|
|
+ new FunctionVariable("FLAG", ValueType.Real),
|
|
|
+ new FunctionVariable("TFLAG", ValueType.Real),
|
|
|
+ new FunctionVariable("CFLAG", ValueType.Real),
|
|
|
+ new FunctionVariable("MASTER", ValueType.Real),
|
|
|
+ new FunctionVariable("BASE", ValueType.Real),
|
|
|
+ new FunctionVariable("MAXBASE", ValueType.Real),
|
|
|
+ new FunctionVariable("PALAM", ValueType.Real),
|
|
|
+ new FunctionVariable("TEQUIP", ValueType.Real),
|
|
|
+ new FunctionVariable("EQUIP", ValueType.Real),
|
|
|
+ new FunctionVariable("DAY", ValueType.Real),
|
|
|
+ new FunctionVariable("MARK", ValueType.Real),
|
|
|
+ new FunctionVariable("PALAMLV", ValueType.Real),
|
|
|
+ new FunctionVariable("TARGET", ValueType.Real),
|
|
|
+ new FunctionVariable("PLAYER", ValueType.Real),
|
|
|
+ new FunctionVariable("NOWEX", ValueType.Real),
|
|
|
+ new FunctionVariable("EX", ValueType.Real),
|
|
|
+ new FunctionVariable("STAIN", ValueType.Real),
|
|
|
+ new FunctionVariable("EXP", ValueType.Real),
|
|
|
+ new FunctionVariable("ASSIPLAY", ValueType.Real),
|
|
|
+ new FunctionVariable("ASSI", ValueType.Real),
|
|
|
+ new FunctionVariable("ITEM", ValueType.Real),
|
|
|
+ new FunctionVariable("EXPLV", ValueType.Real),
|
|
|
+ new FunctionVariable("TIME", ValueType.Real),
|
|
|
+ new FunctionVariable("MONEY", ValueType.Real),
|
|
|
+ new FunctionVariable("SELECTCOM", ValueType.Real),
|
|
|
+ new FunctionVariable("PREVCOM", ValueType.Real),
|
|
|
+ new FunctionVariable("NEXTCOM", ValueType.Real),
|
|
|
+ new FunctionVariable("DITEMTYPE", ValueType.Real),
|
|
|
+ new FunctionVariable("NO", ValueType.Real),
|
|
|
+ new FunctionVariable("RELATION", ValueType.Real),
|
|
|
+ new FunctionVariable("JUEL", ValueType.Real),
|
|
|
+ new FunctionVariable("GOTJUEL", ValueType.Real),
|
|
|
+ new FunctionVariable("EJAC", ValueType.Real),
|
|
|
+ new FunctionVariable("BOUGHT", ValueType.Real),
|
|
|
+ new FunctionVariable("ITEMSALES", ValueType.Real),
|
|
|
+ new FunctionVariable("FORWARD", ValueType.Real), //special casing for SORTCHARA
|
|
|
+ new FunctionVariable("BACK", ValueType.Real), //special casing for SORTCHARA
|
|
|
+ new FunctionVariable("LEFT", ValueType.Real), //special casing for __FORMAT
|
|
|
+ new FunctionVariable("RIGHT", ValueType.Real), //special casing for __FORMAT
|
|
|
+ new FunctionVariable("DEBUG_MODE", ValueType.Real),
|
|
|
+ new FunctionVariable("NOITEM", ValueType.Real),
|
|
|
+
|
|
|
+ new FunctionVariable("A", ValueType.Real),
|
|
|
+ new FunctionVariable("B", ValueType.Real),
|
|
|
+ new FunctionVariable("C", ValueType.Real),
|
|
|
+ new FunctionVariable("D", ValueType.Real),
|
|
|
+ new FunctionVariable("E", ValueType.Real),
|
|
|
+ new FunctionVariable("F", ValueType.Real),
|
|
|
+ new FunctionVariable("G", ValueType.Real),
|
|
|
+ new FunctionVariable("H", ValueType.Real),
|
|
|
+ new FunctionVariable("I", ValueType.Real),
|
|
|
+ new FunctionVariable("J", ValueType.Real),
|
|
|
+ new FunctionVariable("K", ValueType.Real),
|
|
|
+ new FunctionVariable("L", ValueType.Real),
|
|
|
+ new FunctionVariable("M", ValueType.Real),
|
|
|
+ new FunctionVariable("N", ValueType.Real),
|
|
|
+ new FunctionVariable("O", ValueType.Real),
|
|
|
+ new FunctionVariable("P", ValueType.Real),
|
|
|
+ new FunctionVariable("Q", ValueType.Real),
|
|
|
+ new FunctionVariable("R", ValueType.Real),
|
|
|
+ new FunctionVariable("S", ValueType.Real),
|
|
|
+ new FunctionVariable("T", ValueType.Real),
|
|
|
+ new FunctionVariable("U", ValueType.Real),
|
|
|
+ new FunctionVariable("V", ValueType.Real),
|
|
|
+ new FunctionVariable("W", ValueType.Real),
|
|
|
+ new FunctionVariable("X", ValueType.Real),
|
|
|
+ new FunctionVariable("Y", ValueType.Real),
|
|
|
+ new FunctionVariable("Z", ValueType.Real),
|
|
|
+
|
|
|
+ new FunctionVariable("LOCALS", ValueType.String),
|
|
|
+ new FunctionVariable("ARGS", ValueType.String),
|
|
|
+ new FunctionVariable("RESULTS", ValueType.String),
|
|
|
+ new FunctionVariable("CSTR", ValueType.String),
|
|
|
+ new FunctionVariable("GLOBALS", ValueType.String),
|
|
|
+ new FunctionVariable("NICKNAME", ValueType.String),
|
|
|
+ new FunctionVariable("MASTERNAME", ValueType.String),
|
|
|
+ new FunctionVariable("NAME", ValueType.String),
|
|
|
+ new FunctionVariable("TRAINNAME", ValueType.String),
|
|
|
+ new FunctionVariable("BASENAME", ValueType.String),
|
|
|
+ new FunctionVariable("EQUIPNAME", ValueType.String),
|
|
|
+ new FunctionVariable("TEQUIPNAME", ValueType.String),
|
|
|
+ new FunctionVariable("STAINNAME", ValueType.String),
|
|
|
+ new FunctionVariable("EXNAME", ValueType.String),
|
|
|
+ new FunctionVariable("SOURCENAME", ValueType.String),
|
|
|
+ new FunctionVariable("CALLNAME", ValueType.String),
|
|
|
+ new FunctionVariable("FLAGNAME", ValueType.String),
|
|
|
+ new FunctionVariable("TFLAGNAME", ValueType.String),
|
|
|
+ new FunctionVariable("CFLAGNAME", ValueType.String),
|
|
|
+ new FunctionVariable("TCVARNAME", ValueType.String),
|
|
|
+ new FunctionVariable("STRNAME", ValueType.String),
|
|
|
+ new FunctionVariable("TSTRNAME", ValueType.String),
|
|
|
+ new FunctionVariable("CSTRNAME", ValueType.String),
|
|
|
+ new FunctionVariable("SAVESTRNAME", ValueType.String),
|
|
|
+ new FunctionVariable("CDFLAGNAME", ValueType.String),
|
|
|
+ new FunctionVariable("GLOBALNAME", ValueType.String),
|
|
|
+ new FunctionVariable("GLOBALSNAME", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_AUTHOR", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_INFO", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_YEAR", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_TITLE", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_GAMECODE", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_VERSION", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_ALLOWVERSION", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_DEFAULTCHARA", ValueType.String),
|
|
|
+ new FunctionVariable("GAMEBASE_NOITEM", ValueType.String),
|
|
|
+ new FunctionVariable("WINDOW_TITLE", ValueType.String),
|
|
|
+ new FunctionVariable("MONEYLABEL", ValueType.String),
|
|
|
+ new FunctionVariable("DRAWLINESTR", ValueType.String),
|
|
|
+ new FunctionVariable("LASTLOAD_VERSION", ValueType.String),
|
|
|
+ new FunctionVariable("LASTLOAD_NO", ValueType.String),
|
|
|
+ new FunctionVariable("LASTLOAD_TEXT", ValueType.String),
|
|
|
+ new FunctionVariable("SAVEDATA_TEXT", ValueType.String),
|
|
|
+ new FunctionVariable("TSTR", ValueType.String),
|
|
|
+ new FunctionVariable("STR", ValueType.String),
|
|
|
+ new FunctionVariable("SAVESTR", ValueType.String),
|
|
|
+ new FunctionVariable("ABLNAME", ValueType.String),
|
|
|
+ new FunctionVariable("MARKNAME", ValueType.String),
|
|
|
+ new FunctionVariable("TALENTNAME", ValueType.String),
|
|
|
+ new FunctionVariable("ITEMNAME", ValueType.String),
|
|
|
+ new FunctionVariable("PALAMNAME", ValueType.String),
|
|
|
+ new FunctionVariable("EXPNAME", ValueType.String)
|
|
|
+ };
|
|
|
+
|
|
|
+ public static FunctionDefinition[] DefaultGlobalFunctions { get; } =
|
|
|
+ {
|
|
|
+ new FunctionDefinition("ABS", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SQRT", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SIGN", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVCALLNAME", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOFULL", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOINT", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("RAND", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("VARSIZE", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOSTR", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0], "") }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOUPPER", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOLOWER", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOHALF", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOFULL", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("TOUPPER", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("ISNUMERIC", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("LOG10", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("ESCAPE", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("STRCOUNT", new[] { new FunctionParameter("input", new string[0]), new FunctionParameter("match", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("MIN", new[] { new FunctionParameter("a", new string[0], isArrayParameter: true) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("MAX", new[] { new FunctionParameter("a", new string[0], isArrayParameter: true) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("POWER", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETPALAMLV", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETBIT", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETEXPLV", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("UNICODE", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("MATCH", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]), new FunctionParameter("c", new string[0], "a"), new FunctionParameter("d", new string[0], "f") }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("INRANGE", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("b", new string[0]), new FunctionParameter("c", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("HE_SHE", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SUBSTRING", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("STRLENS", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVNAME", new[] { new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVNAME", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVBASE", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVTALENT", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVCFLAG", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVRELATION", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVCSTR", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVEXP", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CSVABL", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETNUM", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("FINDCHARA", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("LIMIT", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SUMCARRAY", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("MAXCARRAY", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SUBSTRINGU", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("FINDELEMENT", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0]) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GROUPMATCH", new[] { new FunctionParameter("a", new string[0]), new FunctionParameter("a", new string[0], isArrayParameter: true) }, new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETTIME", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("SAVENOS", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETCOLOR", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("CURRENTREDRAW", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETFONT", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL"),
|
|
|
+ new FunctionDefinition("GETMILLISECOND", new FunctionParameter[0], new FunctionVariable[0], true, "_GLOBAL")
|
|
|
+ };
|
|
|
+
|
|
|
+ public static Keyword[] DefaultKeywords { get; } =
|
|
|
+ {
|
|
|
+ new Keyword("DRAWLINEFORM", true, true),
|
|
|
+ new Keyword("PRINTFORML", true, true),
|
|
|
+ new Keyword("DATAFORM", true, true),
|
|
|
+ new Keyword("PRINTFORMD", true, true),
|
|
|
+ new Keyword("PRINTFORMDL", true, true),
|
|
|
+ new Keyword("PRINTFORMW", true, true),
|
|
|
+ new Keyword("PRINTFORMDW", true, true),
|
|
|
+ new Keyword("PRINTFORMC", true, true),
|
|
|
+ new Keyword("PRINTFORMLC", true, true),
|
|
|
+ new Keyword("PRINTFORM", true, true),
|
|
|
+ new Keyword("PRINTPLAINFORM", true, true),
|
|
|
+ new Keyword("DEBUGPRINTFORM", true, true),
|
|
|
+ new Keyword("DEBUGPRINTFORML", true, true),
|
|
|
+ new Keyword("THROW", true, true),
|
|
|
+
|
|
|
+ new Keyword("PRINT", true),
|
|
|
+ new Keyword("PRINTD", true),
|
|
|
+ new Keyword("PRINTDW", true),
|
|
|
+ new Keyword("PRINTDL", true),
|
|
|
+ new Keyword("PRINTW", true),
|
|
|
+ new Keyword("PRINTV", true),
|
|
|
+ new Keyword("PRINTL", true),
|
|
|
+ new Keyword("PRINTLC", true),
|
|
|
+ new Keyword("PRINTC", true),
|
|
|
+ new Keyword("ALIGNMENT", true),
|
|
|
+ new Keyword("CALL", true, true),
|
|
|
+ new Keyword("CUSTOMDRAWLINE", true),
|
|
|
+ new Keyword("GOTO", true),
|
|
|
+ new Keyword("DEBUGPRINTL", true),
|
|
|
+ new Keyword("REUSELASTLINE", true),
|
|
|
+ new Keyword("PRINTPLAIN", true),
|
|
|
+ new Keyword("PRINT_TRAIN_NAME", true),
|
|
|
+ new Keyword("PRINT_STR", true),
|
|
|
+ };
|
|
|
+ }
|
|
|
+}
|