diff --git a/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java b/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java --- a/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java +++ b/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java @@ -52,6 +52,7 @@ import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; import javax.swing.text.Document; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.lexer.Token; @@ -256,8 +257,11 @@ private static class ReferenceSpanFinder { private static final int RECURSION_LIMIT = 100; + // e.g. @var VarType $variable + private static final Pattern INLINE_PHP_VAR_COMMENT_PATTERN = Pattern.compile("^[ \t]*@var[ \t]+.+[ \t]+\\$.+$"); // NOI18N + private static final Logger LOGGER = Logger.getLogger(DeclarationFinderImpl.class.getName()); + private int recursionCounter = 0; - private static final Logger LOGGER = Logger.getLogger(DeclarationFinderImpl.class.getName()); private final Model model; public ReferenceSpanFinder(final Model model) { @@ -294,6 +298,13 @@ } } } else if (id.equals(PHPTokenId.PHPDOC_COMMENT)) { + String tokenText = token.text().toString(); + if (INLINE_PHP_VAR_COMMENT_PATTERN.matcher(tokenText).matches()) { + OffsetRange offsetRange = getVarCommentOffsetRange(ts, tokenText, caretOffset); + if (offsetRange != null) { + return offsetRange; + } + } PHPDocCommentParser docParser = new PHPDocCommentParser(); PHPDocBlock docBlock = docParser.parse(ts.offset() - 3, ts.offset() + token.length(), token.text().toString()); ASTNode[] hierarchy = Utils.getNodeHierarchyAtOffset(docBlock, caretOffset); @@ -349,30 +360,10 @@ } } } else if (id.equals(PHPTokenId.PHP_COMMENT) && token.text() != null) { - String text = token.text().toString(); - final String dollaredVar = "@var"; - if (text.contains(dollaredVar)) { - String[] segments = text.split("\\s"); - for (int i = 0; i < segments.length; i++) { - String seg = segments[i]; - if (seg.equals(dollaredVar) && segments.length > i + 2) { - for (int j = 1; j <= 2; j++) { - seg = segments[i + j]; - if (seg != null && seg.trim().length() > 0) { - int indexOf = text.indexOf(seg); - assert indexOf != -1; - indexOf += ts.offset(); - OffsetRange range = new OffsetRange(indexOf, indexOf + seg.length()); - if (range.containsInclusive(caretOffset)) { - return range; - } - } - } - return OffsetRange.NONE; - } - } + OffsetRange offsetRange = getVarCommentOffsetRange(ts, token.text().toString(), caretOffset); + if (offsetRange != null) { + return offsetRange; } - } } if (caretOffset == startTSOffset) { @@ -388,6 +379,33 @@ return OffsetRange.NONE; } + @CheckForNull + private OffsetRange getVarCommentOffsetRange(TokenSequence ts, String text, int caretOffset) { + final String dollaredVar = "@var"; // NOI18N + if (text.contains(dollaredVar)) { + String[] segments = text.split("[ \t]+"); // NOI18N + for (int i = 0; i < segments.length; i++) { + String seg = segments[i]; + if (seg.equals(dollaredVar) && segments.length > i + 2) { + for (int j = 1; j <= 2; j++) { + seg = segments[i + j]; + if (seg != null && seg.trim().length() > 0) { + int indexOf = text.indexOf(seg); + assert indexOf != -1; + indexOf += ts.offset(); + OffsetRange range = new OffsetRange(indexOf, indexOf + seg.length()); + if (range.containsInclusive(caretOffset)) { + return range; + } + } + } + return OffsetRange.NONE; + } + } + } + return null; + } + private void logRecursion(TokenSequence ts) { CharSequence tokenText = null; if (ts != null) { diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java --- a/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java +++ b/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 17/04/23 9:54 */ +/* The following code was generated by JFlex 1.4.3 on 17/07/09 10:32 */ /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. @@ -56,7 +56,7 @@ /** * This class is a scanner generated by * JFlex 1.4.3 - * on 17/04/23 9:54 from the specification file + * on 17/07/09 10:32 from the specification file * /home/junichi11/hg/web-main/php.editor/tools/ASTPHP5Scanner.flex */ public class ASTPHP5Scanner implements Scanner { @@ -234,29 +234,29 @@ "\1\175\1\47\1\175\1\176\1\1\1\176\2\1\1\175"+ "\1\177\1\0\1\177\1\0\2\150\1\200\2\0\6\6"+ "\1\201\1\202\1\6\1\203\23\6\1\204\12\6\1\205"+ - "\1\6\1\206\5\6\12\0\11\6\4\0\1\207\2\0"+ + "\1\6\1\206\5\6\12\0\11\6\5\0\1\207\3\0"+ "\1\45\1\47\1\1\2\0\1\6\1\210\5\6\1\211"+ "\1\6\1\212\1\213\4\6\1\214\1\6\1\215\1\216"+ "\3\6\1\217\2\6\1\220\1\6\1\221\2\6\1\222"+ "\1\223\1\224\4\6\1\225\1\226\2\6\1\227\2\6"+ - "\5\0\1\230\6\0\11\6\2\231\4\0\4\232\2\233"+ + "\5\0\1\230\6\0\11\6\2\231\5\0\4\232\2\233"+ "\1\0\2\6\1\234\2\6\1\235\7\6\1\236\7\6"+ "\1\237\1\240\1\241\1\6\1\0\1\242\1\243\2\6"+ - "\4\0\1\244\5\0\1\245\11\6\5\0\1\246\6\6"+ + "\4\0\1\244\5\0\1\245\11\6\6\0\1\246\6\6"+ "\1\247\3\6\1\250\1\251\1\252\1\6\1\253\3\6"+ "\1\254\1\0\1\255\1\6\1\256\3\0\1\257\1\0"+ - "\1\6\1\260\7\6\2\261\3\0\3\6\1\262\1\263"+ + "\1\6\1\260\7\6\2\261\4\0\3\6\1\262\1\263"+ "\5\6\1\264\1\6\1\265\1\266\1\6\1\0\1\6"+ - "\1\267\1\270\1\6\1\271\3\6\1\272\2\6\4\0"+ + "\1\267\1\270\1\6\1\271\3\6\1\272\2\6\5\0"+ "\2\6\1\273\1\274\1\6\1\275\2\6\1\276\1\6"+ - "\1\0\1\277\1\300\2\6\1\301\2\6\3\0\1\302"+ + "\1\0\1\277\1\300\2\6\1\301\2\6\5\0\1\302"+ "\1\303\1\6\1\304\1\305\1\6\1\306\2\6\1\307"+ - "\1\6\5\0\5\6\5\0\1\310\1\311\1\312\2\6"+ - "\1\313\2\0\1\314\1\6\1\0\1\6\1\0\1\6"+ - "\7\0\1\315\7\0\1\75\1\0"; + "\1\6\10\0\5\6\7\0\1\310\1\311\1\312\2\6"+ + "\1\0\1\313\2\0\1\314\1\6\5\0\1\6\1\315"+ + "\3\0\1\6\7\0\1\316\7\0\1\75\1\0"; private static int [] zzUnpackAction() { - int [] result = new int[764]; + int [] result = new int[785]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -339,47 +339,50 @@ "\0\u07b4\0\u51d0\0\u07b4\0\u5214\0\u5258\0\u529c\0\u52e0\0\u5324"+ "\0\u5368\0\u53ac\0\u53f0\0\u5434\0\u5478\0\u54bc\0\u5500\0\u5544"+ "\0\u5588\0\u55cc\0\u5610\0\u5654\0\u5698\0\u56dc\0\u5720\0\u5764"+ - "\0\u57a8\0\u57ec\0\u5830\0\u5874\0\u58b8\0\u58fc\0\u5940\0\u0550"+ - "\0\u5984\0\u59c8\0\u5a0c\0\u5a50\0\u5a94\0\u5ad8\0\u5b1c\0\u5b60"+ - "\0\u07b4\0\u5ba4\0\u5be8\0\u5c2c\0\u5c70\0\u5cb4\0\u07b4\0\u5cf8"+ - "\0\u07b4\0\u07b4\0\u5d3c\0\u5d80\0\u5dc4\0\u5e08\0\u07b4\0\u5e4c"+ - "\0\u07b4\0\u07b4\0\u5e90\0\u5ed4\0\u5f18\0\u5f5c\0\u5fa0\0\u5fe4"+ - "\0\u07b4\0\u6028\0\u07b4\0\u606c\0\u60b0\0\u07b4\0\u07b4\0\u07b4"+ - "\0\u60f4\0\u6138\0\u617c\0\u61c0\0\u6204\0\u07b4\0\u6248\0\u628c"+ - "\0\u07b4\0\u62d0\0\u6314\0\u6358\0\u639c\0\u63e0\0\u6424\0\u6468"+ - "\0\u0550\0\u64ac\0\u64f0\0\u6534\0\u6578\0\u65bc\0\u6600\0\u6644"+ + "\0\u57a8\0\u57ec\0\u5830\0\u5874\0\u58b8\0\u58fc\0\u5940\0\u5984"+ + "\0\u0550\0\u59c8\0\u5a0c\0\u5a50\0\u5a94\0\u5ad8\0\u5b1c\0\u5b60"+ + "\0\u5ba4\0\u5be8\0\u07b4\0\u5c2c\0\u5c70\0\u5cb4\0\u5cf8\0\u5d3c"+ + "\0\u07b4\0\u5d80\0\u07b4\0\u07b4\0\u5dc4\0\u5e08\0\u5e4c\0\u5e90"+ + "\0\u07b4\0\u5ed4\0\u07b4\0\u07b4\0\u5f18\0\u5f5c\0\u5fa0\0\u5fe4"+ + "\0\u6028\0\u606c\0\u07b4\0\u60b0\0\u07b4\0\u60f4\0\u6138\0\u07b4"+ + "\0\u07b4\0\u07b4\0\u617c\0\u61c0\0\u6204\0\u6248\0\u628c\0\u07b4"+ + "\0\u62d0\0\u6314\0\u07b4\0\u6358\0\u639c\0\u63e0\0\u6424\0\u6468"+ + "\0\u64ac\0\u64f0\0\u0550\0\u6534\0\u6578\0\u65bc\0\u6600\0\u6644"+ "\0\u6688\0\u66cc\0\u6710\0\u6754\0\u6798\0\u67dc\0\u6820\0\u6864"+ - "\0\u0550\0\u68a8\0\u68ec\0\u6930\0\u6974\0\u69b8\0\u0550\0\u1144"+ - "\0\u1254\0\u1364\0\u0550\0\u69fc\0\u6a40\0\u6a84\0\u6ac8\0\u6b0c"+ - "\0\u6b50\0\u6b94\0\u07b4\0\u6bd8\0\u6c1c\0\u6c60\0\u6ca4\0\u6ce8"+ - "\0\u6d2c\0\u6d70\0\u07b4\0\u6db4\0\u6df8\0\u6e3c\0\u6e80\0\u6ec4"+ - "\0\u6f08\0\u6f4c\0\u07b4\0\u07b4\0\u07b4\0\u6f90\0\u6fd4\0\u07b4"+ - "\0\u07b4\0\u7018\0\u705c\0\u70a0\0\u70e4\0\u7128\0\u716c\0\u0550"+ - "\0\u71b0\0\u71f4\0\u7238\0\u727c\0\u72c0\0\u0550\0\u7304\0\u7348"+ - "\0\u738c\0\u73d0\0\u7414\0\u7458\0\u749c\0\u74e0\0\u7524\0\u7568"+ - "\0\u75ac\0\u75f0\0\u7634\0\u7678\0\u07b4\0\u76bc\0\u7700\0\u7744"+ - "\0\u7788\0\u77cc\0\u7810\0\u7854\0\u7898\0\u78dc\0\u7920\0\u07b4"+ - "\0\u07b4\0\u07b4\0\u7964\0\u07b4\0\u79a8\0\u79ec\0\u7a30\0\u7a74"+ - "\0\u7ab8\0\u07b4\0\u7afc\0\u0550\0\u7b40\0\u7b84\0\u7bc8\0\u0550"+ - "\0\u7c0c\0\u7c50\0\u07b4\0\u7c94\0\u7cd8\0\u7d1c\0\u7d60\0\u7da4"+ - "\0\u7de8\0\u7e2c\0\u0550\0\u7e70\0\u7eb4\0\u7ef8\0\u7f3c\0\u7f80"+ - "\0\u7fc4\0\u8008\0\u07b4\0\u07b4\0\u804c\0\u8090\0\u80d4\0\u8118"+ - "\0\u815c\0\u07b4\0\u81a0\0\u07b4\0\u07b4\0\u81e4\0\u8228\0\u826c"+ - "\0\u0550\0\u0550\0\u82b0\0\u07b4\0\u82f4\0\u8338\0\u837c\0\u07b4"+ - "\0\u83c0\0\u8404\0\u8448\0\u848c\0\u84d0\0\u8514\0\u8558\0\u859c"+ - "\0\u07b4\0\u07b4\0\u85e0\0\u07b4\0\u8624\0\u8668\0\u07b4\0\u86ac"+ - "\0\u86f0\0\u07b4\0\u07b4\0\u8734\0\u8778\0\u07b4\0\u87bc\0\u8800"+ - "\0\u8844\0\u8888\0\u88cc\0\u07b4\0\u07b4\0\u8910\0\u07b4\0\u07b4"+ - "\0\u8954\0\u0550\0\u8998\0\u89dc\0\u07b4\0\u8a20\0\u8a64\0\u8aa8"+ - "\0\u8aec\0\u8b30\0\u8b74\0\u8bb8\0\u8bfc\0\u8c40\0\u8c84\0\u8cc8"+ - "\0\u8d0c\0\u8d50\0\u8d94\0\u8dd8\0\u8e1c\0\u07b4\0\u07b4\0\u07b4"+ - "\0\u8e60\0\u8ea4\0\u0550\0\u8ee8\0\u8f2c\0\u07b4\0\u8f70\0\u8fb4"+ - "\0\u8ff8\0\u903c\0\u9080\0\u90c4\0\u9108\0\u914c\0\u9190\0\u91d4"+ - "\0\u9218\0\u925c\0\u0550\0\u92a0\0\u92e4\0\u9328\0\u936c\0\u93b0"+ - "\0\u93f4\0\u9438\0\u0550\0\u947c"; + "\0\u68a8\0\u68ec\0\u0550\0\u6930\0\u6974\0\u69b8\0\u69fc\0\u6a40"+ + "\0\u6a84\0\u0550\0\u1144\0\u1254\0\u1364\0\u0550\0\u6ac8\0\u6b0c"+ + "\0\u6b50\0\u6b94\0\u6bd8\0\u6c1c\0\u6c60\0\u07b4\0\u6ca4\0\u6ce8"+ + "\0\u6d2c\0\u6d70\0\u6db4\0\u6df8\0\u6e3c\0\u07b4\0\u6e80\0\u6ec4"+ + "\0\u6f08\0\u6f4c\0\u6f90\0\u6fd4\0\u7018\0\u07b4\0\u07b4\0\u07b4"+ + "\0\u705c\0\u70a0\0\u07b4\0\u07b4\0\u70e4\0\u7128\0\u716c\0\u71b0"+ + "\0\u71f4\0\u7238\0\u0550\0\u727c\0\u72c0\0\u7304\0\u7348\0\u738c"+ + "\0\u0550\0\u73d0\0\u7414\0\u7458\0\u749c\0\u74e0\0\u7524\0\u7568"+ + "\0\u75ac\0\u75f0\0\u7634\0\u7678\0\u76bc\0\u7700\0\u7744\0\u7788"+ + "\0\u07b4\0\u77cc\0\u7810\0\u7854\0\u7898\0\u78dc\0\u7920\0\u7964"+ + "\0\u79a8\0\u79ec\0\u7a30\0\u07b4\0\u07b4\0\u07b4\0\u7a74\0\u07b4"+ + "\0\u7ab8\0\u7afc\0\u7b40\0\u7b84\0\u7bc8\0\u07b4\0\u7c0c\0\u0550"+ + "\0\u7c50\0\u7c94\0\u7cd8\0\u0550\0\u7d1c\0\u7d60\0\u07b4\0\u7da4"+ + "\0\u7de8\0\u7e2c\0\u7e70\0\u7eb4\0\u7ef8\0\u7f3c\0\u0550\0\u7f80"+ + "\0\u7fc4\0\u8008\0\u804c\0\u8090\0\u80d4\0\u8118\0\u815c\0\u07b4"+ + "\0\u07b4\0\u81a0\0\u81e4\0\u8228\0\u826c\0\u82b0\0\u07b4\0\u82f4"+ + "\0\u07b4\0\u07b4\0\u8338\0\u837c\0\u83c0\0\u0550\0\u0550\0\u8404"+ + "\0\u07b4\0\u8448\0\u848c\0\u84d0\0\u07b4\0\u8514\0\u8558\0\u859c"+ + "\0\u85e0\0\u8624\0\u8668\0\u86ac\0\u86f0\0\u8734\0\u07b4\0\u07b4"+ + "\0\u8778\0\u07b4\0\u87bc\0\u8800\0\u07b4\0\u8844\0\u8888\0\u07b4"+ + "\0\u07b4\0\u88cc\0\u8910\0\u07b4\0\u8954\0\u8998\0\u89dc\0\u8a20"+ + "\0\u8a64\0\u8aa8\0\u8aec\0\u07b4\0\u07b4\0\u8b30\0\u07b4\0\u07b4"+ + "\0\u8b74\0\u0550\0\u8bb8\0\u8bfc\0\u07b4\0\u8c40\0\u8c84\0\u8cc8"+ + "\0\u8d0c\0\u8d50\0\u8d94\0\u8dd8\0\u8e1c\0\u8e60\0\u8ea4\0\u8ee8"+ + "\0\u8f2c\0\u8f70\0\u8fb4\0\u8ff8\0\u903c\0\u9080\0\u90c4\0\u9108"+ + "\0\u914c\0\u9190\0\u07b4\0\u07b4\0\u07b4\0\u91d4\0\u9218\0\u925c"+ + "\0\u0550\0\u92a0\0\u92e4\0\u07b4\0\u9328\0\u936c\0\u93b0\0\u93f4"+ + "\0\u9438\0\u947c\0\u94c0\0\u936c\0\u9504\0\u9548\0\u958c\0\u95d0"+ + "\0\u9614\0\u9658\0\u969c\0\u96e0\0\u9724\0\u9768\0\u97ac\0\u0550"+ + "\0\u97f0\0\u9834\0\u9878\0\u98bc\0\u9900\0\u9944\0\u9988\0\u0550"+ + "\0\u99cc"; private static int [] zzUnpackRowMap() { - int [] result = new int[764]; + int [] result = new int[785]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -780,453 +783,479 @@ "\1\36\2\0\3\36\17\0\1\36\5\0\1\u01d4\2\0"+ "\3\u01d4\1\0\2\u01d4\3\0\1\u0172\2\0\1\u01d5\4\0"+ "\22\u01d4\3\0\1\u01d4\2\0\3\u01d4\17\0\1\u01d4\1\u01d6"+ - "\36\0\1\u01d7\64\0\3\u0175\56\0\1\u0177\71\0\1\u01d8"+ - "\72\0\1\u01d9\45\0\1\u0178\103\0\1\u017a\137\0\1\u01da"+ - "\31\0\15\116\1\363\3\116\1\364\1\0\1\116\1\365"+ - "\25\116\1\u01db\31\116\15\123\1\375\3\123\1\376\1\123"+ - "\1\0\1\377\25\123\1\u01dc\31\123\15\130\1\u0104\1\u0182"+ - "\1\130\1\u0182\1\u0105\2\130\1\u0106\74\130\1\u0104\1\u0184"+ - "\1\130\1\u0184\1\u0105\2\130\1\u0106\74\130\1\u0104\1\132"+ - "\1\130\1\132\1\u0105\2\130\1\u0106\25\130\1\u01dd\31\130"+ - "\16\u010f\1\u0188\1\u010f\1\u0188\101\u010f\1\u018a\1\u010f\1\u018a"+ - "\63\u010f\50\0\1\u01de\62\0\1\u01df\55\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\5\36\1\u01e0\14\36\3\0"+ + "\36\0\1\u01d7\64\0\3\u0175\56\0\1\u0177\22\0\3\u01d8"+ + "\44\0\1\u01d9\11\0\1\u01da\60\0\1\u01db\45\0\1\u0178"+ + "\103\0\1\u017a\137\0\1\u01dc\31\0\15\116\1\363\3\116"+ + "\1\364\1\0\1\116\1\365\25\116\1\u01dd\31\116\15\123"+ + "\1\375\3\123\1\376\1\123\1\0\1\377\25\123\1\u01de"+ + "\31\123\15\130\1\u0104\1\u0182\1\130\1\u0182\1\u0105\2\130"+ + "\1\u0106\74\130\1\u0104\1\u0184\1\130\1\u0184\1\u0105\2\130"+ + "\1\u0106\74\130\1\u0104\1\132\1\130\1\132\1\u0105\2\130"+ + "\1\u0106\25\130\1\u01df\31\130\16\u010f\1\u0188\1\u010f\1\u0188"+ + "\101\u010f\1\u018a\1\u010f\1\u018a\63\u010f\50\0\1\u01e0\62\0"+ + "\1\u01e1\55\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\5\36\1\u01e2\14\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\3\36\1\u01e3\16\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\u01e4\1\0\10\36\12\0"+ + "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\7\36\1\u01e5"+ + "\12\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\16\36\1\u01e6"+ + "\3\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\15\36\1\u01e7"+ + "\4\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\1\u01e8\21\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\12\36\1\u01e9\7\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\11\36\1\u01ea\10\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\12\36\1\u01eb\7\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\17\36\1\u01ec\2\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\11\36\1\u01ed\10\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\4\36\1\u01ee\15\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\u01ef\1\0\2\36\1\u01f0\5\36\12\0\22\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\1\36\1\u01f1\20\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\u01f2\1\0\10\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\1\36\1\u01f3\20\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\16\36\1\u01f4\3\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\4\36\1\u01f5\15\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\5\36\1\u01f6\14\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\2\36\1\u01f7\5\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\13\36\1\u01f8\6\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\1\36\1\u01f9\20\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\2\36\1\u01fa\5\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\1\36\1\u01fb\20\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\10\36\1\u01fc\11\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\u01fc\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\15\36\1\u01fd\4\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\2\36\1\u01fe\5\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\1\u01ff\21\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\1\36\1\u0200\20\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\10\36\1\u0201\11\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\u0201\3\0\1\36\1\0\1\u0202\1\0"+ + "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\1\u0203\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\6\36"+ + "\1\u0204\13\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\11\36"+ + "\1\u0205\10\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u0206"+ + "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u0207"+ + "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\u0208\1\0\10\36\12\0\22\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\3\36\1\u01e1\16\36\3\0"+ + "\1\36\1\0\2\36\1\u0209\5\36\12\0\22\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\u01e2\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\36\1\0\10\36\12\0\1\u020a\21\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\1\36\1\u020b\20\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\2\36\1\u020c\5\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u020d"+ + "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\11\0\1\u020e\103\0\1\u020f\136\0\1\u0210"+ + "\44\0\1\u0211\13\0\1\u0212\36\0\1\u0213\35\0\1\u0214"+ + "\102\0\1\u0215\77\0\1\u0216\103\0\1\u0217\127\0\1\u0218"+ + "\116\0\1\u0219\42\0\1\36\1\0\1\36\1\0\2\36"+ + "\1\u021a\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\11\36\1\u021b\10\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\13\36\1\u021c\6\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\5\36\1\u021d\14\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\14\36\1\u021e\5\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\2\36"+ + "\1\u021f\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\5\36\1\u0220\14\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\1\36\1\u0221\20\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\13\36\1\u0222\6\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\u01d4\1\0\1\u01d4\1\0\10\u01d4"+ + "\1\0\1\u0223\1\0\1\u0224\6\0\22\u01d4\3\0\1\u01d4"+ + "\2\0\3\u01d4\17\0\1\u01d4\5\0\1\u0225\2\0\3\u0225"+ + "\1\0\2\u0225\13\0\22\u0225\3\0\1\u0225\2\0\3\u0225"+ + "\17\0\1\u0225\5\0\1\u0226\2\0\3\u0226\1\0\2\u0226"+ + "\13\0\22\u0226\3\0\1\u0226\2\0\3\u0226\17\0\1\u0226"+ + "\42\0\1\u0227\61\0\3\u01d8\56\0\1\u01da\60\0\1\u0228"+ + "\36\0\1\u0229\77\0\1\u022a\2\0\3\u022a\2\0\1\u022a"+ + "\13\0\22\u022a\3\0\1\u022a\2\0\3\u022a\17\0\1\u022a"+ + "\2\0\3\116\1\u022b\2\116\3\u022b\2\116\1\u022b\1\116"+ + "\1\363\3\116\1\364\1\0\1\116\1\365\2\116\22\u022b"+ + "\3\116\1\u022b\2\116\3\u022b\17\116\1\u022b\2\116\3\123"+ + "\1\u022c\2\123\3\u022c\2\123\1\u022c\1\123\1\375\3\123"+ + "\1\376\1\123\1\0\1\377\2\123\22\u022c\3\123\1\u022c"+ + "\2\123\3\u022c\17\123\1\u022c\2\123\3\130\1\u022d\2\130"+ + "\3\u022d\2\130\1\u022d\1\130\1\u0104\1\132\1\130\1\132"+ + "\1\u0105\2\130\1\u0106\2\130\22\u022d\3\130\1\u022d\2\130"+ + "\3\u022d\17\130\1\u022d\2\130\16\0\2\u022e\1\u022f\133\0"+ + "\1\u0230\34\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\2\36\1\u0231\17\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\6\36\1\u0232\13\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\11\36\1\u0233\10\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\1\u0234\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u0235"+ + "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\3\36\1\u0236"+ + "\16\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\2\36\1\u0237\5\36\12\0"+ + "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\3\36\1\u0238"+ + "\16\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u0239"+ + "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\2\36\1\u023a\5\36\12\0"+ + "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\5\36\1\u023b"+ + "\14\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\14\36\1\u023c"+ + "\5\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u023d"+ + "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\u023e\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\11\36\1\u023f\10\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\13\36\1\u0240\6\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\1\u0241\21\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\6\36\1\u0242\13\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ + "\1\0\10\36\12\0\21\36\1\u0243\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\7\36\1\u01e3\12\36\3\0\1\36\2\0"+ + "\3\36\1\u0244\4\36\12\0\22\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\16\36\1\u01e4\3\36\3\0\1\36\2\0"+ + "\10\36\12\0\5\36\1\u0245\14\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\15\36\1\u01e5\4\36\3\0\1\36\2\0"+ + "\10\36\12\0\6\36\1\u0246\13\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\1\u01e6\21\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\12\36\1\u01e7\7\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\11\36\1\u01e8\10\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\12\36\1\u01e9\7\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\17\36\1\u01ea\2\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\11\36\1\u01eb\10\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\4\36\1\u01ec\15\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\u01ed\1\0\2\36"+ - "\1\u01ee\5\36\12\0\22\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\1\36\1\u01ef\20\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\u01f0\1\0\10\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u01f1\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\16\36"+ - "\1\u01f2\3\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\4\36"+ - "\1\u01f3\15\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\5\36"+ - "\1\u01f4\14\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01f5\5\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\13\36"+ - "\1\u01f6\6\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u01f7\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01f8\5\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u01f9\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\10\36"+ - "\1\u01fa\11\36\3\0\1\36\2\0\3\36\17\0\1\u01fa"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\15\36"+ - "\1\u01fb\4\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\2\36\1\u01fc\5\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\u01fd"+ - "\21\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u01fe"+ - "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\10\36\1\u01ff"+ - "\11\36\3\0\1\36\2\0\3\36\17\0\1\u01ff\3\0"+ - "\1\36\1\0\1\u0200\1\0\10\36\12\0\22\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\1\u0201\21\36\3\0\1\36"+ + "\10\36\12\0\15\36\1\u0247\4\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\5\36\1\u0248\14\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\11\36\1\u0249\10\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\1\0\3\u024a\6\0\22\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\13\36\1\u024b\6\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\6\36\1\u024c\13\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\1\36\1\u024d\20\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\6\36\1\u024e\13\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\43\0\1\u024f\102\0\1\u0250\46\0"+ + "\1\u0251\13\0\1\u0252\36\0\1\u0253\74\0\1\u0254\53\0"+ + "\1\u0212\36\0\1\u0213\67\0\1\u0255\71\0\1\u0219\103\0"+ + "\1\u0256\110\0\1\u0257\102\0\1\u0258\66\0\1\u0219\36\0"+ + "\1\u0259\26\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\1\u025a\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+ + "\3\0\1\36\2\0\1\36\1\u025b\1\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\u025c\1\0\10\36\12\0\22\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\6\36\1\u025d\13\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ + "\1\0\1\u025e\1\0\10\36\12\0\22\36\3\0\1\36"+ "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\6\36\1\u0202\13\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\11\36\1\u0203\10\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\1\u0204\21\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\2\36\1\u0205\17\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0206\1\0"+ - "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\2\36\1\u0207"+ - "\5\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\1\u0208\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u0209\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\2\36\1\u020a\5\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\u020b\1\0\10\36\12\0\22\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\11\0\1\u020c"+ - "\103\0\1\u020d\136\0\1\u020e\44\0\1\u020f\13\0\1\u0210"+ - "\36\0\1\u0211\35\0\1\u0212\102\0\1\u0213\77\0\1\u0214"+ - "\103\0\1\u0215\127\0\1\u0216\116\0\1\u0217\42\0\1\36"+ - "\1\0\1\36\1\0\2\36\1\u0218\5\36\12\0\22\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\11\36\1\u0219\10\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\13\36\1\u021a\6\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\5\36\1\u021b\14\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\14\36\1\u021c\5\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\2\36\1\u021d\5\36\12\0\22\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\5\36\1\u021e\14\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\1\36\1\u021f\20\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\13\36\1\u0220\6\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\u01d4"+ - "\1\0\1\u01d4\1\0\10\u01d4\1\0\1\u0221\1\0\1\u0222"+ - "\6\0\22\u01d4\3\0\1\u01d4\2\0\3\u01d4\17\0\1\u01d4"+ - "\5\0\1\u0223\2\0\3\u0223\1\0\2\u0223\13\0\22\u0223"+ - "\3\0\1\u0223\2\0\3\u0223\17\0\1\u0223\5\0\1\u0224"+ - "\2\0\3\u0224\1\0\2\u0224\13\0\22\u0224\3\0\1\u0224"+ - "\2\0\3\u0224\17\0\1\u0224\42\0\1\u0225\52\0\1\u0226"+ - "\77\0\1\u0227\2\0\3\u0227\2\0\1\u0227\13\0\22\u0227"+ - "\3\0\1\u0227\2\0\3\u0227\17\0\1\u0227\2\0\3\116"+ - "\1\u0228\2\116\3\u0228\2\116\1\u0228\1\116\1\363\3\116"+ - "\1\364\1\0\1\116\1\365\2\116\22\u0228\3\116\1\u0228"+ - "\2\116\3\u0228\17\116\1\u0228\2\116\3\123\1\u0229\2\123"+ - "\3\u0229\2\123\1\u0229\1\123\1\375\3\123\1\376\1\123"+ - "\1\0\1\377\2\123\22\u0229\3\123\1\u0229\2\123\3\u0229"+ - "\17\123\1\u0229\2\123\3\130\1\u022a\2\130\3\u022a\2\130"+ - "\1\u022a\1\130\1\u0104\1\132\1\130\1\132\1\u0105\2\130"+ - "\1\u0106\2\130\22\u022a\3\130\1\u022a\2\130\3\u022a\17\130"+ - "\1\u022a\2\130\16\0\2\u022b\1\u022c\133\0\1\u022d\34\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u022e"+ - "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u022f"+ - "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\11\36\1\u0230"+ - "\10\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\1\u0231\21\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\1\u0232\21\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\3\36\1\u0233\16\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\2\36\1\u0234\5\36\12\0\22\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\3\36\1\u0235\16\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\2\36\1\u0236\17\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\2\36\1\u0237\5\36\12\0\22\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\5\36\1\u0238\14\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\14\36\1\u0239\5\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\13\36\1\u023a\6\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\u023b\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\11\36\1\u023c\10\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\13\36\1\u023d\6\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\1\u023e\21\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\6\36\1\u023f\13\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\21\36\1\u0240\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\3\36\1\u0241"+ - "\4\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\5\36\1\u0242\14\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\6\36\1\u0243\13\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\15\36\1\u0244\4\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\5\36\1\u0245\14\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\11\36\1\u0246\10\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\1\0"+ - "\3\u0247\6\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\13\36\1\u0248\6\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\6\36\1\u0249\13\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\1\36\1\u024a\20\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\6\36\1\u024b\13\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\43\0\1\u024c\102\0\1\u024d\46\0\1\u024e\13\0"+ - "\1\u024f\36\0\1\u0250\74\0\1\u0251\53\0\1\u0210\36\0"+ - "\1\u0211\67\0\1\u0252\71\0\1\u0217\103\0\1\u0253\110\0"+ - "\1\u0254\102\0\1\u0255\66\0\1\u0217\36\0\1\u0256\26\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\1\u0257\21\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+ - "\2\0\1\36\1\u0258\1\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\u0259\1\0\10\36\12\0\22\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\6\36\1\u025a\13\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u025b"+ + "\1\0\10\36\12\0\10\36\1\u025f\11\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\u025f\3\0\1\36\1\0\1\u0260"+ "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\10\36\1\u025c\11\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\u025c\3\0\1\36\1\0\1\u025d\1\0\10\36"+ - "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\15\36"+ - "\1\u025e\4\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u025f\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\20\0\1\u0221\66\0\1\u0223\1\0\1\u0223\1\0\10\u0223"+ - "\5\0\1\u0260\4\0\22\u0223\3\0\1\u0223\2\0\3\u0223"+ - "\17\0\1\u0223\3\0\1\u0224\1\0\1\u0224\1\0\10\u0224"+ - "\12\0\22\u0224\3\0\1\u0224\2\0\3\u0224\17\0\1\u0224"+ - "\1\u0261\30\0\1\u0262\114\0\1\u0263\61\0\1\u022b\115\0"+ - "\1\u0264\54\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\10\36\1\u0265\11\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\u0265\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\13\36\1\u0266\6\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\u0267\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u0268"+ - "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u0269"+ - "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u026a"+ - "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\2\36\1\u026b\5\36\12\0"+ - "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\u026c\1\0\10\36\12\0\22\36\3\0"+ + "\12\0\15\36\1\u0261\4\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\1\36\1\u0262\20\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\20\0\1\u0223\66\0\1\u0225\1\0\1\u0225"+ + "\1\0\10\u0225\5\0\1\u0263\4\0\22\u0225\3\0\1\u0225"+ + "\2\0\3\u0225\17\0\1\u0225\3\0\1\u0226\1\0\1\u0226"+ + "\1\0\10\u0226\12\0\22\u0226\3\0\1\u0226\2\0\3\u0226"+ + "\17\0\1\u0226\1\u0264\30\0\1\u0265\63\0\1\u0266\134\0"+ + "\1\u0267\61\0\1\u022e\115\0\1\u0268\54\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\10\36\1\u0269\11\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\u0269\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\13\36\1\u026a\6\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\2\36\1\u026d\17\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\6\36\1\u026e\13\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\u026f\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\u026b\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\1\36\1\u0270\20\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0271\1\0"+ + "\10\36\12\0\1\36\1\u026c\20\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\13\36\1\u026d\6\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\6\36\1\u026e\13\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\2\36\1\u026f\5\36\12\0\22\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\u0270\1\0"+ "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\12\36\1\u0272\7\36\3\0\1\36\2\0\3\36\17\0"+ + "\2\36\1\u0271\17\36\3\0\1\36\2\0\3\36\17\0"+ "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\7\36\1\u0273\12\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\15\36\1\u0274\4\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\2\36\1\u0275"+ - "\5\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\13\36\1\u0276\6\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\4\36\1\u0277\15\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\u0278\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\20\0"+ - "\3\u0247\11\0\1\u0279\52\0\1\36\1\0\1\u027a\1\0"+ - "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\1\36\1\u027b\20\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\21\0\1\u024c\36\0\1\u027c\66\0\1\u027d\51\0"+ - "\1\u027e\113\0\1\u024f\36\0\1\u0250\30\0\1\u027f\103\0"+ - "\1\u0217\117\0\1\u0253\36\0\1\u0280\55\0\1\u0281\122\0"+ - "\1\u027d\35\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\1\36\1\u0282\20\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\1\36\1\u0283\1\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\1\36\1\u0284\1\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\1\36\1\u0285\20\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\10\36\1\u0286\11\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\u0286\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\10\36\1\u0287\11\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\u0287\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\1\36\1\u0288\1\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\7\36\1\u0289\12\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\1\36\1\u028a\1\36\17\0"+ - "\1\36\20\0\1\u0221\1\0\1\u0222\101\0\1\u028b\1\0"+ - "\1\u028c\133\0\1\u028d\51\0\3\u028e\101\0\3\u028f\64\0"+ - "\1\36\1\0\1\36\1\0\2\36\1\u0290\5\36\12\0"+ + "\6\36\1\u0272\13\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\u0273\1\0\10\36\12\0"+ "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\2\36\1\u0291\5\36\12\0"+ - "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u0292"+ - "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\u0293\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\1\36\1\u0274"+ + "\20\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\u0275\1\0\10\36\12\0\22\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\1\36\1\u0294\20\36\3\0"+ + "\1\36\1\0\10\36\12\0\12\36\1\u0276\7\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\6\36\1\u0295\13\36\3\0"+ + "\1\36\1\0\10\36\12\0\7\36\1\u0277\12\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\15\36\1\u0278\4\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\2\36\1\u0279\5\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\13\36\1\u027a\6\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\4\36\1\u027b\15\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\u027c\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\20\0\3\u024a\11\0\1\u027d\52\0"+ + "\1\36\1\0\1\u027e\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\1\36\1\u027f\20\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\21\0\1\u024f\36\0"+ + "\1\u0280\66\0\1\u0281\51\0\1\u0282\113\0\1\u0252\36\0"+ + "\1\u0253\30\0\1\u0283\103\0\1\u0219\117\0\1\u0256\36\0"+ + "\1\u0284\55\0\1\u0285\122\0\1\u0281\35\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\1\36\1\u0286\20\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ - "\1\36\1\u0296\1\36\17\0\1\36\3\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\7\36\1\u0297\12\36\3\0"+ + "\1\36\1\u0287\1\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\36\1\u0288\1\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\1\36\1\u0289\20\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\10\36\1\u028a\11\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\u028a\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\10\36\1\u028b\11\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\u028b\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\36\1\u028c\1\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\7\36\1\u028d\12\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\36\1\u028e\1\36\17\0\1\36\20\0\1\u0223\1\0"+ + "\1\u0224\101\0\1\u028f\1\0\1\u0290\133\0\1\u0291\73\0"+ + "\1\u0292\61\0\3\u0293\101\0\3\u0294\64\0\1\36\1\0"+ + "\1\36\1\0\2\36\1\u0295\5\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\2\36\1\u0296\5\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\6\36\1\u0297\13\36\3\0"+ "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ "\1\u0298\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\5\36\1\u0299\14\36\3\0\1\36\2\0"+ + "\10\36\12\0\1\36\1\u0299\20\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\5\36\1\u029a\14\36\3\0\1\36\2\0"+ + "\10\36\12\0\6\36\1\u029a\13\36\3\0\1\36\2\0"+ "\3\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\6\36\1\u029b\13\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\3\0\1\36\1\0\1\u029c\1\0"+ + "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u029b"+ + "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\7\36\1\u029c\12\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\3\0\1\36\1\0\1\u029d\1\0"+ "\10\36\12\0\22\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\u029d\1\0\10\36\12\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\5\36\1\u029e\14\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\5\36\1\u029f\14\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\6\36\1\u02a0\13\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\3\0\1\36\1\0\1\u02a1\1\0\10\36\12\0"+ "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ - "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ - "\1\36\2\0\1\36\1\u029e\1\36\17\0\1\36\42\0"+ - "\1\u029f\44\0\1\36\1\0\1\u02a0\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\3\36\17\0\1\36\21\0"+ - "\1\u027d\36\0\1\u02a1\61\0\1\u024f\107\0\1\u0210\62\0"+ - "\1\u0281\36\0\1\u02a2\26\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02a3"+ - "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02a4"+ - "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\1\u02a5\21\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\21\36\1\u02a6\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\22\36\3\0\1\36\2\0\1\36\1\u02a7\1\36\17\0"+ - "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ + "\1\36\1\0\1\u02a2\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ + "\1\36\1\u02a3\1\36\17\0\1\36\42\0\1\u02a4\44\0"+ + "\1\36\1\0\1\u02a5\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\21\0\1\u0281\36\0"+ + "\1\u02a6\61\0\1\u0252\107\0\1\u0212\62\0\1\u0285\36\0"+ + "\1\u02a7\26\0\1\36\1\0\1\36\1\0\10\36\12\0"+ "\22\36\3\0\1\36\2\0\1\36\1\u02a8\1\36\17\0"+ "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\2\36\1\u02a9\17\36\3\0\1\36\2\0\3\36\17\0"+ + "\22\36\3\0\1\36\2\0\1\36\1\u02a9\1\36\17\0"+ "\1\36\3\0\1\36\1\0\1\36\1\0\10\36\12\0"+ - "\6\36\1\u02aa\13\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\20\0\1\u028b\115\0\1\u02ab\56\0\1\u02ac\2\0"+ - "\3\u02ac\1\0\2\u02ac\2\0\3\u028e\1\u02ad\5\0\22\u02ac"+ - "\3\0\1\u02ac\2\0\3\u02ac\17\0\1\u02ac\20\0\3\u028f"+ - "\21\0\1\u02ae\42\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\11\36\1\u02af\10\36\3\0\1\36\2\0\3\36"+ + "\1\u02aa\21\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\21\36"+ + "\1\u02ab\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\1\36\1\u02ac\1\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\1\36\1\u02ad\1\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\2\36\1\u02ae"+ + "\17\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02af"+ + "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\20\0"+ + "\1\u028f\115\0\1\u02b0\71\0\3\u02b1\66\0\1\u02b2\2\0"+ + "\3\u02b2\1\0\2\u02b2\2\0\3\u0293\1\u02b3\5\0\22\u02b2"+ + "\3\0\1\u02b2\2\0\3\u02b2\17\0\1\u02b2\20\0\3\u0294"+ + "\21\0\1\u02b4\42\0\1\36\1\0\1\36\1\0\10\36"+ + "\12\0\11\36\1\u02b5\10\36\3\0\1\36\2\0\3\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\6\36\1\u02b0\13\36\3\0\1\36\2\0\3\36"+ + "\12\0\6\36\1\u02b6\13\36\3\0\1\36\2\0\3\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\15\36\1\u02b1\4\36\3\0\1\36\2\0\3\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\u02b2\1\0\10\36"+ + "\12\0\15\36\1\u02b7\4\36\3\0\1\36\2\0\3\36"+ + "\17\0\1\36\3\0\1\36\1\0\1\u02b8\1\0\10\36"+ "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+ - "\1\u02b3\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\1\u02b9\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\3\36"+ - "\1\u02b4\16\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\1\u02ba\16\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+ - "\1\u02b5\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\1\u02bb\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\1\36"+ - "\1\u02b6\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\u02b7\1\0\10\36\12\0\22\36"+ + "\1\u02bc\20\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\u02bd\1\0\10\36\12\0\22\36"+ "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\7\36\1\u02b8\12\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\40\0\1\u02b9"+ + "\1\0\1\36\1\0\10\36\12\0\7\36\1\u02be\12\36"+ + "\3\0\1\36\2\0\3\36\17\0\1\36\40\0\1\u02bf"+ "\46\0\1\36\1\0\1\36\1\0\10\36\12\0\2\36"+ - "\1\u02ba\17\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\1\u02c0\17\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+ - "\3\0\1\36\2\0\1\36\1\u02bb\1\36\17\0\1\36"+ + "\3\0\1\36\2\0\1\36\1\u02c1\1\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+ - "\1\u02bc\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\3\0\1\36\1\0\1\36\1\0\2\36\1\u02bd\5\36"+ + "\1\u02c2\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\3\0\1\36\1\0\1\36\1\0\2\36\1\u02c3\5\36"+ "\12\0\22\36\3\0\1\36\2\0\3\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+ - "\3\0\1\36\2\0\1\36\1\u02be\1\36\17\0\1\36"+ + "\3\0\1\36\2\0\1\36\1\u02c4\1\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\22\36"+ - "\3\0\1\36\2\0\1\36\1\u02bf\1\36\17\0\1\36"+ + "\3\0\1\36\2\0\1\36\1\u02c5\1\36\17\0\1\36"+ "\3\0\1\36\1\0\1\36\1\0\10\36\12\0\7\36"+ - "\1\u02c0\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ - "\20\0\3\u02ab\31\0\1\360\32\0\1\u02ac\1\0\1\u02ac"+ - "\1\0\10\u02ac\1\0\3\u02c1\6\0\22\u02ac\3\0\1\u02ac"+ - "\2\0\3\u02ac\12\0\1\u02c2\4\0\1\u02ac\5\0\1\u02ac"+ - "\2\0\3\u02ac\1\0\2\u02ac\13\0\22\u02ac\3\0\1\u02ac"+ - "\2\0\3\u02ac\17\0\1\u02ac\11\0\1\u02c3\75\0\1\36"+ - "\1\0\1\u02c4\1\0\10\36\12\0\22\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\15\36\1\u02c5\4\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\5\36\1\u02c6\14\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\3\36\1\u02c7\16\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\10\36\1\u02c8\11\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\u02c8\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\5\36\1\u02c9\14\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\45\0\1\u02ca\41\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\5\36\1\u02cb\14\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\6\36\1\u02cc\13\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+ - "\2\0\1\36\1\u02cd\1\36\17\0\1\36\3\0\1\36"+ - "\1\0\1\36\1\0\10\36\12\0\14\36\1\u02ce\5\36"+ - "\3\0\1\36\2\0\3\36\17\0\1\36\5\0\1\u02cf"+ - "\2\0\3\u02cf\1\0\2\u02cf\1\0\1\u02d0\3\u02c1\6\0"+ - "\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\5\0"+ - "\1\u02d1\2\0\3\u02d1\1\0\2\u02d1\6\0\1\u02c2\4\0"+ - "\22\u02d1\3\0\1\u02d1\2\0\3\u02d1\13\0\1\u02d2\3\0"+ - "\1\u02d1\1\u02c2\35\0\1\u02d3\50\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\6\36\1\u02d4\13\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\6\36\1\u02d5\13\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\36"+ - "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\1\36"+ - "\1\u02d6\1\36\17\0\1\36\3\0\1\36\1\0\1\u02d7"+ + "\1\u02c6\12\36\3\0\1\36\2\0\3\36\17\0\1\36"+ + "\20\0\3\u02b0\31\0\1\360\34\0\1\u02c7\2\0\3\u02c7"+ + "\1\0\2\u02c7\1\0\1\u02c8\3\u02b1\6\0\22\u02c7\3\0"+ + "\1\u02c7\2\0\3\u02c7\17\0\1\u02c7\3\0\1\u02b2\1\0"+ + "\1\u02b2\1\0\10\u02b2\1\0\3\u02c9\6\0\22\u02b2\3\0"+ + "\1\u02b2\2\0\3\u02b2\12\0\1\u02ca\4\0\1\u02b2\5\0"+ + "\1\u02b2\2\0\3\u02b2\1\0\2\u02b2\13\0\22\u02b2\3\0"+ + "\1\u02b2\2\0\3\u02b2\17\0\1\u02b2\11\0\1\u02cb\75\0"+ + "\1\36\1\0\1\u02cc\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\15\36\1\u02cd\4\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\5\36\1\u02ce\14\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\3\36\1\u02cf\16\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\10\36\1\u02d0\11\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\u02d0\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\5\36\1\u02d1\14\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\45\0\1\u02d2\41\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\5\36\1\u02d3"+ + "\14\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02d4"+ + "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\1\36\1\u02d5\1\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\14\36\1\u02d6"+ + "\5\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\u02c7\1\0\1\u02c7\1\0\10\u02c7\1\u02c8\3\u02d7\6\0"+ + "\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\6\0\1\u02d8\3\0"+ + "\1\u02d9\4\0\1\u02c7\5\0\1\u02c7\2\0\3\u02c7\1\0"+ + "\2\u02c7\13\0\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\17\0"+ + "\1\u02c7\5\0\1\u02da\2\0\3\u02da\1\0\2\u02da\1\0"+ + "\1\u02db\3\u02c9\6\0\22\u02da\3\0\1\u02da\2\0\3\u02da"+ + "\17\0\1\u02da\5\0\1\u02dc\2\0\3\u02dc\1\0\2\u02dc"+ + "\6\0\1\u02ca\4\0\22\u02dc\3\0\1\u02dc\2\0\3\u02dc"+ + "\13\0\1\u02dd\3\0\1\u02dc\1\u02ca\35\0\1\u02de\50\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02df"+ + "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\6\36\1\u02e0"+ + "\13\36\3\0\1\36\2\0\3\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\1\36\1\u02e1\1\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\u02e2\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\3\0\1\36\1\0"+ + "\1\36\1\0\10\36\12\0\21\36\1\u02e3\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\20\0\3\u02d7\1\u02e4\65\0"+ + "\1\u02c7\2\0\3\u02c7\1\0\2\u02c7\1\0\1\u02c8\11\0"+ + "\22\u02c7\3\0\1\u02c7\2\0\3\u02c7\17\0\1\u02c7\77\0"+ + "\1\u02e5\7\0\1\u02da\1\0\1\u02da\1\0\10\u02da\1\u02db"+ + "\3\u02e6\6\0\22\u02da\3\0\1\u02da\2\0\3\u02da\2\0"+ + "\1\u02e7\3\0\1\u02e8\3\0\1\u02e9\4\0\1\u02da\5\0"+ + "\1\u02da\2\0\3\u02da\1\0\2\u02da\13\0\22\u02da\3\0"+ + "\1\u02da\2\0\3\u02da\17\0\1\u02da\3\0\1\u02dc\1\0"+ + "\1\u02dc\1\0\10\u02dc\5\0\1\u02ca\4\0\22\u02dc\3\0"+ + "\1\u02dc\2\0\3\u02dc\13\0\1\u02dd\3\0\1\u02dc\1\u02ca"+ + "\17\0\3\u02c9\53\0\1\u02ca\56\0\1\u02ea\35\0\1\36"+ + "\1\0\1\u02eb\1\0\10\36\12\0\22\36\3\0\1\36"+ + "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u02ec"+ "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\21\36\1\u02d8\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\3\0\1\u02cf\1\0\1\u02cf\1\0\10\u02cf\1\u02d0"+ - "\3\u02d9\6\0\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\2\0"+ - "\1\u02da\3\0\1\u02db\3\0\1\u02dc\4\0\1\u02cf\5\0"+ - "\1\u02cf\2\0\3\u02cf\1\0\2\u02cf\13\0\22\u02cf\3\0"+ - "\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\3\0\1\u02d1\1\0"+ - "\1\u02d1\1\0\10\u02d1\5\0\1\u02c2\4\0\22\u02d1\3\0"+ - "\1\u02d1\2\0\3\u02d1\13\0\1\u02d2\3\0\1\u02d1\1\u02c2"+ - "\17\0\3\u02c1\53\0\1\u02c2\56\0\1\u02dd\35\0\1\36"+ - "\1\0\1\u02de\1\0\10\36\12\0\22\36\3\0\1\36"+ - "\2\0\3\36\17\0\1\36\3\0\1\36\1\0\1\u02df"+ - "\1\0\10\36\12\0\22\36\3\0\1\36\2\0\3\36"+ + "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02ed\1\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e0\1\36"+ + "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02ee\1\36"+ "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e1\1\36"+ - "\17\0\1\36\3\0\1\36\1\0\1\36\1\0\10\36"+ - "\12\0\1\u02e2\21\36\3\0\1\36\2\0\3\36\17\0"+ - "\1\36\20\0\3\u02d9\43\0\1\u02da\104\0\1\u02e3\21\0"+ - "\1\u02cf\2\0\3\u02cf\1\0\2\u02cf\1\0\1\u02d0\11\0"+ - "\22\u02cf\3\0\1\u02cf\2\0\3\u02cf\17\0\1\u02cf\77\0"+ - "\1\u02e4\41\0\1\u02e5\51\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\22\36\3\0\1\36\2\0\1\36\1\u02e6"+ - "\1\36\17\0\1\36\3\0\1\36\1\0\1\36\1\0"+ - "\10\36\12\0\13\36\1\u02e7\6\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\20\0\3\u02d9\43\0\1\u02da\3\0"+ - "\1\u02db\3\0\1\u02dc\16\0\1\u02e8\75\0\1\36\1\0"+ - "\1\u02e9\1\0\10\36\12\0\22\36\3\0\1\36\2\0"+ - "\3\36\17\0\1\36\51\0\1\u02ea\35\0\1\36\1\0"+ - "\1\36\1\0\10\36\12\0\11\36\1\u02eb\10\36\3\0"+ - "\1\36\2\0\3\36\17\0\1\36\5\0\1\u02ec\101\0"+ + "\12\0\1\u02ef\21\36\3\0\1\36\2\0\3\36\17\0"+ + "\1\36\5\0\1\u02f0\2\0\3\u02f0\1\0\2\u02f0\13\0"+ + "\22\u02f0\3\0\1\u02f0\2\0\3\u02f0\17\0\1\u02f0\20\0"+ + "\3\u02d7\47\0\1\u02d8\3\0\1\u02d9\25\0\3\u02e6\43\0"+ + "\1\u02e7\104\0\1\u02f1\21\0\1\u02da\2\0\3\u02da\1\0"+ + "\2\u02da\1\0\1\u02db\11\0\22\u02da\3\0\1\u02da\2\0"+ + "\3\u02da\17\0\1\u02da\77\0\1\u02f2\41\0\1\u02f3\51\0"+ "\1\36\1\0\1\36\1\0\10\36\12\0\22\36\3\0"+ - "\1\36\1\u02ed\1\0\3\36\17\0\1\36\20\0\3\u02ec"+ - "\5\0\1\u02ee\133\0\1\u02ef\43\0\3\u02ee\1\0\1\u02f0"+ - "\25\0\1\u02f1\31\0\1\u02f2\26\0\1\u02f3\126\0\1\u02f4"+ - "\77\0\1\u02f5\107\0\1\u02f6\77\0\1\u02f7\107\0\1\u02f8"+ - "\77\0\1\u02f9\107\0\1\u02fa\51\0\3\u02f8\31\0\1\u02fb"+ - "\101\0\1\u02fc\55\0\1\u02f8\163\0\1\u02f8\1\0"; + "\1\36\2\0\1\36\1\u02f4\1\36\17\0\1\36\3\0"+ + "\1\36\1\0\1\36\1\0\10\36\12\0\13\36\1\u02f5"+ + "\6\36\3\0\1\36\2\0\3\36\17\0\1\36\2\0"+ + "\1\u02f6\1\u02f0\1\u02f6\1\u02f0\1\u02f6\10\u02f0\1\u02f6\3\u02f7"+ + "\6\u02f6\22\u02f0\3\u02f6\1\u02f0\2\u02f6\3\u02f0\2\u02f6\1\u02f8"+ + "\7\u02f6\1\u02f9\4\u02f6\1\u02f0\2\u02f6\16\0\3\u02e6\43\0"+ + "\1\u02e7\3\0\1\u02e8\3\0\1\u02e9\16\0\1\u02fa\75\0"+ + "\1\36\1\0\1\u02fb\1\0\10\36\12\0\22\36\3\0"+ + "\1\36\2\0\3\36\17\0\1\36\2\0\16\u02f6\1\0"+ + "\1\u02f6\1\0\43\u02f6\1\u02f8\35\u02f6\3\u02f7\43\u02f6\1\u02f8"+ + "\35\u02f6\1\0\1\u02f6\1\0\43\u02f6\1\u02f8\1\u02fc\21\u02f6"+ + "\1\u02fd\2\u02f6\3\u02fd\1\u02f6\2\u02fd\2\u02f6\1\0\1\u02f6"+ + "\1\0\1\u02f6\1\u02f9\4\u02f6\22\u02fd\3\u02f6\1\u02fd\2\u02f6"+ + "\3\u02fd\2\u02f6\1\u02f8\10\u02f6\1\u02fe\3\u02f6\1\u02fd\1\u02f9"+ + "\1\u02f6\47\0\1\u02ff\35\0\1\36\1\0\1\36\1\0"+ + "\10\36\12\0\11\36\1\u0300\10\36\3\0\1\36\2\0"+ + "\3\36\17\0\1\36\2\0\1\u02f6\1\u02fd\1\u02f6\1\u02fd"+ + "\1\u02f6\10\u02fd\1\u02f6\1\0\1\u02f6\1\0\1\u02f6\1\u02f9"+ + "\4\u02f6\22\u02fd\3\u02f6\1\u02fd\2\u02f6\3\u02fd\2\u02f6\1\u02f8"+ + "\10\u02f6\1\u02fe\3\u02f6\1\u02fd\1\u02f9\17\u02f6\3\u02f7\43\u02f6"+ + "\1\u02f8\7\u02f6\1\u02f9\7\u02f6\3\0\1\u0301\101\0\1\36"+ + "\1\0\1\36\1\0\10\36\12\0\22\36\3\0\1\36"+ + "\1\u0302\1\0\3\36\17\0\1\36\20\0\3\u0301\5\0"+ + "\1\u0303\133\0\1\u0304\43\0\3\u0303\1\0\1\u0305\25\0"+ + "\1\u0306\31\0\1\u0307\26\0\1\u0308\126\0\1\u0309\77\0"+ + "\1\u030a\107\0\1\u030b\77\0\1\u030c\107\0\1\u030d\77\0"+ + "\1\u030e\107\0\1\u030f\51\0\3\u030d\31\0\1\u0310\101\0"+ + "\1\u0311\55\0\1\u030d\163\0\1\u030d\1\0"; private static int [] zzUnpackTrans() { - int [] result = new int[38080]; + int [] result = new int[39440]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -1280,18 +1309,18 @@ "\1\1\12\0\10\1\3\11\2\0\1\11\1\0\1\1"+ "\1\0\1\11\1\1\1\11\1\1\1\0\1\11\4\1"+ "\1\11\5\1\1\11\1\0\1\1\1\0\2\1\1\11"+ - "\2\0\60\1\12\0\11\1\4\0\1\11\2\0\3\1"+ + "\2\0\60\1\12\0\11\1\5\0\1\11\3\0\3\1"+ "\2\0\54\1\5\0\1\11\6\0\11\1\1\11\1\1"+ - "\4\0\1\11\3\1\1\11\1\1\1\0\31\1\1\0"+ - "\4\1\4\0\1\11\5\0\1\11\11\1\5\0\24\1"+ + "\5\0\1\11\3\1\1\11\1\1\1\0\31\1\1\0"+ + "\4\1\4\0\1\11\5\0\1\11\11\1\6\0\24\1"+ "\1\0\2\1\1\11\3\0\1\11\1\0\11\1\1\11"+ - "\1\1\3\0\17\1\1\0\1\1\2\11\10\1\4\0"+ - "\12\1\1\0\7\1\3\0\6\1\1\11\4\1\5\0"+ - "\5\1\5\0\5\1\1\11\2\0\2\1\1\0\1\1"+ - "\1\0\1\1\7\0\1\11\7\0\1\11\1\0"; + "\1\1\4\0\17\1\1\0\1\1\2\11\10\1\5\0"+ + "\12\1\1\0\7\1\5\0\6\1\1\11\4\1\10\0"+ + "\5\1\7\0\5\1\1\0\1\11\2\0\2\1\5\0"+ + "\2\1\3\0\1\1\7\0\1\11\7\0\1\11\1\0"; private static int [] zzUnpackAttribute() { - int [] result = new int[764]; + int [] result = new int[785]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1904,10 +1933,15 @@ zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 205: + { comment = yytext(); + handleVarComment(); + } + case 207: break; case 188: { return createFullSymbol(ASTPHP5Symbols.T_INTERFACE); } - case 206: break; + case 208: break; case 153: { int removeChars = (yytext().charAt(0) == 'b')?4:3; heredoc = yytext().substring(removeChars).trim(); // for 'b<<<' or '<<<' @@ -1917,51 +1951,51 @@ yybegin(ST_START_HEREDOC); return createSymbol(ASTPHP5Symbols.T_START_HEREDOC); } - case 207: break; + case 209: break; case 27: { return createSymbol(ASTPHP5Symbols.T_OR); } - case 208: break; + case 210: break; case 151: { return createFullSymbol(ASTPHP5Symbols.T_PRINT); } - case 209: break; + case 211: break; case 175: { return createSymbol(ASTPHP5Symbols.T_UNSET_CAST); } - case 210: break; + case 212: break; case 36: { handleCommentStart(); yybegin(ST_ONE_LINE_COMMENT); // yymore(); } - case 211: break; + case 213: break; case 2: { return createSymbol(ASTPHP5Symbols.T_INLINE_HTML); } - case 212: break; + case 214: break; case 22: { return createSymbol(ASTPHP5Symbols.T_RGREATER); } - case 213: break; + case 215: break; case 125: { yypushback(1); pushState(ST_VAR_OFFSET); return createFullSymbol(ASTPHP5Symbols.T_VARIABLE); } - case 214: break; + case 216: break; case 162: { return createFullSymbol(ASTPHP5Symbols.T_GLOBAL); } - case 215: break; + case 217: break; case 57: { // yymore(); } - case 216: break; + case 218: break; case 23: { return createSymbol(ASTPHP5Symbols.T_TIMES); } - case 217: break; + case 219: break; case 108: { String text = yytext(); if ((text.charAt(1)=='%' && asp_tags) @@ -1972,30 +2006,30 @@ return createSymbol(ASTPHP5Symbols.T_INLINE_HTML); } } - case 218: break; + case 220: break; case 74: { return createSymbol(ASTPHP5Symbols.T_MINUS_EQUAL); } - case 219: break; + case 221: break; case 92: { return createSymbol(ASTPHP5Symbols.T_BOOLEAN_OR); } - case 220: break; + case 222: break; case 13: { pushState(ST_IN_SCRIPTING); bracket++; return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN); } - case 221: break; + case 223: break; case 41: { yypushback(1); yybegin(ST_HEREDOC); } - case 222: break; + case 224: break; case 20: { return createSymbol(ASTPHP5Symbols.T_CLOSE_PARENTHESE); } - case 223: break; + case 225: break; case 101: { String text = yytext(); int length = text.length() - 1; @@ -2015,58 +2049,58 @@ yybegin(ST_HEREDOC); } } - case 224: break; + case 226: break; case 45: { yypushback(yylength()); popState(); } - case 225: break; + case 227: break; case 21: { return createSymbol(ASTPHP5Symbols.T_NOT); } - case 226: break; + case 228: break; case 154: { yypushback(3); pushState(ST_LOOKING_FOR_PROPERTY); return createFullSymbol(ASTPHP5Symbols.T_VARIABLE); } - case 227: break; + case 229: break; case 29: { return createSymbol(ASTPHP5Symbols.T_QUESTION_MARK); } - case 228: break; + case 230: break; case 119: { return createFullSymbol(ASTPHP5Symbols.T_VAR); } - case 229: break; + case 231: break; case 202: { return createFullSymbol(ASTPHP5Symbols.T_FUNC_C); } - case 230: break; + case 232: break; case 141: { return createFullSymbol(ASTPHP5Symbols.T_TRAIT); } - case 231: break; + case 233: break; case 159: { return createFullSymbol(ASTPHP5Symbols.T_STATIC); } - case 232: break; + case 234: break; case 131: { return createFullSymbol(ASTPHP5Symbols.T_EVAL); } - case 233: break; + case 235: break; case 161: { return createFullSymbol(ASTPHP5Symbols.T_RETURN); } - case 234: break; + case 236: break; case 144: { return createFullSymbol(ASTPHP5Symbols.T_UNSET); } - case 235: break; + case 237: break; case 85: { return createSymbol(ASTPHP5Symbols.T_DIV_EQUAL); } - case 236: break; + case 238: break; case 126: { String text = yytext(); @@ -2091,44 +2125,44 @@ } yypushback(1); } - case 237: break; + case 239: break; case 46: { popState(); return createFullSymbol(ASTPHP5Symbols.T_STRING); } - case 238: break; + case 240: break; case 199: { return createFullSymbol(ASTPHP5Symbols.T_METHOD_C); } - case 239: break; + case 241: break; case 195: { return createFullSymbol(ASTPHP5Symbols.T_ENDFOREACH); } - case 240: break; + case 242: break; case 170: { return createFullSymbol(ASTPHP5Symbols.T_FINALLY); } - case 241: break; + case 243: break; case 81: { return createSymbol(ASTPHP5Symbols.T_IS_SMALLER_OR_EQUAL); } - case 242: break; + case 244: break; case 68: { return createFullSymbol(ASTPHP5Symbols.T_CONSTANT_ENCAPSED_STRING); } - case 243: break; + case 245: break; case 111: { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_AND); } - case 244: break; + case 246: break; case 146: { return createFullSymbol(ASTPHP5Symbols.T_CONST); } - case 245: break; + case 247: break; case 134: { return createFullSymbol(ASTPHP5Symbols.T_GOTO); } - case 246: break; + case 248: break; case 102: { String text = yytext(); int length = text.length() - 1; @@ -2148,36 +2182,36 @@ yybegin(ST_NOWDOC); } } - case 247: break; + case 249: break; case 114: { return createFullSymbol(ASTPHP5Symbols.T_EXIT); } - case 248: break; + case 250: break; case 38: { yybegin(ST_IN_SCRIPTING); return createSymbol(ASTPHP5Symbols.T_QUATE); } - case 249: break; + case 251: break; case 181: { return createFullSymbol(ASTPHP5Symbols.T_CALLABLE); } - case 250: break; + case 252: break; case 120: { return createSymbol(ASTPHP5Symbols.T_IS_NOT_IDENTICAL); } - case 251: break; + case 253: break; case 44: { nowdoc=null; nowdoc_len=0; yybegin(ST_IN_SCRIPTING); return createSymbol(ASTPHP5Symbols.T_END_NOWDOC); } - case 252: break; + case 254: break; case 158: { /* not a keyword, hust for recognize constans.*/ return createFullSymbol(ASTPHP5Symbols.T_DEFINE); } - case 253: break; + case 255: break; case 58: { String yytext = yytext(); switch (yytext.charAt(yytext.length() - 1)) { @@ -2192,214 +2226,214 @@ } // yymore(); } - case 254: break; + case 256: break; case 91: { return createSymbol(ASTPHP5Symbols.T_OR_EQUAL); } - case 255: break; + case 257: break; case 139: { return createFullSymbol(ASTPHP5Symbols.T_BREAK); } - case 256: break; - case 205: + case 258: break; + case 206: { yybegin(ST_HALTED_COMPILER); return createSymbol(ASTPHP5Symbols.T_HALT_COMPILER); } - case 257: break; + case 259: break; case 59: { yybegin(ST_IN_SCRIPTING); return createSymbol(ASTPHP5Symbols.T_ECHO); } - case 258: break; + case 260: break; case 160: { return createFullSymbol(ASTPHP5Symbols.T_SWITCH); } - case 259: break; + case 261: break; case 54: { popState(); return createSymbol(ASTPHP5Symbols.T_CLOSE_RECT); } - case 260: break; + case 262: break; case 33: { return createSymbol(ASTPHP5Symbols.T_TILDA); } - case 261: break; + case 263: break; case 71: { return createFullSymbol(ASTPHP5Symbols.T_IF); } - case 262: break; + case 264: break; case 172: { return createFullSymbol(ASTPHP5Symbols.T_REQUIRE); } - case 263: break; + case 265: break; case 18: { return createSymbol(ASTPHP5Symbols.T_NEKUDOTAIM); } - case 264: break; + case 266: break; case 26: { return createSymbol(ASTPHP5Symbols.T_REFERENCE); } - case 265: break; + case 267: break; case 86: { handleCommentStart(); yybegin(ST_COMMENT); } - case 266: break; + case 268: break; case 42: { heredoc = null; yybegin(ST_IN_SCRIPTING); return createSymbol(ASTPHP5Symbols.T_END_HEREDOC); } - case 267: break; + case 269: break; case 190: { return createFullSymbol(ASTPHP5Symbols.T_NAMESPACE); } - case 268: break; + case 270: break; case 197: { return createFullSymbol(ASTPHP5Symbols.T_IMPLEMENTS); } - case 269: break; + case 271: break; case 149: { return createFullSymbol(ASTPHP5Symbols.T_YIELD); } - case 270: break; + case 272: break; case 16: { return createSymbol(ASTPHP5Symbols.T_MINUS); } - case 271: break; + case 273: break; case 193: { return createFullSymbol(ASTPHP5Symbols.T_CLASS_C); } - case 272: break; + case 274: break; case 106: { handlePHPDocEnd(); yybegin(ST_IN_SCRIPTING); } - case 273: break; + case 275: break; case 204: { return createFullSymbol(ASTPHP5Symbols.T_NS_C); } - case 274: break; + case 276: break; case 152: { return createSymbol(ASTPHP5Symbols.T_INT_CAST); } - case 275: break; + case 277: break; case 157: { return createFullSymbol(ASTPHP5Symbols.T_ELSEIF); } - case 276: break; + case 278: break; case 95: { return createSymbol(ASTPHP5Symbols.T_COALESCE); } - case 277: break; + case 279: break; case 194: { return createFullSymbol(ASTPHP5Symbols.T_ENDDECLARE); } - case 278: break; + case 280: break; case 75: { return createSymbol(ASTPHP5Symbols.T_DEC); } - case 279: break; + case 281: break; case 96: { yypushback(1); /*{DOUBLE_QUOTES_CHARS}*("{""{"+|"$""$"+|(("{"+|"$"+)[\"]))*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 280: break; + case 282: break; case 179: { return createFullSymbol(ASTPHP5Symbols.T_ABSTRACT); } - case 281: break; + case 283: break; case 130: { return createFullSymbol(ASTPHP5Symbols.T_ELSE); } - case 282: break; + case 284: break; case 189: { return createFullSymbol(ASTPHP5Symbols.T_INSTEADOF); } - case 283: break; + case 285: break; case 76: { pushState(ST_LOOKING_FOR_PROPERTY); return createSymbol(ASTPHP5Symbols.T_OBJECT_OPERATOR); } - case 284: break; + case 286: break; case 14: { return createSymbol(ASTPHP5Symbols.T_SEMICOLON); } - case 285: break; + case 287: break; case 3: { // do nothing } - case 286: break; + case 288: break; case 48: { popState(); pushState(ST_IN_SCRIPTING); return createFullSymbol(ASTPHP5Symbols.T_STRING_VARNAME); } - case 287: break; + case 289: break; case 17: { return createSymbol(ASTPHP5Symbols.T_LGREATER); } - case 288: break; + case 290: break; case 133: { return createFullSymbol(ASTPHP5Symbols.T_LIST); } - case 289: break; + case 291: break; case 105: { handleMultilineCommentEnd(); yybegin(ST_IN_SCRIPTING); } - case 290: break; + case 292: break; case 156: { return createFullSymbol(ASTPHP5Symbols.T_ENDFOR); } - case 291: break; + case 293: break; case 4: { return createFullSymbol(ASTPHP5Symbols.T_LNUMBER); } - case 292: break; + case 294: break; case 99: { yypushback(1); /*{BACKQUOTE_CHARS}*("{""{"+|"$""$"+|(("{"+|"$"+)[`]))*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 293: break; + case 295: break; case 135: { handleCommentStart(); } - case 294: break; + case 296: break; case 138: { return createFullSymbol(ASTPHP5Symbols.T_ARRAY); } - case 295: break; + case 297: break; case 129: { return createFullSymbol(ASTPHP5Symbols.T_ECHO); } - case 296: break; + case 298: break; case 49: { return createFullSymbol(ASTPHP5Symbols.T_NUM_STRING); } - case 297: break; + case 299: break; case 89: { return createSymbol(ASTPHP5Symbols.T_AND_EQUAL); } - case 298: break; + case 300: break; case 53: { bracket++; return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN); } - case 299: break; + case 301: break; case 142: { return createFullSymbol(ASTPHP5Symbols.T_THROW); } - case 300: break; + case 302: break; case 150: { return createFullSymbol(ASTPHP5Symbols.T_WHILE); } - case 301: break; + case 303: break; case 187: { return createFullSymbol(ASTPHP5Symbols.T_ENDSWITCH); } - case 302: break; + case 304: break; case 60: { if (asp_tags) { yybegin(ST_IN_SCRIPTING); @@ -2409,44 +2443,44 @@ return createSymbol(ASTPHP5Symbols.T_INLINE_HTML); } } - case 303: break; + case 305: break; case 174: { return createSymbol(ASTPHP5Symbols.T_ARRAY_CAST); } - case 304: break; + case 306: break; case 98: { pushState(ST_IN_SCRIPTING); yypushback(yylength()-1); bracket++; return createSymbol(ASTPHP5Symbols.T_CURLY_OPEN_WITH_DOLAR); } - case 305: break; + case 307: break; case 168: { return createFullSymbol(ASTPHP5Symbols.T_DEFAULT); } - case 306: break; + case 308: break; case 165: { return createSymbol(ASTPHP5Symbols.T_DOUBLE_CAST); } - case 307: break; + case 309: break; case 12: { yybegin(ST_BACKQUOTE); return createSymbol(ASTPHP5Symbols.T_BACKQUATE); } - case 308: break; + case 310: break; case 31: { return createSymbol(ASTPHP5Symbols.T_OPEN_RECT); } - case 309: break; + case 311: break; case 145: { return createFullSymbol(ASTPHP5Symbols.T_CATCH); } - case 310: break; + case 312: break; case 97: { pushState(ST_LOOKING_FOR_VARNAME); return createSymbol(ASTPHP5Symbols.T_DOLLAR_OPEN_CURLY_BRACES); } - case 311: break; + case 313: break; case 35: { /* This is a temporary fix which is dependant on flex and it's implementation */ if (!stack.isEmpty()) { @@ -2455,85 +2489,85 @@ bracket--; return createSymbol(ASTPHP5Symbols.T_CURLY_CLOSE); } - case 312: break; + case 314: break; case 87: { return createSymbol(ASTPHP5Symbols.T_MOD_EQUAL); } - case 313: break; + case 315: break; case 24: { return createSymbol(ASTPHP5Symbols.T_DIV); } - case 314: break; + case 316: break; case 32: { return createSymbol(ASTPHP5Symbols.T_CLOSE_RECT); } - case 315: break; + case 317: break; case 121: { return createSymbol(ASTPHP5Symbols.T_SPACESHIP); } - case 316: break; + case 318: break; case 7: { return createSymbol(ASTPHP5Symbols.T_PLUS); } - case 317: break; + case 319: break; case 147: { return createFullSymbol(ASTPHP5Symbols.T_CLASS); } - case 318: break; + case 320: break; case 115: { return createFullSymbol(ASTPHP5Symbols.T_FOR); } - case 319: break; + case 321: break; case 77: { return createSymbol(ASTPHP5Symbols.T_IS_GREATER_OR_EQUAL); } - case 320: break; + case 322: break; case 72: { return createFullSymbol(ASTPHP5Symbols.T_DO); } - case 321: break; + case 323: break; case 39: { /*{BACKQUOTE_CHARS}+*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 322: break; + case 324: break; case 37: { /*{DOUBLE_QUOTES_CHARS}+*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 323: break; + case 325: break; case 90: { return createSymbol(ASTPHP5Symbols.T_BOOLEAN_AND); } - case 324: break; + case 326: break; case 6: { return createFullSymbol(ASTPHP5Symbols.T_STRING); } - case 325: break; + case 327: break; case 167: { return createFullSymbol(ASTPHP5Symbols.T_INCLUDE); } - case 326: break; + case 328: break; case 5: { return createSymbol(ASTPHP5Symbols.T_NEKUDA); } - case 327: break; + case 329: break; case 136: { return createFullSymbol(ASTPHP5Symbols.T_ENDIF); } - case 328: break; + case 330: break; case 117: { return createFullSymbol(ASTPHP5Symbols.T_NEW); } - case 329: break; + case 331: break; case 55: { bracket--; return createSymbol(ASTPHP5Symbols.T_CURLY_CLOSE); } - case 330: break; + case 332: break; case 196: { return createFullSymbol(ASTPHP5Symbols.T_INSTANCEOF); } - case 331: break; + case 333: break; case 177: { int bprefix = (yytext().charAt(0) != '<') ? 1 : 0; int startString=3+bprefix; @@ -2549,13 +2583,13 @@ yybegin(ST_START_NOWDOC); return createSymbol(ASTPHP5Symbols.T_START_NOWDOC); } - case 332: break; + case 334: break; case 47: { yypushback(yylength()); popState(); pushState(ST_IN_SCRIPTING); } - case 333: break; + case 335: break; case 155: { isEndedPhp = false; whitespaceEndPosition = getTokenStartPosition() + yylength(); @@ -2563,47 +2597,47 @@ //return T_OPEN_TAG; //return createSymbol(ASTPHP5Symbols.T_OPEN_TAG); } - case 334: break; + case 336: break; case 65: { return createSymbol(ASTPHP5Symbols.T_PLUS_EQUAL); } - case 335: break; + case 337: break; case 9: { whitespaceEndPosition = getTokenStartPosition() + yylength(); } - case 336: break; + case 338: break; case 173: { return createFullSymbol(ASTPHP5Symbols.T_PRIVATE); } - case 337: break; + case 339: break; case 201: { return createFullSymbol(ASTPHP5Symbols.T_REQUIRE_ONCE); } - case 338: break; + case 340: break; case 171: { return createFullSymbol(ASTPHP5Symbols.T_FOREACH); } - case 339: break; + case 341: break; case 148: { return createFullSymbol(ASTPHP5Symbols.T_CLONE); } - case 340: break; + case 342: break; case 140: { return createFullSymbol(ASTPHP5Symbols.T_ISSET); } - case 341: break; + case 343: break; case 19: { return createSymbol(ASTPHP5Symbols.T_OPEN_PARENTHESE); } - case 342: break; + case 344: break; case 163: { return createFullSymbol(ASTPHP5Symbols.T_PUBLIC); } - case 343: break; + case 345: break; case 118: { return createSymbol(ASTPHP5Symbols.T_SR_EQUAL); } - case 344: break; + case 346: break; case 61: { if (short_tags_allowed || yylength()>2) { /* yyleng>2 means it's not */ yybegin(ST_IN_SCRIPTING); @@ -2613,90 +2647,90 @@ return createSymbol(ASTPHP5Symbols.T_INLINE_HTML); } } - case 345: break; + case 347: break; case 137: { return createFullSymbol(ASTPHP5Symbols.T_EMPTY); } - case 346: break; + case 348: break; case 80: { return createSymbol(ASTPHP5Symbols.T_IS_NOT_EQUAL); } - case 347: break; + case 349: break; case 83: { return createSymbol(ASTPHP5Symbols.T_MUL_EQUAL); } - case 348: break; + case 350: break; case 124: { if (!parsePHPDoc()) { handleCommentStart(); yybegin(ST_DOCBLOCK); } } - case 349: break; + case 351: break; case 122: { return createSymbol(ASTPHP5Symbols.T_SL_EQUAL); } - case 350: break; + case 352: break; case 113: { return createFullSymbol(ASTPHP5Symbols.T_TRY); } - case 351: break; + case 353: break; case 128: { int len = yylength(); yypushback(2); // go back to mark end of comment in the next token comment = yytext(); } - case 352: break; + case 354: break; case 143: { return createFullSymbol(ASTPHP5Symbols.T_FINAL); } - case 353: break; + case 355: break; case 184: { return createSymbol(ASTPHP5Symbols.T_OBJECT_CAST); } - case 354: break; + case 356: break; case 100: { yypushback(1); /*{HEREDOC_CHARS}*({HEREDOC_NEWLINE}+({LABEL}";"?)?)?("{""{"+|"$""$"+)*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 355: break; + case 357: break; case 164: { return createSymbol(ASTPHP5Symbols.T_BOOL_CAST); } - case 356: break; + case 358: break; case 40: { yybegin(ST_IN_SCRIPTING); return createSymbol(ASTPHP5Symbols.T_BACKQUATE); } - case 357: break; + case 359: break; case 8: { return createSymbol(ASTPHP5Symbols.T_NS_SEPARATOR); } - case 358: break; + case 360: break; case 183: { return createSymbol(ASTPHP5Symbols.T_STRING_CAST); } - case 359: break; + case 361: break; case 110: { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_XOR); } - case 360: break; + case 362: break; case 50: { yypushback(1); popState(); /*[ \n\r\t\\'#]*/ return createSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 361: break; + case 363: break; case 62: { return createFullSymbol(ASTPHP5Symbols.T_DNUMBER); } - case 362: break; + case 364: break; case 25: { return createSymbol(ASTPHP5Symbols.T_PRECENT); } - case 363: break; + case 365: break; case 203: { comment = yytext(); handleVarComment(); @@ -2704,13 +2738,13 @@ // but it needs some changes in parser grammar. see issue #154967 //return createFullSymbol(ASTPHP5Symbols.T_VAR_COMMENT); } - case 364: break; + case 366: break; case 94: { isEndedPhp = true; yybegin(YYINITIAL); return createSymbol(ASTPHP5Symbols.T_SEMICOLON); /* implicit ';' at php-end tag */ } - case 365: break; + case 367: break; case 88: { if (asp_tags) { yybegin(YYINITIAL); @@ -2719,69 +2753,69 @@ return createSymbol(ASTPHP5Symbols.T_INLINE_HTML); } } - case 366: break; + case 368: break; case 180: { return createFullSymbol(ASTPHP5Symbols.T_FUNCTION); } - case 367: break; + case 369: break; case 178: { return createFullSymbol(ASTPHP5Symbols.T_ENDWHILE); } - case 368: break; + case 370: break; case 28: { return createSymbol(ASTPHP5Symbols.T_KOVA); } - case 369: break; + case 371: break; case 11: { yybegin(ST_DOUBLE_QUOTES); return createSymbol(ASTPHP5Symbols.T_QUATE); } - case 370: break; + case 372: break; case 182: { return createFullSymbol(ASTPHP5Symbols.T_CONTINUE); } - case 371: break; + case 373: break; case 1: { /*{HEREDOC_CHARS}*({HEREDOC_NEWLINE}+({LABEL}";"?)?)?*/ return createFullSymbol(ASTPHP5Symbols.T_ENCAPSED_AND_WHITESPACE); } - case 372: break; + case 374: break; case 112: { return createSymbol(ASTPHP5Symbols.T_IS_IDENTICAL); } - case 373: break; + case 375: break; case 70: { return createSymbol(ASTPHP5Symbols.T_DOUBLE_ARROW); } - case 374: break; + case 376: break; case 192: { return createFullSymbol(ASTPHP5Symbols.T_TRAIT_C); } - case 375: break; + case 377: break; case 79: { return createSymbol(ASTPHP5Symbols.T_PAAMAYIM_NEKUDOTAYIM); } - case 376: break; + case 378: break; case 116: { return createFullSymbol(ASTPHP5Symbols.T_USE); } - case 377: break; + case 379: break; case 78: { return createSymbol(ASTPHP5Symbols.T_SR); } - case 378: break; + case 380: break; case 15: { return createSymbol(ASTPHP5Symbols.T_EQUAL); } - case 379: break; + case 381: break; case 30: { return createSymbol(ASTPHP5Symbols.T_COMMA); } - case 380: break; + case 382: break; case 176: { return createFullSymbol(ASTPHP5Symbols.T_DIR); } - case 381: break; + case 383: break; case 107: { if (asp_tags || yytext().charAt(0)!='%') { /* asp comment? */ isEndedPhp = true; @@ -2791,41 +2825,41 @@ //return T_COMMENT; } } - case 382: break; + case 384: break; case 191: { return createFullSymbol(ASTPHP5Symbols.T_PROTECTED); } - case 383: break; + case 385: break; case 63: { return createSymbol(ASTPHP5Symbols.T_CONCAT_EQUAL); } - case 384: break; + case 386: break; case 104: { /* treat numbers (almost) as strings inside encapsulated strings */ return createFullSymbol(ASTPHP5Symbols.T_NUM_STRING); } - case 385: break; + case 387: break; case 10: { return createSymbol(ASTPHP5Symbols.T_DOLLAR); } - case 386: break; + case 388: break; case 64: { return createSymbol(ASTPHP5Symbols.T_INC); } - case 387: break; + case 389: break; case 43: { yypushback(1); yybegin(ST_NOWDOC); } - case 388: break; + case 390: break; case 73: { return createFullSymbol(ASTPHP5Symbols.T_LOGICAL_OR); } - case 389: break; + case 391: break; case 82: { return createSymbol(ASTPHP5Symbols.T_SL); } - case 390: break; + case 392: break; case 127: { String text = yytext(); @@ -2848,83 +2882,83 @@ } yypushback(1); } - case 391: break; + case 393: break; case 66: { return createFullSymbol(ASTPHP5Symbols.T_AS); } - case 392: break; + case 394: break; case 200: { return createFullSymbol(ASTPHP5Symbols.T_INCLUDE_ONCE); } - case 393: break; + case 395: break; case 123: { return createSymbol(ASTPHP5Symbols.T_POW_EQUAL); } - case 394: break; + case 396: break; case 69: { return createSymbol(ASTPHP5Symbols.T_IS_EQUAL); } - case 395: break; + case 397: break; case 34: { return createSymbol(ASTPHP5Symbols.T_AT); } - case 396: break; + case 398: break; case 51: { return createSymbol(ASTPHP5Symbols.T_QUATE); } - case 397: break; + case 399: break; case 186: { return createFullSymbol(ASTPHP5Symbols.T_LINE); } - case 398: break; + case 400: break; case 166: { return createFullSymbol(ASTPHP5Symbols.T_EXTENDS); } - case 399: break; + case 401: break; case 67: { return createFullSymbol(ASTPHP5Symbols.T_VARIABLE); } - case 400: break; + case 402: break; case 198: { return createSymbol(ASTPHP5Symbols.T_YIELD_FROM); } - case 401: break; + case 403: break; case 169: { return createFullSymbol(ASTPHP5Symbols.T_DECLARE); } - case 402: break; + case 404: break; case 93: { return createSymbol(ASTPHP5Symbols.T_XOR_EQUAL); } - case 403: break; + case 405: break; case 84: { return createSymbol(ASTPHP5Symbols.T_POW); } - case 404: break; + case 406: break; case 132: { return createFullSymbol(ASTPHP5Symbols.T_CASE); } - case 405: break; + case 407: break; case 185: { return createFullSymbol(ASTPHP5Symbols.T_FILE); } - case 406: break; + case 408: break; case 103: { return createSymbol(ASTPHP5Symbols.T_OBJECT_OPERATOR); } - case 407: break; + case 409: break; case 109: { return createSymbol(ASTPHP5Symbols.T_ELLIPSIS); } - case 408: break; + case 410: break; case 52: { return createSymbol(ASTPHP5Symbols.T_BACKQUATE); } - case 409: break; + case 411: break; case 56: { } - case 410: break; + case 412: break; default: if (zzInput == YYEOF && (zzStartRead == zzCurrentPos || zzLexicalState == ST_DOCBLOCK)) { zzAtEOF = true; @@ -2939,7 +2973,7 @@ return createSymbol(ASTPHP5Symbols.EOF); } } - case 765: break; + case 786: break; default: { return createSymbol(ASTPHP5Symbols.EOF); } diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java --- a/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java +++ b/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java @@ -51,6 +51,13 @@ import org.netbeans.modules.php.editor.parser.astnodes.PHPVarComment; /** + * PHPVarComment pattern: The first one is the IDE's own pattern. See + * {@link https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md} + * about the second one. + *
+ * /*  @var $variableName TypeName */
+ * /** @var TypeName $variableName Description */
+ * 
* * @author Petr Pisl */ @@ -59,6 +66,10 @@ private static final String PHPDOCTAG = "@" + PHPDocTag.Type.VAR.name().toLowerCase(); //NOI18N PHPVarComment parse(final int startOffset, final int endOffset, final String comment) { + boolean isPHPDoc = comment.startsWith("/**"); // NOI18N + int variableIndex = isPHPDoc ? 2 : 1; + int typeIndex = isPHPDoc ? 1 : 2; + int index = comment.indexOf(PHPDOCTAG); if (index > -1) { String definition = comment.substring(index); @@ -69,13 +80,14 @@ int startDocNode; int endPosition = 0; String[] parts = definition.split("[ \t]+"); //NOI18N - if (parts.length == 3 && parts[1].charAt(0) == '$') { //NOI18N + if (isExpectedPatrsLength(isPHPDoc, parts) + && parts[variableIndex].charAt(0) == '$') { //NOI18N //counting types - String[] types = parts[2].split("[|]"); //NOI18N - int typePosition = startOffset + comment.indexOf(parts[2]); + String[] types = parts[typeIndex].split("[|]"); //NOI18N + int typePosition = startOffset + comment.indexOf(parts[typeIndex]); ArrayList typeNodes = new ArrayList<>(); for (String type: types) { - startDocNode = typePosition + parts[2].indexOf(type); + startDocNode = typePosition + parts[typeIndex].indexOf(type); index = type.indexOf("::"); //NOI18N boolean isArray = (type.indexOf('[') > 0 && type.indexOf(']') > 0); if (isArray) { @@ -95,10 +107,10 @@ typeNodes.add(docType); } // counting variable - String variableName = parts[1]; - int indexOfArrayDimension = parts[1].indexOf("["); //NOI18N + String variableName = parts[variableIndex]; + int indexOfArrayDimension = parts[variableIndex].indexOf("["); //NOI18N if (indexOfArrayDimension != -1) { - variableName = parts[1].substring(0, indexOfArrayDimension); + variableName = parts[variableIndex].substring(0, indexOfArrayDimension); } startDocNode = startOffset + comment.indexOf(variableName); PHPDocNode variableNode = new PHPDocNode(startDocNode, startDocNode + variableName.length(), variableName); @@ -109,4 +121,11 @@ } return null; } + + private boolean isExpectedPatrsLength(boolean isPHPDoc, String[] parts) { + if (isPHPDoc) { + return parts.length >= 3; + } + return parts.length == 3; + } } diff --git a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java --- a/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java +++ b/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPVarComment.java @@ -46,6 +46,12 @@ * Represents a single line comment, where user is able to assigna a type to variable *
 @var $variable type 
. It has to be single line comment. Also it can * contains mixed type. e.g.
 @var $variable type1|type2 
+ * + * NOTE: There is an order difference. + *
+ * /*  @var $variableName TypeName */
+ * /** @var TypeName $variableName Description */
+ * 
* @author Petr Pisl */ public class PHPVarComment extends Comment { diff --git a/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml b/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml --- a/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml +++ b/php.editor/src/org/netbeans/modules/php/editor/resources/code-templates.xml @@ -321,7 +321,12 @@ - + + + + + + diff --git a/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java b/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java --- a/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java +++ b/php.editor/src/org/netbeans/modules/php/editor/verification/VarDocSuggestion.java @@ -91,7 +91,7 @@ } @Override - @Messages("VarDocHintDispName=Generate Type Comment For Variable /* @var $myvariable MyClass */") + @Messages("VarDocHintDispName=Generate Type Comment For Variable /** @var MyClass $myvariable */") public String getDisplayName() { return Bundle.VarDocHintDispName(); } @@ -196,7 +196,7 @@ } private String getCommentText() { - return String.format("%n/* @var %s %s */", vName.getName(), getTypeTemplate()); //NOI18N + return String.format("%n/** @var %s %s */", getTypeTemplate(), vName.getName()); //NOI18N } private String getTypeTemplate() { diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php @@ -0,0 +1,20 @@ +test(); // CC + +/** @var VarType $value */ +foreach ($array as $value) { + $value->test(); // CC +} diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVarTagType_01.completion @@ -0,0 +1,24 @@ +Code completion result for source line: +/** @var |VarType $varType */ +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +CLASS VarType [PUBLIC] vardoc.php +------------------------------------ +KEYWORD array null +KEYWORD bool null +KEYWORD boolean null +KEYWORD callable null +KEYWORD callback null +KEYWORD double null +KEYWORD false null +KEYWORD float null +KEYWORD int null +KEYWORD integer null +KEYWORD iterable null +KEYWORD mixed null +KEYWORD null null +KEYWORD object null +KEYWORD resource null +KEYWORD self null +KEYWORD string null +KEYWORD true null +KEYWORD void null diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_01.completion @@ -0,0 +1,5 @@ +Code completion result for source line: +$varType->|test(); // CC +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +METHOD test() [PUBLIC] VarType +VARIABLE ? publicField [PUBLIC] VarType diff --git a/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/completion/lib/vardoc/vardoc.php.testVariable_02.completion @@ -0,0 +1,5 @@ +Code completion result for source line: +$value->|test(); // CC +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +METHOD test() [PUBLIC] VarType +VARIABLE ? publicField [PUBLIC] VarType diff --git a/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php b/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/gotodeclaration/testVardoc/testVardoc.php @@ -0,0 +1,24 @@ +test(); + +/* @var $varType2 VarType */ +$varType2 = getVarType(); +$varType2->test(); + +/** @var VarType $value */ +foreach ($array as $value) { + $value->test(); +} diff --git a/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php b/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/markoccurences/testVardoc/testVardoc.php @@ -0,0 +1,24 @@ +test(); + +/* @var $varType2 VarType */ +$varType2 = getVarType(); +$varType2->test(); + +/** @var VarType $value */ +foreach ($array as $value) { + $value->test(); +} diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_01.occurrences @@ -0,0 +1,4 @@ +class |>MARK_OCCURRENCES:V^arType<| +/** @var |>MARK_OCCURRENCES:VarType<| $varType */ +/* @var $varType2 |>MARK_OCCURRENCES:VarType<| */ +/** @var |>MARK_OCCURRENCES:VarType<| $value */ diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_02.occurrences @@ -0,0 +1,4 @@ +class |>MARK_OCCURRENCES:VarType<| +/** @var |>MARK_OCCURRENCES:VarT^ype<| $varType */ +/* @var $varType2 |>MARK_OCCURRENCES:VarType<| */ +/** @var |>MARK_OCCURRENCES:VarType<| $value */ diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_03.occurrences @@ -0,0 +1,4 @@ +class |>MARK_OCCURRENCES:VarType<| +/** @var |>MARK_OCCURRENCES:VarType<| $varType */ +/* @var $varType2 |>MARK_OCCURRENCES:VarType<| */ +/** @var |>MARK_OCCURRENCES:Var^Type<| $value */ diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_04.occurrences @@ -0,0 +1,4 @@ +class |>MARK_OCCURRENCES:VarType<| +/** @var |>MARK_OCCURRENCES:VarType<| $varType */ +/* @var $varType2 |>MARK_OCCURRENCES:VarT^ype<| */ +/** @var |>MARK_OCCURRENCES:VarType<| $value */ diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_05.occurrences @@ -0,0 +1,4 @@ + public function |>MARK_OCCURRENCES:tes^t<|() +$varType->|>MARK_OCCURRENCES:test<|(); +$varType2->|>MARK_OCCURRENCES:test<|(); + $value->|>MARK_OCCURRENCES:test<|(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_06.occurrences @@ -0,0 +1,4 @@ + public function |>MARK_OCCURRENCES:test<|() +$varType->|>MARK_OCCURRENCES:tes^t<|(); +$varType2->|>MARK_OCCURRENCES:test<|(); + $value->|>MARK_OCCURRENCES:test<|(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_07.occurrences @@ -0,0 +1,4 @@ + public function |>MARK_OCCURRENCES:test<|() +$varType->|>MARK_OCCURRENCES:test<|(); +$varType2->|>MARK_OCCURRENCES:te^st<|(); + $value->|>MARK_OCCURRENCES:test<|(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_08.occurrences @@ -0,0 +1,4 @@ + public function |>MARK_OCCURRENCES:test<|() +$varType->|>MARK_OCCURRENCES:test<|(); +$varType2->|>MARK_OCCURRENCES:test<|(); + $value->^|>MARK_OCCURRENCES:test<|(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_09.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:va^rType<| */ +$|>MARK_OCCURRENCES:varType<| = getVarType(); +$|>MARK_OCCURRENCES:varType<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_10.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:varType<| */ +$^|>MARK_OCCURRENCES:varType<| = getVarType(); +$|>MARK_OCCURRENCES:varType<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_11.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:varType<| */ +$|>MARK_OCCURRENCES:varType<| = getVarType(); +$|>MARK_OCCURRENCES:varT^ype<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_12.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:val^ue<| */ +foreach ($array as $|>MARK_OCCURRENCES:value<|) { + $|>MARK_OCCURRENCES:value<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_13.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:value<| */ +foreach ($array as $^|>MARK_OCCURRENCES:value<|) { + $|>MARK_OCCURRENCES:value<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_14.occurrences @@ -0,0 +1,3 @@ +/** @var VarType $|>MARK_OCCURRENCES:value<| */ +foreach ($array as $|>MARK_OCCURRENCES:value<|) { + $|>MARK_OCCURRENCES:val^ue<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_15.occurrences @@ -0,0 +1,3 @@ +/* @var $|>MARK_OCCURRENCES:var^Type2<| VarType */ +$|>MARK_OCCURRENCES:varType2<| = getVarType(); +$|>MARK_OCCURRENCES:varType2<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_16.occurrences @@ -0,0 +1,3 @@ +/* @var $|>MARK_OCCURRENCES:varType2<| VarType */ +$|>MARK_OCCURRENCES:varT^ype2<| = getVarType(); +$|>MARK_OCCURRENCES:varType2<|->test(); diff --git a/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/data/testfiles/testVardoc.php.testVardoc_17.occurrences @@ -0,0 +1,3 @@ +/* @var $|>MARK_OCCURRENCES:varType2<| VarType */ +$|>MARK_OCCURRENCES:varType2<| = getVarType(); +$|>MARK_OCCURRENCES:varTyp^e2<|->test(); diff --git a/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints b/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints --- a/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints +++ b/php.editor/test/unit/data/testfiles/verification/testVarDocSuggestion.php.testVarDocSuggestion.hints @@ -1,4 +1,4 @@ $foo^Bar; ------- -HINT:Generate Type Comment For Variable /* @var $myvariable MyClass */ +HINT:Generate Type Comment For Variable /** @var MyClass $myvariable */ FIX:Generate Type Comment For Variable diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionVardocTest.java @@ -0,0 +1,80 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + */ +package org.netbeans.modules.php.editor.completion; + +import java.io.File; +import java.util.Collections; +import java.util.Map; +import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.modules.php.project.api.PhpSourcePath; +import org.netbeans.spi.java.classpath.support.ClassPathSupport; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + + +public class PHPCodeCompletionVardocTest extends PHPCodeCompletionTestBase { + + public PHPCodeCompletionVardocTest(String testName) { + super(testName); + } + + @Override + protected Map createClassPathsForTest() { + return Collections.singletonMap( + PhpSourcePath.SOURCE_CP, + ClassPathSupport.createClassPath(new FileObject[]{ + FileUtil.toFileObject(new File(getDataDir(), "/testfiles/completion/lib/vardoc/")) + }) + ); + } + + public void testVariable_01() throws Exception { + checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", "$varType->^test(); // CC", false); + } + + public void testVariable_02() throws Exception { + checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", " $value->^test(); // CC", false); + } + + public void testVarTagType_01() throws Exception { + checkCompletion("testfiles/completion/lib/vardoc/vardoc.php", "/** @var ^VarType $varType */", false); + } + +} diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationVardocTest.java @@ -0,0 +1,96 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + */ +package org.netbeans.modules.php.editor.csl; + +public class GotoDeclarationVardocTest extends GotoDeclarationTestBase { + + public GotoDeclarationVardocTest(String testName) { + super(testName); + } + + public void testVardoc_01() throws Exception { + checkDeclaration(getTestPath(), "/** @var ^VarType $varType */", "class ^VarType"); + } + + public void testVardoc_02() throws Exception { + checkDeclaration(getTestPath(), "/* @var $varType2 VarT^ype */", "class ^VarType"); + } + + public void testVardoc_03() throws Exception { + checkDeclaration(getTestPath(), "/** @var VarTy^pe $value */", "class ^VarType"); + } + + public void testVardoc_04() throws Exception { + checkDeclaration(getTestPath(), "$varType->tes^t();", " public function ^test()"); + } + + public void testVardoc_05() throws Exception { + checkDeclaration(getTestPath(), "$varType2->^test();", " public function ^test()"); + } + + public void testVardoc_06() throws Exception { + checkDeclaration(getTestPath(), " $value->te^st();", " public function ^test()"); + } + + public void testVardoc_07() throws Exception { + checkDeclaration(getTestPath(), "/** @var VarType $var^Type */", "$^varType = getVarType();"); + } + + public void testVardoc_08() throws Exception { + checkDeclaration(getTestPath(), "$var^Type->test();", "$^varType = getVarType();"); + } + + public void testVardoc_09() throws Exception { + checkDeclaration(getTestPath(), "/* @var $varT^ype2 VarType */", "$^varType2 = getVarType();"); + } + + public void testVardoc_10() throws Exception { + checkDeclaration(getTestPath(), "$varT^ype2->test();", "$^varType2 = getVarType();"); + } + + public void testVardoc_11() throws Exception { + checkDeclaration(getTestPath(), "/** @var VarType $va^lue */", "foreach ($array as $^value) {"); + } + + public void testVardoc_12() throws Exception { + checkDeclaration(getTestPath(), " $va^lue->test();", "foreach ($array as $^value) {"); + } + +} diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java new file mode 100644 --- /dev/null +++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplVardocTest.java @@ -0,0 +1,117 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + */ +package org.netbeans.modules.php.editor.csl; + + +public class OccurrencesFinderImplVardocTest extends OccurrencesFinderImplTestBase { + + public OccurrencesFinderImplVardocTest(String testName) { + super(testName); + } + + public void testVardoc_01() throws Exception { + checkOccurrences(getTestPath(), "class V^arType", true); + } + + public void testVardoc_02() throws Exception { + checkOccurrences(getTestPath(), "/** @var VarT^ype $varType */", true); + } + + public void testVardoc_03() throws Exception { + checkOccurrences(getTestPath(), "/** @var Var^Type $value */", true); + } + + public void testVardoc_04() throws Exception { + checkOccurrences(getTestPath(), "/* @var $varType2 VarT^ype */", true); + } + + public void testVardoc_05() throws Exception { + checkOccurrences(getTestPath(), " public function tes^t()", true); + } + + public void testVardoc_06() throws Exception { + checkOccurrences(getTestPath(), "$varType->tes^t();", true); + } + + public void testVardoc_07() throws Exception { + checkOccurrences(getTestPath(), "$varType2->te^st();", true); + } + + public void testVardoc_08() throws Exception { + checkOccurrences(getTestPath(), " $value->^test();", true); + } + + public void testVardoc_09() throws Exception { + checkOccurrences(getTestPath(), "/** @var VarType $va^rType */", true); + } + + public void testVardoc_10() throws Exception { + checkOccurrences(getTestPath(), "$^varType = getVarType();", true); + } + + public void testVardoc_11() throws Exception { + checkOccurrences(getTestPath(), "$varT^ype->test();", true); + } + + public void testVardoc_12() throws Exception { + checkOccurrences(getTestPath(), "/** @var VarType $val^ue */", true); + } + + public void testVardoc_13() throws Exception { + checkOccurrences(getTestPath(), "foreach ($array as $^value) {", true); + } + + public void testVardoc_14() throws Exception { + checkOccurrences(getTestPath(), " $val^ue->test();", true); + } + + public void testVardoc_15() throws Exception { + checkOccurrences(getTestPath(), "/* @var $var^Type2 VarType */", true); + } + + public void testVardoc_16() throws Exception { + checkOccurrences(getTestPath(), "$varT^ype2 = getVarType();", true); + } + + public void testVardoc_17() throws Exception { + checkOccurrences(getTestPath(), "$varTyp^e2->test();", true); + } + +} diff --git a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java --- a/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java +++ b/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParserTest.java @@ -91,4 +91,58 @@ assertEquals(1, varComment.getVariable().getTypes().size()); } + public void testArrayForPHPDocPattern_01() throws Exception { + String comment = "/** @var TestClass $b['y'] */"; + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + + public void testArrayForPHPDocPattern_02() throws Exception { + String comment = "/** @var TestClass $b[\"y\"] */"; + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + + public void testPHPDocPattern_01() throws Exception { + String comment = "/** @var Type $b */"; // TAB + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + + public void testForPHPDocPattern_02() throws Exception { + String comment = "/** @var Type $b */"; // TAB + space + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + + public void testForPHPDocPattern_03() throws Exception { + String comment = "/** @var Type $b Description */"; + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + + public void testForPHPDocPattern_04() throws Exception { + String comment = "/** @var Type $b Long Description Something.*/"; + PHPVarCommentParser parser = new PHPVarCommentParser(); + PHPVarComment varComment = parser.parse(0, comment.length(), comment); + assertEquals(Comment.Type.TYPE_VARTYPE, varComment.getCommentType()); + assertEquals("$b", varComment.getVariable().getVariable().getValue()); + assertEquals(1, varComment.getVariable().getTypes().size()); + } + } diff --git a/php.editor/tools/ASTPHP5Scanner.flex b/php.editor/tools/ASTPHP5Scanner.flex --- a/php.editor/tools/ASTPHP5Scanner.flex +++ b/php.editor/tools/ASTPHP5Scanner.flex @@ -1046,6 +1046,11 @@ //return createFullSymbol(ASTPHP5Symbols.T_VAR_COMMENT); } +"/**"{WHITESPACE}*"@var"{WHITESPACE}{QUALIFIED_LABEL}("[""]")*([|]{QUALIFIED_LABEL}("[""]")*)*{WHITESPACE}("$"){LABEL}("["({LABEL} | "\"" | "'")*"]")*{WHITESPACE}?[^\n\r]*"*/" { + comment = yytext(); + handleVarComment(); +} + "/**" { if (!parsePHPDoc()) { handleCommentStart();