diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index bc4a42add..1625e6b2e 100644 Binary files a/lib/jsyntaxpane-0.9.5.jar and b/lib/jsyntaxpane-0.9.5.jar differ diff --git a/libsrc/ffdec_lib/lexers/actionscript3_script.flex b/libsrc/ffdec_lib/lexers/actionscript3_script.flex index 8e393ed1f..f0b94ba62 100644 --- a/libsrc/ffdec_lib/lexers/actionscript3_script.flex +++ b/libsrc/ffdec_lib/lexers/actionscript3_script.flex @@ -1,16 +1,16 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Stack; -%% +%% %public %class ActionScriptLexer @@ -37,7 +37,7 @@ import java.util.Stack; public ActionScriptLexer(String sourceCode){ this(new StringReader(sourceCode)); - this.sourceCode = sourceCode; + this.sourceCode = sourceCode; } public void yypushbackstr(String s, int state) @@ -115,7 +115,7 @@ InputCharacter = [^\r\n] WhiteSpace = {LineTerminator} | [ \t\f]+ /* comments */ -Comment = {TraditionalComment} | {EndOfLineComment} +Comment = {TraditionalComment} | {EndOfLineComment} TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? @@ -188,19 +188,20 @@ HexDigit = [0-9a-fA-F] OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} OctDigit = [0-7] - -/* floating point literals */ + +/* floating point literals */ DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? -FLit1 = [0-9]+ \. [0-9]* -FLit2 = \. [0-9]+ -FLit3 = [0-9]+ +FLit1 = [0-9]+ \. [0-9]* +FLit2 = \. [0-9]+ +FLit3 = [0-9]+ Exponent = [eE] [+-]? [0-9]+ /* string and character literals */ StringCharacter = [^\r\n\"\\] SingleCharacter = [^\r\n\'\\] OIdentifierCharacter = [^\r\n\u00A7\\] +Preprocessor = \u00A7\u00A7 {Identifier} %state STRING, CHARLITERAL,XMLOPENTAG,XMLOPENTAGATTRIB,XMLINSTROPENTAG,XMLINSTRATTRIB,XMLCDATA,XMLCOMMENT,XML,OIDENTIFIER @@ -252,7 +253,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] "false" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); } "null" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); } "this" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); } - "true" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); } + "true" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); } "undefined" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); } "Infinity" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); } "NaN" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); } @@ -261,99 +262,102 @@ OIdentifierCharacter = [^\r\n\u00A7\\] /* operators */ - "(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } - ")" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } - "{" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } - "}" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } - "[" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } - "]" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } - ";" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } - "," { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } - "..." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } - "." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } - "=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } - ">" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } - "<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } - "!" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } - "~" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } - "?" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } - ":" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } - "===" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } - "==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } - "<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } - ">=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } - "!==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } - "!=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } - "&&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } - "||" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } - "++" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } - "--" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } - "+" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } - "-" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } - "*" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } - "/" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } - "&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } - "|" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } - "^" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } - "%" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } - "<<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } - ">>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } - ">>>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } - "+=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } - "-=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } - "*=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } - "/=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } - "&=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } - "|=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } - "^=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } - "%=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } - "<<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } - ">>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } - ">>>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } - "as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); } - "delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } - "instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } - "is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); } - "::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); } - "new" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } - "typeof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } - "void" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } - "@" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } + "(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } + ")" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } + "{" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } + "}" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } + "[" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } + "]" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } + ";" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } + "," { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } + "..." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } + "." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } + "=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } + ">" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } + "<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } + "!" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } + "~" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } + "?" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } + ":" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } + "===" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } + "==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } + "<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } + ">=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } + "!==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } + "!=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } + "&&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } + "||" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } + "++" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } + "--" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } + "+" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } + "-" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } + "*" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } + "/" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } + "&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } + "|" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } + "^" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } + "%" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } + "<<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } + ">>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } + ">>>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } + "+=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } + "-=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } + "*=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } + "/=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } + "&=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } + "|=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } + "^=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } + "%=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } + "<<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } + ">>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } + ">>>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } + "as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); } + "delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } + "instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } + "is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); } + "::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); } + "new" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } + "typeof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } + "void" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } + "@" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } ".(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FILTER, yytext()); } ".." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DESCENDANTS, yytext()); } - + /* string literal */ - \" { + \" { string.setLength(0); - yybegin(STRING); + yybegin(STRING); } - "\u00A7" { + {Preprocessor} { + return new ParsedSymbol(SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); + } + "\u00A7" { string.setLength(0); - yybegin(OIDENTIFIER); + yybegin(OIDENTIFIER); } /* character literal */ - \' { + \' { string.setLength(0); - yybegin(CHARLITERAL); + yybegin(CHARLITERAL); } /* numeric literals */ {DecIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); } - + {HexIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); } - + {OctIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); } - + {DoubleLiteral} { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); } - + /* comments */ {Comment} { /*ignore*/ } {LineTerminator} { yyline++;} /* whitespace */ - {WhiteSpace} { /*ignore*/ } + {WhiteSpace} { /*ignore*/ } {TypeNameSpec} { return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, yytext()); } {XmlOpenTagStart} { yybegin(XMLOPENTAG); @@ -361,9 +365,9 @@ OIdentifierCharacter = [^\r\n\u00A7\\] return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext()); } "<{" { return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext()); } - /* identifiers */ - {Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } - + /* identifiers */ + {Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } + } { @@ -402,9 +406,9 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.setLength(0); } return lex(); - } + } {LineTerminator} { string.append(yytext()); yyline++;} - {WhiteSpace} { string.append(yytext()); } + {WhiteSpace} { string.append(yytext()); } } @@ -416,8 +420,8 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } "{" { yybegin(YYINITIAL); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRVALVAR_BEGIN, yytext()); - } + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRVALVAR_BEGIN, yytext()); + } } @@ -448,7 +452,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.setLength(0); } return lex(); - } + } {LineTerminator} { string.append(yytext()); yyline++;} {WhiteSpace} { string.append(yytext()); } } @@ -461,11 +465,11 @@ OIdentifierCharacter = [^\r\n\u00A7\\] \"{XmlSQuoteStringChar}*\" { yybegin(XMLINSTROPENTAG); return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext()); - } + } "{" { yybegin(YYINITIAL); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext()); - } + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext()); + } } @@ -529,14 +533,14 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } return lex(); } - {XmlCloseTag} { + {XmlCloseTag} { pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHTAG, yytext())); if (string.length() > 0){ pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); string.setLength(0); } return lex(); - } + } "<{" { yybegin(YYINITIAL); @@ -547,7 +551,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } return lex(); } - " 0){ @@ -555,8 +559,8 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.setLength(0); } return lex(); - } - "{" { + } + "{" { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_VAR_BEGIN, yytext())); if (string.length() > 0){ @@ -564,18 +568,18 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.setLength(0); } return lex(); - } + } {LineTerminator} { string.append(yytext()); yyline++;} [^] { string.append(yytext()); } } { - "\u00A7" { - yybegin(YYINITIAL); + "\u00A7" { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); } - + {OIdentifierCharacter}+ { string.append(yytext()); } /* escape sequences */ @@ -590,7 +594,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } - + /* escape sequences */ \\. { throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); } @@ -598,12 +602,12 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \" { - yybegin(YYINITIAL); + \" { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); } - + {StringCharacter}+ { string.append(yytext()); } /* escape sequences */ @@ -619,7 +623,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } - + /* escape sequences */ \\. { /* ignore illegal character escape */ } @@ -627,14 +631,14 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \' { - yybegin(YYINITIAL); + \' { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); } - + {SingleCharacter}+ { string.append(yytext()); } - + /* escape sequences */ "\\b" { string.append('\b'); } "\\t" { string.append('\t'); } @@ -648,7 +652,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } - + /* escape sequences */ \\. { /* ignore illegal character escape */ } diff --git a/libsrc/ffdec_lib/lexers/actionscript_script.flex b/libsrc/ffdec_lib/lexers/actionscript_script.flex index 350dca603..d00294b43 100644 --- a/libsrc/ffdec_lib/lexers/actionscript_script.flex +++ b/libsrc/ffdec_lib/lexers/actionscript_script.flex @@ -1,16 +1,16 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ @@ -20,7 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Stack; -%% +%% %public %class ActionScriptLexer @@ -95,7 +95,7 @@ InputCharacter = [^\r\n] WhiteSpace = {LineTerminator} | [ \t\f]+ /* comments */ -Comment = {TraditionalComment} | {EndOfLineComment} +Comment = {TraditionalComment} | {EndOfLineComment} TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? @@ -123,13 +123,13 @@ HexDigit = [0-9a-fA-F] OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} OctDigit = [0-7] - -/* floating point literals */ + +/* floating point literals */ DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? -FLit1 = [0-9]+ \. [0-9]* -FLit2 = \. [0-9]+ -FLit3 = [0-9]+ +FLit1 = [0-9]+ \. [0-9]* +FLit2 = \. [0-9]+ +FLit3 = [0-9]+ Exponent = [eE] [+-]? [0-9]+ /* string and character literals */ @@ -137,6 +137,8 @@ StringCharacter = [^\r\n\"\\] SingleCharacter = [^\r\n\'\\] OIdentifierCharacter = [^\r\n\u00A7\\] +Preprocessor = \u00A7\u00A7 {Identifier} + %state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER %% @@ -236,108 +238,112 @@ OIdentifierCharacter = [^\r\n\u00A7\\] "unloadMovie" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); } "unloadMovieNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); } "fscommand" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); } - + /* operators */ - "(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } - ")" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } - "{" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } - "}" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } - "[" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } - "]" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } - ";" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } - "," { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } - "..." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } - "." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } - "=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } - ">" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } - "<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } - "!" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } - "~" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } - "?" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } - ":" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } - "===" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } - "==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } - "<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } - ">=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } - "!==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } - "!=" | "<>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } - "&&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } - "||" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } - "++" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } - "--" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } - "+" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } - "-" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } - "*" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } - "/" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } - "&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } - "|" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } - "^" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } - "%" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } - "<<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } - ">>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } - ">>>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } - "+=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } - "-=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } - "*=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } - "/=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } - "&=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } - "|=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } - "^=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } - "%=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } - "<<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } - ">>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } - ">>>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } - "as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); } - "delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } - "instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } - "is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); } - "::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); } - "new" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } - "typeof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } - "void" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } - "@" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } - "and" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); } - "or" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); } - + "(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } + ")" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } + "{" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } + "}" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } + "[" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } + "]" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } + ";" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } + "," { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } + "..." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } + "." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } + "=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } + ">" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } + "<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } + "!" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } + "~" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } + "?" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } + ":" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } + "===" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } + "==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } + "<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } + ">=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } + "!==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } + "!=" | "<>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } + "&&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } + "||" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } + "++" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } + "--" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } + "+" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } + "-" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } + "*" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } + "/" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } + "&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } + "|" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } + "^" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } + "%" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } + "<<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } + ">>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } + ">>>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } + "+=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } + "-=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } + "*=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } + "/=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } + "&=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } + "|=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } + "^=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } + "%=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } + "<<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } + ">>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } + ">>>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } + "as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); } + "delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } + "instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } + "is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); } + "::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); } + "new" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } + "typeof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } + "void" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } + "@" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } + "and" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); } + "or" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); } + /* string literal */ - \" { + \" { string.setLength(0); - yybegin(STRING); + yybegin(STRING); } - "\u00A7" { + {Preprocessor} { + return new ParsedSymbol(SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); + } + + "\u00A7" { string.setLength(0); - yybegin(OIDENTIFIER); - } + yybegin(OIDENTIFIER); + } /* character literal */ - \' { + \' { string.setLength(0); - yybegin(CHARLITERAL); + yybegin(CHARLITERAL); } /* numeric literals */ {DecIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); } - + {HexIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); } - + {OctIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); } - + {DoubleLiteral} { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); } - + /* comments */ {Comment} { /*ignore*/ } {LineTerminator} { yyline++;} /* whitespace */ - {WhiteSpace} { /*ignore*/ } + {WhiteSpace} { /*ignore*/ } {TypeNameSpec} { String t = yytext(); return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, t.substring(2, t.length() - 1)); } {XMLBeginOneTag} {string.setLength(0); - yybegin(XML); - String s = yytext(); + yybegin(XML); + String s = yytext(); s = s.substring(1, s.length() - 1); if (s.contains(" ")){ s = s.substring(0, s.indexOf(' ')); @@ -345,8 +351,8 @@ OIdentifierCharacter = [^\r\n\u00A7\\] xmlTagName = s; string.append(yytext()); } - /* identifiers */ - {Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } + /* identifiers */ + {Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } } { @@ -359,7 +365,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] {XMLBeginOneTag} { string.append(yytext());} {XMLEndTag} { string.append(yytext()); String endtagname = yytext(); - endtagname = endtagname.substring(2, endtagname.length() - 1); + endtagname = endtagname.substring(2, endtagname.length() - 1); if (endtagname.equals(xmlTagName)){ yybegin(YYINITIAL); return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML, string.toString()); @@ -370,12 +376,12 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - "\u00A7" { - yybegin(YYINITIAL); + "\u00A7" { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); } - + {OIdentifierCharacter}+ { string.append(yytext()); } /* escape sequences */ @@ -390,7 +396,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } - + /* escape sequences */ \\. { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); } @@ -398,12 +404,12 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \" { - yybegin(YYINITIAL); + \" { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); } - + {StringCharacter}+ { string.append(yytext()); } /* escape sequences */ @@ -414,14 +420,14 @@ OIdentifierCharacter = [^\r\n\u00A7\\] "\\r" { string.append('\r'); } "\\\"" { string.append('\"'); } "\\'" { string.append('\''); } - "\\\\" { string.append('\\'); } + "\\\\" { string.append('\\'); } \\x{HexDigit}{2} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } \\{OctDigit}{3} { char val = (char) Integer.parseInt(yytext().substring(1), 8); string.append(val); } - + /* escape sequences */ \\. { string.append('\\'); /*illegal escape sequence*/ } @@ -429,14 +435,14 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \' { - yybegin(YYINITIAL); + \' { + yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); } - + {SingleCharacter}+ { string.append(yytext()); } - + /* escape sequences */ /* escape sequences */ "\\b" { string.append('\b'); } @@ -451,7 +457,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] string.append(val); } \\u{HexDigit}{4} { char val = (char) Integer.parseInt(yytext().substring(2), 16); string.append(val); } - + /* escape sequences */ \\. { string.append('\\'); /*illegal escape sequence*/ } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index f503d6179..981975e13 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -1777,7 +1777,7 @@ public final class SWF implements SWFContainerItem, Timelined { private static void getVariables(List> variables, List functions, HashMap strings, HashMap usageTypes, ActionGraphSource code, int addr, String path) throws InterruptedException { ActionLocalData localData = new ActionLocalData(); - getVariables(null, localData, new TranslateStack(), new ArrayList(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList(), usageTypes, path); + getVariables(null, localData, new TranslateStack(path), new ArrayList(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList(), usageTypes, path); } private List> getVariables(List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes, ASMSource src, String path) throws InterruptedException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index e1b934290..3218b5438 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -59,17 +59,21 @@ import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.utf8.Utf8PrintWriter; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; +import javafx.collections.transformation.SortedList; public class ABC { @@ -107,7 +111,7 @@ public class ABC { public ABCContainerTag parentTag; /* Map from multiname index of namespace value to namespace name**/ - private Map namespaceMap; + private Map namespaceMap; public ABC(ABCContainerTag tag) { this.parentTag = tag; @@ -323,7 +327,7 @@ public class ABC { int mIndex = body.getCode().code.get(ip).operands[0]; if (mIndex > 0) { Multiname m = constants.getMultiname(mIndex); - if (m.getNameWithNamespace(constants, true).equals("flash.utils.getDefinitionByName")) { + if (m.getNameWithNamespace(constants).equals("flash.utils.getDefinitionByName")) { if (ip > 0) { if (body.getCode().code.get(ip - 1).definition instanceof PushStringIns) { int strIndex = body.getCode().code.get(ip - 1).operands[0]; @@ -812,16 +816,16 @@ public class ABC { } } - private Map getNamespaceMap() { + private Map getNamespaceMap() { if (namespaceMap == null) { - Map map = new HashMap<>(); + Map map = new HashMap<>(); for (ScriptInfo si : script_info) { for (Trait t : si.traits.traits) { if (t instanceof TraitSlotConst) { TraitSlotConst s = ((TraitSlotConst) t); if (s.isNamespace()) { String key = constants.getNamespace(s.value_index).getName(constants, true); // assume not null - String val = constants.getMultiname(s.name_index).getNameWithNamespace(constants, true); + DottedChain val = constants.getMultiname(s.name_index).getNameWithNamespace(constants); map.put(key, val); } } @@ -855,15 +859,15 @@ public class ABC { return bodyIdxFromMethodIdx; } - public String nsValueToName(String value) { + public DottedChain nsValueToName(String value) { if (getNamespaceMap().containsKey(value)) { return getNamespaceMap().get(value); } else { String ns = getDeobfuscation().builtInNs(value); if (ns == null) { - return ""; + return new DottedChain(""); } else { - return ns; + return new DottedChain(ns); } } } @@ -1037,8 +1041,8 @@ public class ABC { public int findClassByName(String name) { for (int c = 0; c < instance_info.size(); c++) { - String s = constants.getMultiname(instance_info.get(c).name_index).getNameWithNamespace(constants, true); - if (name.equals(s)) { + DottedChain s = constants.getMultiname(instance_info.get(c).name_index).getNameWithNamespace(constants); + if (name.equals(s.toString())) { return c; } } @@ -1229,31 +1233,54 @@ public class ABC { method_info.remove(index); } - public void replaceScriptPack(ScriptPack pack, String as) throws AVM2ParseException, CompilationException, IOException, InterruptedException { + public boolean replaceScriptPack(ScriptPack pack, String as) throws AVM2ParseException, CompilationException, IOException, InterruptedException { String scriptName = pack.getPathScriptName() + ".as"; int oldIndex = pack.scriptIndex; int newIndex = script_info.size(); String documentClass = getSwf().getDocumentClass(); boolean isDocumentClass = documentClass != null && documentClass.equals(pack.getClassPath().toString()); + boolean isSimple = pack.isSimple; + ScriptInfo si = script_info.get(oldIndex); - si.delete(this, true); - int newClassIndex = instance_info.size(); - for (Trait t : si.traits.traits) { - if (t instanceof TraitClass) { - TraitClass tc = (TraitClass) t; - newClassIndex = tc.class_info + 1; + if (isSimple) { + si.delete(this, true); + } else { + for (int t : pack.traitIndices) { + si.traits.traits.get(t).delete(this, true); } } + + int newClassIndex = instance_info.size(); + for (int t : pack.traitIndices) { + if (si.traits.traits.get(t) instanceof TraitClass) { + TraitClass tc = (TraitClass) si.traits.traits.get(t); + newClassIndex = tc.class_info + 1; + } + + } List otherAbcs = new ArrayList<>(pack.allABCs); + otherAbcs.remove(this); ActionScript3Parser.compile(as, this, otherAbcs, isDocumentClass, scriptName, newClassIndex); - // Move newly added script to its position - script_info.set(oldIndex, script_info.get(newIndex)); - script_info.remove(newIndex); + + if (isSimple) { + // Move newly added script to its position + script_info.set(oldIndex, script_info.get(newIndex)); + script_info.remove(newIndex); + } else { + script_info.get(newIndex).setModified(true); + //Note: Is deleting traits safe? + List todel = new ArrayList<>(new TreeSet<>(pack.traitIndices)); + for (int i = todel.size() - 1; i >= 0; i--) { + si.traits.traits.remove((int) todel.get(i)); + } + } + script_info.get(oldIndex).setModified(true); pack(); // removes old classes/methods ((Tag) parentTag).setModified(true); + return !isSimple; } public void pack() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java index 212210862..c62dd113d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.graph.ScopeStack; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -56,9 +57,10 @@ public class AVM2LocalData extends BaseLocalData { public ArrayList parsedExceptions; - public ArrayList finallyJumps; + public Map> finallyJumps; - public ArrayList ignoredSwitches; + public Map ignoredSwitches; + public List ignoredSwitches2; public Integer scriptIndex; @@ -88,6 +90,7 @@ public class AVM2LocalData extends BaseLocalData { parsedExceptions = localData.parsedExceptions; finallyJumps = localData.finallyJumps; ignoredSwitches = localData.ignoredSwitches; + ignoredSwitches2 = localData.ignoredSwitches2; scriptIndex = localData.scriptIndex; localRegAssignmentIps = localData.localRegAssignmentIps; ip = localData.ip; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index d65a131c1..4df46c4f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -61,6 +61,7 @@ public class ScriptPack extends AS3ClassTreeItem { public final List traitIndices; private final ClassPath path; + public boolean isSimple = false; @Override public SWF getSwf() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 862fbf048..d809f6a08 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -282,6 +282,7 @@ import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.decompiler.graph.TranslateException; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.ExitItem; import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.helpers.Helper; import java.io.ByteArrayInputStream; @@ -1153,7 +1154,7 @@ public class AVM2Code implements Cloneable { } int ret = posCache.indexOf(address); if (ret == -1) { - throw new ConvertException("Bad jump try conver ofs" + Helper.formatAddress(address) + " ", -1); + throw new ConvertException("Invalid jump to ofs" + Helper.formatAddress(address), -1); } return ret; } @@ -1247,8 +1248,8 @@ public class AVM2Code implements Cloneable { if (isKilled(((SetLocalAVM2Item) output.get(i)).regIndex, 0, code.size() - 1)) { SetLocalAVM2Item lsi = (SetLocalAVM2Item) output.get(i); if (i + 1 < output.size()) { - if (output.get(i + 1) instanceof ReturnValueAVM2Item) { - ReturnValueAVM2Item rv = (ReturnValueAVM2Item) output.get(i + 1); + if (output.get(i + 1) instanceof ExitItem) { + GraphTargetItem rv = output.get(i + 1); if (rv.value instanceof LocalRegAVM2Item) { LocalRegAVM2Item lr = (LocalRegAVM2Item) rv.value; if (lr.regIndex == lsi.regIndex) { @@ -1446,7 +1447,7 @@ public class AVM2Code implements Cloneable { } } if (!isKilled(reg, 0, end)) { - GraphTargetItem vx = stack.pop(); + GraphTargetItem vx = stack.pop().getThroughDuplicate(); int dupCnt = 1; for (int i = ip - 1; i >= start; i--) { if (code.get(i).definition instanceof DupIns) { @@ -1773,118 +1774,203 @@ public class AVM2Code implements Cloneable { return list; } + public void updateOffsets(OffsetUpdater updater, MethodBody body) { + for (int i = 0; i < code.size(); i++) { + AVM2Instruction ins = code.get(i); + if (ins.definition instanceof LookupSwitchIns) { + long target = ins.offset + ins.operands[0]; + ins.operands[0] = updater.updateOperandOffset(ins.offset, target, ins.operands[0]); + for (int k = 2; k < ins.operands.length; k++) { + target = ins.offset + ins.operands[k]; + ins.operands[k] = updater.updateOperandOffset(ins.offset, target, ins.operands[k]); + } + } else { + /*for (int j = 0; j < ins.definition.operands.length; j++) { + if (ins.definition.operands[j] == AVM2Code.DAT_OFFSET) { + long target = ins.offset + ins.getBytes().length + ins.operands[j]; + ins.operands[j] = updater.updateOperandOffset(target, ins.operands[j]); + } + }*/ + //Faster, but not so universal + if ((ins.definition instanceof JumpIns) || (ins.definition instanceof IfTypeIns)) { + long target = ins.offset + ins.getBytes().length + ins.operands[0]; + ins.operands[0] = updater.updateOperandOffset(ins.offset, target, ins.operands[0]); + } + } + ins.offset = updater.updateInstructionOffset(ins.offset); + } + + for (ABCException ex : body.exceptions) { + ex.start = updater.updateOperandOffset(-1, ex.start, ex.start); + ex.end = updater.updateOperandOffset(-1, ex.end, ex.end); + ex.target = updater.updateOperandOffset(-1, ex.target, ex.target); + } + } + + private void checkValidOffsets(MethodBody body) { + updateOffsets(new OffsetUpdater() { + + @Override + public long updateInstructionOffset(long offset) { + adr2pos(offset); + return offset; + } + + @Override + public int updateOperandOffset(long insAddr, long targetAddress, int offset) { + adr2pos(targetAddress); + return offset; + } + + }, body); + } + public void removeInstruction(int pos, MethodBody body) { if ((pos < 0) || (pos >= code.size())) { throw new IndexOutOfBoundsException(); } - int byteCount = code.get(pos).getBytes().length; - long remOffset = code.get(pos).offset; - for (int i = pos + 1; i < code.size(); i++) { - code.get(i).offset -= byteCount; - } + checkValidOffsets(body); + final long remOffset = code.get(pos).offset; + final int byteCount = code.get(pos).getBytes().length; + updateOffsets(new OffsetUpdater() { + @Override + public long updateInstructionOffset(long address) { + if (address > remOffset) { + return address - byteCount; + } + return address; + } - for (ABCException ex : body.exceptions) { - if (ex.start > remOffset) { - ex.start -= byteCount; - } - if (ex.end > remOffset) { - ex.end -= byteCount; - } - if (ex.target > remOffset) { - ex.target -= byteCount; - } - } - - for (int i = 0; i < pos; i++) { - if (code.get(i).definition instanceof LookupSwitchIns) { - long target = code.get(i).offset + code.get(i).operands[0]; - if (target > remOffset) { - code.get(i).operands[0] -= byteCount; - } - for (int k = 2; k < code.get(i).operands.length; k++) { - target = code.get(i).offset + code.get(i).operands[k]; - if (target > remOffset) { - code.get(i).operands[k] -= byteCount; - } - } - } else { - for (int j = 0; j < code.get(i).definition.operands.length; j++) { - if (code.get(i).definition.operands[j] == AVM2Code.DAT_OFFSET) { - long target = code.get(i).offset + code.get(i).getBytes().length + code.get(i).operands[j]; - if (target > remOffset) { - code.get(i).operands[j] -= byteCount; - } + @Override + public int updateOperandOffset(long insAddr, long targetAddress, int offset) { + if (targetAddress > remOffset) { + if (insAddr > remOffset) { + return offset; } + return offset - byteCount; } + return offset; } - } - for (int i = pos + 1; i < code.size(); i++) { - if (code.get(i).definition instanceof LookupSwitchIns) { - long target = code.get(i).offset + code.get(i).operands[0]; - if (target < remOffset) { - code.get(i).operands[0] += byteCount; - } - for (int k = 2; k < code.get(i).operands.length; k++) { - target = code.get(i).offset + code.get(i).operands[k]; - if (target < remOffset) { - code.get(i).operands[k] += byteCount; - } - } - } else { - for (int j = 0; j < code.get(i).definition.operands.length; j++) { - if (code.get(i).definition.operands[j] == AVM2Code.DAT_OFFSET) { - long target = code.get(i).offset + code.get(i).getBytes().length + code.get(i).operands[j]; - if (target < remOffset) { - code.get(i).operands[j] += byteCount; - } - } - } - } - } - + }, body); code.remove(pos); invalidateCache(); + checkValidOffsets(body); + //System.exit(0); + } - public void insertInstruction(int pos, AVM2Instruction instruction) { + /** + * Inserts instuction at specified point. Handles offsets properly. Note: If + * newinstruction is jump, the offset operand must be handled properly by + * caller. All old jump offsets to pos are targeted before new instruction. + * + * @param pos Position in the list + * @param instruction Instruction False means before new instruction + * @param body Method body (used for try handling) + */ + public void insertInstruction(int pos, AVM2Instruction instruction, MethodBody body) { + insertInstruction(pos, instruction, false, body); + } + + /** + * Replaces instrunction by another. Properly handles offsets. Note: If + * newinstruction is jump, the offset operand must be handled properly by + * caller. + * + * @param pos + * @param instruction + * @param body + */ + public void replaceInstruction(int pos, AVM2Instruction instruction, MethodBody body) { if (pos < 0) { pos = 0; } if (pos > code.size()) { pos = code.size(); } - int byteCount = instruction.getBytes().length; + instruction.offset = code.get(pos).offset; + int oldByteCount = code.get(pos).getBytes().length; + int newByteCount = instruction.getBytes().length; + int byteDelta = newByteCount - oldByteCount; + + if (byteDelta != 0) { + updateOffsets(new OffsetUpdater() { + + @Override + public long updateInstructionOffset(long addr) { + if (addr > instruction.offset) { + return addr + byteDelta; + } + return addr; + } + + @Override + public int updateOperandOffset(long insAddr, long targetAddress, int offset) { + if (targetAddress > instruction.offset && insAddr <= instruction.offset) { + return offset + byteDelta; + } + if (targetAddress <= instruction.offset && insAddr > instruction.offset) { + return offset - byteDelta; + } + return offset; + } + }, body); + } + code.set(pos, instruction); + invalidateCache(); + checkValidOffsets(body); + } + + /** + * Inserts instuction at specified point. Handles offsets properly. Note: If + * newinstruction is jump, the offset operand must be handled properly by + * caller. + * + * @param pos Position in the list + * @param instruction Instruction + * @param mapOffsetsAfterIns Map all jumps to the pos after new instruction? + * False means before new instruction + * @param body Method body (used for try handling) + */ + public void insertInstruction(int pos, AVM2Instruction instruction, boolean mapOffsetsAfterIns, MethodBody body) { + checkValidOffsets(body); + if (pos < 0) { + pos = 0; + } + if (pos > code.size()) { + pos = code.size(); + } + final int byteCount = instruction.getBytes().length; if (pos == code.size()) { instruction.offset = code.get(pos - 1).offset + code.get(pos - 1).getBytes().length; } else { instruction.offset = code.get(pos).offset; } + updateOffsets(new OffsetUpdater() { - for (int i = 0; i < pos; i++) { - for (int j = 0; j < code.get(i).definition.operands.length; j++) { - if (code.get(i).definition.operands[j] == AVM2Code.DAT_OFFSET) { - long target = code.get(i).offset + code.get(i).getBytes().length + code.get(i).operands[j]; - if (target >= instruction.offset) { - code.get(i).operands[j] += byteCount; - } + @Override + public long updateInstructionOffset(long offset) { + if (offset >= instruction.offset) { + return offset + byteCount; } + return offset; } - } - for (int i = pos; i < code.size(); i++) { - for (int j = 0; j < code.get(i).definition.operands.length; j++) { - if (code.get(i).definition.operands[j] == AVM2Code.DAT_OFFSET) { - long target = code.get(i).offset + code.get(i).getBytes().length + code.get(i).operands[j]; - if (target < instruction.offset) { - code.get(i).operands[j] -= byteCount; - } - } - } - } - for (int i = pos + 1; i < code.size(); i++) { - code.get(i).offset += byteCount; - } + @Override + public int updateOperandOffset(long insAddr, long targetAddress, int offset) { + //System.err.println("instruction.offset=" + instruction.offset); + if ((targetAddress > instruction.offset) || (mapOffsetsAfterIns && (targetAddress == instruction.offset))) { + if (insAddr >= instruction.offset) { + return offset; + } + return offset + byteCount; + } + return offset; + } + }, body); code.add(pos, instruction); + invalidateCache(); + checkValidOffsets(body); } @SuppressWarnings("unchecked") @@ -1903,6 +1989,7 @@ public class AVM2Code implements Cloneable { ret.parsedExceptions = localData.parsedExceptions; ret.finallyJumps = localData.finallyJumps; ret.ignoredSwitches = localData.ignoredSwitches; + ret.ignoredSwitches2 = localData.ignoredSwitches2; ret.scriptIndex = localData.scriptIndex; ret.localRegAssignmentIps = localData.localRegAssignmentIps; ret.ip = localData.ip; @@ -1925,8 +2012,9 @@ public class AVM2Code implements Cloneable { localData.localRegNames = body.getLocalRegNames(abc); localData.fullyQualifiedNames = new ArrayList<>(); localData.parsedExceptions = new ArrayList<>(); - localData.finallyJumps = new ArrayList<>(); - localData.ignoredSwitches = new ArrayList<>(); + localData.finallyJumps = new HashMap<>(); + localData.ignoredSwitches = new HashMap<>(); + localData.ignoredSwitches2 = new ArrayList<>(); localData.scriptIndex = scriptIndex; localData.localRegAssignmentIps = new HashMap<>(); localData.ip = 0; @@ -2450,36 +2538,38 @@ public class AVM2Code implements Cloneable { restoreControlFlowPass(constants, trait, info, body, false); //restoreControlFlowPass(constants, body, true); } - - /*private void removeIgnored(MethodBody body) { - for (int rem = code.size() - 1; rem >= 0; rem--) { - if (code.get(rem).ignored) { - removeInstruction(rem, body); + /* + public void removeIgnored(AVM2ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) throws InterruptedException { + try { + List outputMap = new ArrayList<>(); + HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); + toASMSource(constants, trait, info, body, outputMap, ScriptExportMode.PCODE, writer); + String src = writer.toString(); + AVM2Code acode = ASM3Parser.parse(new StringReader(src), constants, trait, body, info); + for (int i = 0; i < acode.code.size(); i++) { + if (outputMap.size() > i) { + int tpos = outputMap.get(i); + if (tpos == -1) { + } else if (code.get(tpos).mappedOffset >= 0) { + acode.code.get(i).mappedOffset = code.get(tpos).mappedOffset; + } else { + acode.code.get(i).mappedOffset = pos2adr(tpos); } } + } + this.code = acode.code; + } catch (IOException | AVM2ParseException ex) { + } + invalidateCache(); }*/ + public void removeIgnored(AVM2ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) throws InterruptedException { - try { - List outputMap = new ArrayList<>(); - HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); - toASMSource(constants, trait, info, body, outputMap, ScriptExportMode.PCODE, writer); - String src = writer.toString(); - AVM2Code acode = ASM3Parser.parse(new StringReader(src), constants, trait, body, info); - for (int i = 0; i < acode.code.size(); i++) { - if (outputMap.size() > i) { - int tpos = outputMap.get(i); - if (tpos == -1) { - } else if (code.get(tpos).mappedOffset >= 0) { - acode.code.get(i).mappedOffset = code.get(tpos).mappedOffset; - } else { - acode.code.get(i).mappedOffset = pos2adr(tpos); - } - } + for (int i = 0; i < code.size(); i++) { + if (code.get(i).ignored) { + removeInstruction(i, body); + i--; } - this.code = acode.code; - } catch (IOException | AVM2ParseException ex) { } - invalidateCache(); } public int removeDeadCode(AVM2ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) throws InterruptedException { @@ -2962,7 +3052,7 @@ public class AVM2Code implements Cloneable { public static int removeTraps(AVM2ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, AVM2LocalData localData, AVM2GraphSource code, int addr, String path, HashMap> refs) throws InterruptedException { HashMap decisions = new HashMap<>(); - removeTraps(refs, false, false, localData, new TranslateStack(), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path, 0); + removeTraps(refs, false, false, localData, new TranslateStack(path), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path, 0); int cnt = 0; for (AVM2Instruction src : decisions.keySet()) { Decision dec = decisions.get(src); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/FixItemCounterTranslateStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/FixItemCounterTranslateStack.java new file mode 100644 index 000000000..05f02f399 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/FixItemCounterTranslateStack.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2; + +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TranslateStack; + +/** + * + * @author JPEXS + */ +public class FixItemCounterTranslateStack extends TranslateStack { + + private int fixItemCount = Integer.MAX_VALUE; + + public FixItemCounterTranslateStack(String path) { + super(null); //null path => do not add PushItems + } + + @Override + public GraphTargetItem pop() { + GraphTargetItem result = super.pop(); + int itemCount = size(); + if (itemCount < fixItemCount) { + fixItemCount = itemCount; + } + return result; + } + + @Override + public synchronized GraphTargetItem remove(int index) { + if (index < fixItemCount) { + fixItemCount = index; + } + return super.remove(index); + } + + public boolean allItemsFixed() { + return size() <= fixItemCount; + } + + public int getFixItemCount() { + return fixItemCount; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/OffsetUpdater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/OffsetUpdater.java new file mode 100644 index 000000000..33ea22753 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/OffsetUpdater.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2; + +/** + * + * @author JPEXS + */ +public interface OffsetUpdater { + + public long updateInstructionOffset(long addr); + + public int updateOperandOffset(long jumpAddr, long targetAddress, int offset); +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java new file mode 100644 index 000000000..827c0a93b --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.deobfuscation; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.JumpIns; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.action.ActionList; +import java.util.List; +import java.util.Map; + +/** + * + * AVM2 Deobfuscator removing single assigned local registers. + * + * Example: var a = true; var b = false; ... if(a){ ...ok }else{ not executed } + * + * @author JPEXS + */ +public class AVM2DeobfuscatorJumps extends AVM2DeobfuscatorSimple { + + //private final int executionLimit = 30000; + @Override + public void actionListParsed(ActionList actions, SWF swf) { + + } + + @Override + public void deobfuscate(String path, int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) throws InterruptedException { + + //body.getCode().markMappedOffsets(); + //removeUnreachableActions(body.getCode(), cpool, trait, minfo, body); + AVM2Code code = body.getCode(); + + boolean found; + do { + found = false; + Map> refs = body.getCode().visitCode(body); + loopi: + for (int i = 0; i < code.code.size(); i++) { + AVM2Instruction ins = code.code.get(i); + if (ins.definition instanceof JumpIns) { + long targetAddr = ins.offset + ins.operands[0] + ins.getBytes().length; + { + for (int r : refs.get(i)) { + if (r >= 0) { //Not Exception start/end + AVM2Instruction srcIns = code.code.get(r); + + if ((srcIns.definition instanceof JumpIns) || ((srcIns.definition instanceof IfTypeIns) && (r != i - 1))) { + { + int oldop = srcIns.operands[0]; + srcIns.operands[0] = (int) (targetAddr - (srcIns.offset + srcIns.getBytes().length)); + if (srcIns.operands[0] != oldop) { + found = true; + } + } + } + } + } + } + } + } + removeUnreachableActions(body.getCode(), cpool, trait, minfo, body); + } while (found); + + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java new file mode 100644 index 000000000..e81433260 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.deobfuscation; + +import com.jpexs.decompiler.flash.BaseLocalData; +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.AVM2LocalData; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.graph.AVM2GraphSource; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.DeobfuscatePopIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.JumpIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocalTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnValueIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnVoidIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ThrowIns; +import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.graph.Graph; +import com.jpexs.decompiler.graph.GraphPart; +import com.jpexs.decompiler.graph.GraphSource; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TranslateException; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.ArrayList; +import java.util.EmptyStackException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * + * AVM2 Deobfuscator removing single assigned local registers. + * + * Example: var a = true; var b = false; ... if(a){ ...ok }else{ not executed } + * + * @author JPEXS + */ +public class AVM2DeobfuscatorRegisters extends AVM2DeobfuscatorSimple { + + //private final int executionLimit = 30000; + @Override + public void actionListParsed(ActionList actions, SWF swf) { + + } + + @Override + public void deobfuscate(String path, int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) throws InterruptedException { + + body.getCode().markMappedOffsets(); + + removeUnreachableActions(body.getCode(), cpool, trait, minfo, body); + Map singleRegisters = getSingleUseRegisters(classIndex, isStatic, scriptIndex, abc, cpool, trait, minfo, body); + replaceSingleUseRegisters(singleRegisters, classIndex, isStatic, scriptIndex, abc, cpool, trait, minfo, body); + super.deobfuscate(path, classIndex, isStatic, scriptIndex, abc, cpool, trait, minfo, body); + removeUnreachableActions(body.getCode(), cpool, trait, minfo, body); + } + + private void replaceSingleUseRegisters(Map singleRegisters, int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) { + AVM2Code code = body.getCode(); + + for (int i = 0; i < code.code.size(); i++) { + AVM2Instruction ins = code.code.get(i); + if (ins.definition instanceof SetLocalTypeIns) { + SetLocalTypeIns slt = (SetLocalTypeIns) ins.definition; + int regId = slt.getRegisterId(ins); + if (singleRegisters.containsKey(regId)) { + code.replaceInstruction(i, new AVM2Instruction(ins.offset, new DeobfuscatePopIns(), new int[]{}), body); + } + } + if (ins.definition instanceof GetLocalTypeIns) { + GetLocalTypeIns glt = (GetLocalTypeIns) ins.definition; + int regId = glt.getRegisterId(ins); + if (singleRegisters.containsKey(regId)) { + code.replaceInstruction(i, makePush(singleRegisters.get(regId).getResult(), cpool), body); + } + } + } + } + + private Map getSingleUseRegisters(int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) { + AVM2Code code = body.getCode(); + Map ret = new HashMap<>(); + + if (code.code.isEmpty()) { + return ret; + } + + ExecutionResult res = new ExecutionResult(); + visitCode(new HashSet<>(), new TranslateStack("deo"), classIndex, isStatic, body, scriptIndex, abc, code, 0, code.code.size() - 1, res); + for (int reg : res.assignCount.keySet()) { + if (res.assignCount.get(reg) == 1) { + ret.put(reg, res.lastAssigned.get(reg)); + } + } + + return ret; + } + + private void visitCode(Set visited, TranslateStack stack, int classIndex, boolean isStatic, MethodBody body, int scriptIndex, ABC abc, AVM2Code code, int idx, int endIdx, ExecutionResult result) { + List output = new ArrayList<>(); + AVM2LocalData localData = newLocalData(scriptIndex, abc, abc.constants, body, isStatic, classIndex); + localData.localRegs.put(0, new NullAVM2Item(null));//this + int instructionsProcessed = 0; + + try { + while (true) { + if (idx > endIdx) { + break; + } + if (visited.contains(idx)) { + break; + } + visited.add(idx); + + AVM2Instruction action = code.code.get(idx); + instructionsProcessed++; + + action.translate(localData, stack, output, Graph.SOP_USE_STATIC, ""); + InstructionDefinition def = action.definition; + + if (def instanceof SetLocalTypeIns) { + SetLocalTypeIns slt = (SetLocalTypeIns) def; + int regId = slt.getRegisterId(action); + if (!result.assignCount.containsKey(regId)) { + result.assignCount.put(regId, 0); + } + + result.assignCount.put(regId, result.assignCount.get(regId) + 1); + + GraphTargetItem regVal = localData.localRegs.get(regId); + if (regVal == null || !regVal.getNotCoerced().isCompileTime()) { + result.assignCount.put(regId, Integer.MAX_VALUE); + } else { + result.lastAssigned.put(regId, regVal.getNotCoerced()); + } + //assignCount + } + + idx++; + + if (action.definition instanceof JumpIns) { + + long address = action.offset + action.getBytes().length + action.operands[0]; + idx = code.adr2pos(address);//code.indexOf(code.getByAddress(address)); + if (idx == -1) { + throw new TranslateException("Jump target not found: " + address); + } + } + + if (action.isBranch()) { + List branches = action.getBranches(new GraphSource() { + + @Override + public int size() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public GraphSourceItem get(int pos) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public boolean isEmpty() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public List translatePart(GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public int adr2pos(long adr) { + return code.adr2pos(adr); + } + + @Override + public long pos2adr(int pos) { + return code.pos2adr(pos); + } + }); + idx = branches.get(0); + for (int n = 1; n < branches.size(); n++) { + visitCode(visited, (TranslateStack) stack.clone(), classIndex, isStatic, body, scriptIndex, abc, code, branches.get(n), endIdx, result); + } + } + /*if (action.definition instanceof IfTypeIns) { + long address = action.offset + action.getBytes().length + action.operands[0]; + int newIdx = code.adr2pos(address); + if (newIdx == -1) { + throw new TranslateException("If target not found: " + address); + } + visitCode(visited, (TranslateStack) stack.clone(), classIndex, isStatic, body, scriptIndex, abc, code, newIdx, endIdx, result); + }*/ + + if (action.definition instanceof ReturnValueIns) { + break; + } + + if (action.definition instanceof ThrowIns) { + break; + } + + if (action.definition instanceof ReturnVoidIns) { + break; + } + } + } catch (EmptyStackException | TranslateException | InterruptedException ex) { + //ignore + } + } + + class ExecutionResult { + + public Map assignCount = new HashMap<>(); + public Map lastAssigned = new HashMap<>(); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java new file mode 100644 index 000000000..8c0bfea1c --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java @@ -0,0 +1,418 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.deobfuscation; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.AVM2LocalData; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.FixItemCounterTranslateStack; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.DeobfuscatePopIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.AddIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.AddIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.ModuloIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.MultiplyIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.NotIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.SubtractIIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.SubtractIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.BitAndIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.BitOrIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.BitXorIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.LShiftIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.RShiftIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.bitwise.URShiftIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.EqualsIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.GreaterEqualsIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.GreaterThanIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.LessEqualsIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.LessThanIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.StrictEqualsIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.JumpIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.DupIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushByteIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushDoubleIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushFalseIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushIntIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushNullIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushShortIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushStringIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushTrueIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushUndefinedIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.SwapIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.types.CoerceOrConvertTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.model.FloatValueAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.StringAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.UndefinedAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.action.ActionList; +import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Null; +import com.jpexs.decompiler.flash.ecma.Undefined; +import com.jpexs.decompiler.flash.helpers.SWFDecompilerListener; +import com.jpexs.decompiler.graph.Graph; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateException; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.FalseItem; +import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.TrueItem; +import java.util.ArrayList; +import java.util.EmptyStackException; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class AVM2DeobfuscatorSimple implements SWFDecompilerListener { + + private final int executionLimit = 30000; + + @Override + public void actionListParsed(ActionList actions, SWF swf) { + + } + + protected AVM2Instruction makePush(Object ovalue, AVM2ConstantPool cpool) { + if (ovalue instanceof Long) { + long value = (Long) ovalue; + if (value >= -128 && value <= 127) { + return new AVM2Instruction(0, new PushByteIns(), new int[]{(int) (long) value}); + } else if (value >= -32768 && value <= 32767) { + return new AVM2Instruction(0, new PushShortIns(), new int[]{((int) (long) value) & 0xffff}); + } else { + return new AVM2Instruction(0, new PushIntIns(), new int[]{cpool.getIntId(value, true)}); + } + } + if (ovalue instanceof Double) { + return new AVM2Instruction(0, new PushDoubleIns(), new int[]{cpool.getDoubleId((Double) ovalue, true)}); + } + if (ovalue instanceof String) { + return new AVM2Instruction(0, new PushStringIns(), new int[]{cpool.getStringId((String) ovalue, true)}); + } + if (ovalue instanceof Boolean) { + if ((Boolean) ovalue) { + return new AVM2Instruction(0, new PushTrueIns(), new int[]{}); + } + return new AVM2Instruction(0, new PushFalseIns(), new int[]{}); + } + if (ovalue instanceof Null) { + return new AVM2Instruction(0, new PushNullIns(), new int[]{}); + } + if (ovalue instanceof Undefined) { + return new AVM2Instruction(0, new PushUndefinedIns(), new int[]{}); + } + return null; + } + + protected AVM2Instruction makePush(AVM2ConstantPool cpool, GraphTargetItem graphTargetItem) { + AVM2Instruction ins = null; + if (graphTargetItem instanceof IntegerValueAVM2Item) { + IntegerValueAVM2Item iv = (IntegerValueAVM2Item) graphTargetItem; + return makePush(iv.value, cpool); + } else if (graphTargetItem instanceof FloatValueAVM2Item) { + FloatValueAVM2Item fv = (FloatValueAVM2Item) graphTargetItem; + return makePush(fv.value, cpool); + } else if (graphTargetItem instanceof StringAVM2Item) { + StringAVM2Item fv = (StringAVM2Item) graphTargetItem; + return makePush(fv.value, cpool); + } else if (graphTargetItem instanceof TrueItem) { + return makePush(Boolean.TRUE, cpool); + } else if (graphTargetItem instanceof FalseItem) { + return makePush(Boolean.FALSE, cpool); + } else if (graphTargetItem instanceof NullAVM2Item) { + return makePush(new Null(), cpool); + } else if (graphTargetItem instanceof UndefinedAVM2Item) { + return makePush(new Undefined(), cpool); + } else { + return null; + } + } + + private boolean removeObfuscationIfs(int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) throws InterruptedException { + AVM2Code code = body.getCode(); + if (code.code.size() == 0) { + return false; + } + + for (int i = 0; i < code.code.size(); i++) { + ExecutionResult result = new ExecutionResult(); + executeActions(classIndex, isStatic, body, scriptIndex, abc, code, i, code.code.size() - 1, result); + + /*if (result.idx != -1) { + int newIstructionCount = 1; // jump + if (!result.stack.isEmpty()) { + newIstructionCount += result.stack.size(); + } + + if (newIstructionCount < result.instructionsProcessed) //if (result.isIf) + { + AVM2Instruction target = code.code.get(result.idx); + AVM2Instruction prevAction = code.code.get(i); + int idelta = 0; + + if (result.stack.isEmpty() && prevAction.definition instanceof JumpIns) { + prevAction.operands[0] = ((int) (target.offset - prevAction.offset - prevAction.getBytes().length)); + } else { + if (!result.stack.isEmpty()) { + for (GraphTargetItem graphTargetItem : result.stack) { + if (graphTargetItem instanceof PopItem) { + continue; + } + AVM2Instruction ins = makePush(graphTargetItem.getResult(), cpool); + if (ins != null) { + code.insertInstruction(i + (idelta++), ins, body); + //prevAction = ins; + } else { + throw new TranslateException("Cannot push: " + graphTargetItem); + } + + } + } + + AVM2Instruction jump = new AVM2Instruction(0, new JumpIns(), new int[]{0}); + code.insertInstruction(i + (idelta++), jump, body); + + jump.operands[0] = ((int) (target.offset - jump.offset - jump.getBytes().length)); + + } + + removeUnreachableActions(code, cpool, trait, minfo, body); + removeZeroJumps(code, body); + + i = -1; + } + }*/ + } + + return false; + } + + protected void removeUnreachableActions(AVM2Code code, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) throws InterruptedException { + code.removeDeadCode(cpool, trait, minfo, body); + } + + protected boolean removeZeroJumps(AVM2Code actions, MethodBody body) { + boolean result = false; + for (int i = 0; i < actions.code.size(); i++) { + AVM2Instruction action = actions.code.get(i); + if (action.definition instanceof JumpIns && action.operands[0] == 0) { + actions.removeInstruction(i, body); + i--; + result = true; + } + } + return result; + } + + protected AVM2LocalData newLocalData(int scriptIndex, ABC abc, AVM2ConstantPool cpool, MethodBody body, boolean isStatic, int classIndex) { + AVM2LocalData localData = new AVM2LocalData(); + localData.isStatic = isStatic; + localData.classIndex = classIndex; + localData.localRegs = new HashMap<>(); + localData.scopeStack = new ScopeStack(true); + localData.constants = cpool; + localData.methodInfo = abc.method_info; + localData.methodBody = body; + localData.abc = abc; + localData.localRegNames = new HashMap<>(); + localData.fullyQualifiedNames = new ArrayList<>(); + localData.parsedExceptions = new ArrayList<>(); + localData.finallyJumps = new HashMap<>(); + localData.ignoredSwitches = new HashMap<>(); + localData.ignoredSwitches2 = new ArrayList<>(); + localData.scriptIndex = scriptIndex; + localData.localRegAssignmentIps = new HashMap<>(); + localData.ip = 0; + localData.refs = new HashMap<>(); + localData.code = body.getCode(); + return localData; + } + + private void executeActions(int classIndex, boolean isStatic, MethodBody body, int scriptIndex, ABC abc, AVM2Code code, int idx, int endIdx, ExecutionResult result) { + List output = new ArrayList<>(); + AVM2LocalData localData = newLocalData(scriptIndex, abc, abc.constants, body, isStatic, classIndex); + + FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack(""); + int instructionsProcessed = 0; + + try { + while (true) { + if (idx > endIdx) { + break; + } + + if (instructionsProcessed > executionLimit) { + break; + } + + AVM2Instruction action = code.code.get(idx); + action.translate(localData, stack, output, Graph.SOP_USE_STATIC, ""); + InstructionDefinition def = action.definition; + + Class allowedDefs[] = new Class[]{ + PushByteIns.class, + PushShortIns.class, + PushIntIns.class, + PushDoubleIns.class, + PushStringIns.class, + PushNullIns.class, + PushUndefinedIns.class, + PushFalseIns.class, + PushTrueIns.class, + DupIns.class, + SwapIns.class, + AddIns.class, + AddIIns.class, + SubtractIns.class, + SubtractIIns.class, + ModuloIns.class, + MultiplyIns.class, + BitAndIns.class, + BitXorIns.class, + BitOrIns.class, + LShiftIns.class, + RShiftIns.class, + URShiftIns.class, + EqualsIns.class, + NotIns.class, + IfTypeIns.class, + JumpIns.class, + EqualsIns.class, + LessEqualsIns.class, + GreaterEqualsIns.class, + GreaterThanIns.class, + LessThanIns.class, + StrictEqualsIns.class, + PopIns.class + }; + + boolean ok = false; + for (Class s : allowedDefs) { + if (s.isAssignableFrom(def.getClass())) { + ok = true; + break; + } + } + if (!ok) { + break; + } + + boolean ifed = false; + if (def instanceof JumpIns) { + //ActionJump jump = (ActionJump) action; + long address = action.offset + action.getBytes().length + action.operands[0]; + idx = code.adr2pos(address); + + if (idx == -1) { + throw new TranslateException("Jump target not found: " + address); + } + } else if (def instanceof IfTypeIns) { + //ActionIf aif = (ActionIf) action; + GraphTargetItem top = stack.pop(); + Object res = top.getResult(); + long address = action.offset + action.getBytes().length + action.operands[0]; + int nidx = code.adr2pos(address);//code.indexOf(code.getByAddress(address)); + AVM2Instruction tarIns = code.code.get(nidx); + + if (EcmaScript.toBoolean(res)) { + /*if (nidx == -1) { + throw new TranslateException("If target not found: " + address); + }*/ + AVM2Instruction jumpIns = new AVM2Instruction(0, new JumpIns(), new int[]{0}); + //jumpIns.operands[0] = action.operands[0] /*- action.getBytes().length*/ + jumpIns.getBytes().length; + code.replaceInstruction(idx, jumpIns, body); + jumpIns.operands[0] = (int) (tarIns.offset - jumpIns.offset - jumpIns.getBytes().length); + + code.insertInstruction(idx, new AVM2Instruction(action.offset, new DeobfuscatePopIns(), new int[]{}), true, body); + + idx = code.adr2pos(jumpIns.offset + jumpIns.getBytes().length + jumpIns.operands[0]); + } else { + code.replaceInstruction(idx, new AVM2Instruction(action.offset, new DeobfuscatePopIns(), new int[]{}), body); + //action.definition = new DeobfuscatePopIns(); + idx++; + } + ifed = true; + //break; + } else { + idx++; + } + + instructionsProcessed++; + + if (stack.allItemsFixed()) { + result.idx = idx == code.code.size() ? idx - 1 : idx; + result.instructionsProcessed = instructionsProcessed; + result.stack.clear(); + result.stack.addAll(stack); + } + if (ifed) { + break; + } + } + } catch (EmptyStackException | TranslateException | InterruptedException ex) { + //result.idx = -1; + //result.isIf = false; + //ignore + } + } + + @Override + public byte[] proxyFileCatched(byte[] data) { + return null; + } + + @Override + public void swfParsed(SWF swf) { + } + + @Override + public void abcParsed(ABC abc, SWF swf) { + } + + @Override + public void methodBodyParsed(MethodBody body, SWF swf) { + + } + + public void deobfuscate(String path, int classIndex, boolean isStatic, int scriptIndex, ABC abc, AVM2ConstantPool cpool, Trait trait, MethodInfo minfo, MethodBody body) throws InterruptedException { + removeUnreachableActions(body.getCode(), cpool, trait, minfo, body); + removeObfuscationIfs(classIndex, isStatic, scriptIndex, abc, cpool, trait, minfo, body); + removeZeroJumps(body.getCode(), body); + } + + class ExecutionResult { + + public int idx = -1; + + public int instructionsProcessed = -1; + + public TranslateStack stack = new TranslateStack("?"); + + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 75beee2bf..2d9a0c447 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -36,6 +36,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.HasNextAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NextNameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NextValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; @@ -69,6 +70,8 @@ import com.jpexs.decompiler.graph.model.ExitItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.LoopItem; import com.jpexs.decompiler.graph.model.NotItem; +import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.util.ArrayList; @@ -76,6 +79,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -124,8 +128,9 @@ public class AVM2Graph extends Graph { localData.localRegNames = localRegNames; localData.fullyQualifiedNames = fullyQualifiedNames; localData.parsedExceptions = new ArrayList<>(); - localData.finallyJumps = new ArrayList<>(); - localData.ignoredSwitches = new ArrayList<>(); + localData.finallyJumps = new HashMap<>(); + localData.ignoredSwitches = new HashMap<>(); + localData.ignoredSwitches2 = new ArrayList<>(); localData.scriptIndex = scriptIndex; localData.localRegAssignmentIps = new HashMap<>(); localData.ip = 0; @@ -159,39 +164,21 @@ public class AVM2Graph extends Graph { } } } - - /*for(ABCException ex:body.exceptions){ - for(GraphPart p:allBlocks){ - boolean next_is_ex_start=false; - for(GraphPart n:p.nextParts){ - if(n.start==code.adr2pos(ex.start)){ - next_is_ex_start = true; - break; - } - } - if(next_is_ex_start){ - for(GraphPart q:allBlocks){ //find target part - if(q.start==code.adr2pos(ex.target)){ - p.nextParts.add(q); - break; - } - } - } - } - }*/ } @Override - protected List check(GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { List ret = null; AVM2LocalData aLocalData = (AVM2LocalData) localData; List parsedExceptions = aLocalData.parsedExceptions; - List finallyJumps = aLocalData.finallyJumps; - List ignoredSwitches = aLocalData.ignoredSwitches; + Map> finallyJumps = aLocalData.finallyJumps; + Map ignoredSwitches = aLocalData.ignoredSwitches; + List ignoredSwitches2 = aLocalData.ignoredSwitches2; int ip = part.start; int addr = this.avm2code.fixAddrAfterDebugLine(this.avm2code.pos2adr(part.start)); int maxend = -1; + List catchedFinallys = new ArrayList<>(); List catchedExceptions = new ArrayList<>(); for (int e = 0; e < body.exceptions.length; e++) { if (addr == this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { @@ -200,11 +187,13 @@ public class AVM2Graph extends Graph { if (!parsedExceptions.contains(body.exceptions[e])) { if (((body.exceptions[e].end) > maxend)) { catchedExceptions.clear(); + catchedFinallys.clear(); maxend = this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end); catchedExceptions.add(body.exceptions[e]); } else if (this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) == maxend) { catchedExceptions.add(body.exceptions[e]); } + catchedFinallys.add(e); } } else if (body.exceptions[e].isFinally()) { @@ -233,14 +222,16 @@ public class AVM2Graph extends Graph { List finallyCommands = new ArrayList<>(); boolean hasFinally = false; int returnPos = afterCatchPos; + int finStart = -1; for (int e = 0; e < body.exceptions.length; e++) { if (body.exceptions[e].isFinally()) { if (addr == this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].start)) { if (afterCatchPos + 1 == code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))) { + catchedFinallys.add(e); AVM2Instruction jmpIns = this.avm2code.code.get(code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); if (jmpIns.definition instanceof JumpIns) { - int finStart = code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytes().length + jmpIns.operands[0]); + finStart = code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytes().length + jmpIns.operands[0]); GraphPart fpart = null; for (GraphPart p : allParts) { @@ -249,6 +240,8 @@ public class AVM2Graph extends Graph { break; } } + TranslateStack st = (TranslateStack) stack.clone(); + st.clear(); int swPos = -1; for (int f = finStart; f < this.avm2code.code.size(); f++) { if (this.avm2code.code.get(f).definition instanceof LookupSwitchIns) { @@ -256,7 +249,7 @@ public class AVM2Graph extends Graph { if (swins.operands.length >= 3) { if (swins.operands[0] == swins.getBytes().length) { if (code.adr2pos(code.pos2adr(f) + swins.operands[2]) < finStart) { - stack.push(new ExceptionAVM2Item(body.exceptions[e])); + //st.push(new ExceptionAVM2Item(body.exceptions[e])); GraphPart fepart = null; for (GraphPart p : allParts) { if (p.start == f + 1) { @@ -280,13 +273,17 @@ public class AVM2Graph extends Graph { } //ignoredSwitches.add(-1); //int igs_size=ignoredSwitches.size(); - List oldFinallyJumps = new ArrayList<>(finallyJumps); + Map> oldFinallyJumps = new HashMap<>(finallyJumps); finallyJumps.clear(); - ignoredSwitches.add(swPos); - finallyCommands = printGraph(localData, stack, allParts, parent, fpart, null, loops, staticOperation, path); + ignoredSwitches.put(e, swPos); + st.push(new PopItem(null)); + finallyCommands = printGraph(partCodes, partCodePos, localData, st, allParts, parent, fpart, null, loops, staticOperation, path); //ignoredSwitches.remove(igs_size-1); - finallyJumps.addAll(oldFinallyJumps); - finallyJumps.add(finStart); + finallyJumps.putAll(oldFinallyJumps); + if (!finallyJumps.containsKey(e)) { + finallyJumps.put(e, new ArrayList<>()); + } + finallyJumps.get(e).add(finStart); hasFinally = true; break; } @@ -328,7 +325,9 @@ public class AVM2Graph extends Graph { break; } } - stack.add(new ExceptionAVM2Item(catchedExceptions.get(e))); + TranslateStack st2 = (TranslateStack) stack.clone(); + st2.clear(); + st2.add(new ExceptionAVM2Item(catchedExceptions.get(e))); AVM2LocalData localData2 = new AVM2LocalData(aLocalData); localData2.scopeStack = new ScopeStack(); List stopPart2 = new ArrayList<>(stopPart); @@ -336,16 +335,18 @@ public class AVM2Graph extends Graph { if (retPart != null) { stopPart2.add(retPart); } - List ncatchedCommands = printGraph(localData2, stack, allParts, parent, npart, stopPart2, loops, staticOperation, path); + + List ncatchedCommands = printGraph(partCodes, partCodePos, localData2, st2, allParts, parent, npart, stopPart2, loops, staticOperation, path); if (catchedExceptions.get(e).isFinally() && (catchedExceptions.size() > 1 || hasFinally)) { catchedExceptions.remove(e); e--; } else { catchedCommands.add(ncatchedCommands); if (retPart != null && avm2code.code.get(retPart.start).isExit() && !(!ncatchedCommands.isEmpty() && (ncatchedCommands.get(ncatchedCommands.size() - 1) instanceof ExitItem))) { - avm2code.code.get(retPart.start).translate(localData, stack, ncatchedCommands, staticOperation, path); + avm2code.code.get(retPart.start).translate(localData, st2, ncatchedCommands, staticOperation, path); } if (catchedExceptions.get(e).isFinally()) { + //endposStartBlock = -1; if (!ncatchedCommands.isEmpty() && (ncatchedCommands.get(0) instanceof SetLocalAVM2Item)) { SetLocalAVM2Item sl = (SetLocalAVM2Item) ncatchedCommands.get(0); if (sl.value.getNotCoerced() instanceof ExceptionAVM2Item) { @@ -364,19 +365,31 @@ public class AVM2Graph extends Graph { break; } } - List stopPart2 = new ArrayList<>(stopPart); - stopPart2.add(nepart); + List stopPart2 = new ArrayList<>();//stopPart); + if (nepart != null) { + stopPart2.add(nepart); + } stopPart2.addAll(catchParts); if (retPart != null) { stopPart2.add(retPart); } - List tryCommands = printGraph(localData, stack, allParts, parent, part, stopPart2, loops, staticOperation, path); + TranslateStack st = (TranslateStack) stack.clone(); + st.clear(); + List tryCommands = printGraph(partCodes, partCodePos, localData, st, allParts, parent, part, stopPart2, loops, staticOperation, path); if (retPart != null && avm2code.code.get(retPart.start).isExit() && !(!tryCommands.isEmpty() && (tryCommands.get(tryCommands.size() - 1) instanceof ExitItem))) { - avm2code.code.get(retPart.start).translate(localData, stack, tryCommands, staticOperation, path); + avm2code.code.get(retPart.start).translate(localData, st, tryCommands, staticOperation, path); } output.clear(); + stack.clear(); output.add(new TryAVM2Item(tryCommands, catchedExceptions, catchedCommands, finallyCommands, finCatchName)); + finallyJumps = ((AVM2LocalData) localData).finallyJumps; + for (int fin_e : catchedFinallys) { + if (finallyJumps.containsKey(fin_e)) { + finallyJumps.get(fin_e).clear(); + } + //.remove((Integer) finStart); + } ip = returnPos; } @@ -397,7 +410,10 @@ public class AVM2Graph extends Graph { ret.addAll(output); GraphTargetItem lop = checkLoop(part, stopPart, loops); if (lop == null) { - ret.addAll(printGraph(localData, stack, allParts, null, part, stopPart, loops, staticOperation, path)); + TranslateStack st = (TranslateStack) stack.clone(); + st.clear(); + + ret.addAll(printGraph(partCodes, partCodePos, localData, st, allParts, null, part, stopPart, loops, staticOperation, path)); } else { ret.add(lop); } @@ -423,7 +439,7 @@ public class AVM2Graph extends Graph { } } } - if ((this.avm2code.code.get(part.end).definition instanceof LookupSwitchIns) && ignoredSwitches.contains(part.end)) { + if ((this.avm2code.code.get(part.end).definition instanceof LookupSwitchIns) && (ignoredSwitches.containsValue(part.end) || ignoredSwitches2.contains(part.end))) { ret = new ArrayList<>(); ret.addAll(output); return ret; @@ -444,9 +460,9 @@ public class AVM2Graph extends Graph { && (this.avm2code.code.get(part.nextParts.get(1).nextParts.get(0).end).definition instanceof LookupSwitchIns))) { if (stack.peek() instanceof StrictEqAVM2Item) { - ignoredSwitches.add(part.nextParts.get(0).nextParts.get(0).end); + ignoredSwitches2.add(part.nextParts.get(0).nextParts.get(0).end); } else { - ignoredSwitches.add(part.nextParts.get(1).nextParts.get(0).end); + ignoredSwitches2.add(part.nextParts.get(1).nextParts.get(0).end); } ret = new ArrayList<>(); ret.addAll(output); @@ -494,7 +510,7 @@ public class AVM2Graph extends Graph { } GraphPart numPart = part.nextParts.get(reversed ? 0 : 1); AVM2Instruction ins = null; - TranslateStack sstack = new TranslateStack(); + TranslateStack sstack = new TranslateStack(path); do { for (int n = 0; n < numPart.getHeight(); n++) { ins = this.avm2code.code.get(numPart.getPosAt(n)); @@ -512,7 +528,7 @@ public class AVM2Graph extends Graph { GraphTargetItem nt = sstack.peek(); if (!(nt instanceof IntegerValueAVM2Item)) { - throw new RuntimeException("Invalid integer value in Switch"); + throw new RuntimeException("Invalid integer value in Switch:" + nt); } IntegerValueAVM2Item iv = (IntegerValueAVM2Item) nt; caseValuesMap.put((int) (long) iv.value, tar); @@ -535,7 +551,7 @@ public class AVM2Graph extends Graph { GraphPart numPart = dp; AVM2Instruction ins = null; - TranslateStack sstack = new TranslateStack(); + TranslateStack sstack = new TranslateStack(path); do { for (int n = 0; n < numPart.getHeight(); n++) { ins = this.avm2code.code.get(numPart.getPosAt(n)); @@ -587,7 +603,7 @@ public class AVM2Graph extends Graph { defaultPart = switchLoc.nextParts.get(switchLoc.nextParts.size() - 1); List stopPart2 = new ArrayList<>(stopPart); stopPart2.add(next); - defaultCommands = printGraph(localData, stack, allParts, switchLoc, defaultPart, stopPart2, loops, staticOperation, path); + defaultCommands = printGraph(partCodes, partCodePos, localData, stack, allParts, switchLoc, defaultPart, stopPart2, loops, staticOperation, path); if (!defaultCommands.isEmpty()) { if (defaultCommands.get(defaultCommands.size() - 1) instanceof BreakItem) { if (((BreakItem) defaultCommands.get(defaultCommands.size() - 1)).loopId == currentLoop.id) { @@ -614,7 +630,7 @@ public class AVM2Graph extends Graph { stopPart2.add(defaultPart); } - cc.addAll(0, printGraph(localData, stack, allParts, switchLoc, caseBodies.get(i), stopPart2, loops, staticOperation, path)); + cc.addAll(0, printGraph(partCodes, partCodePos, localData, stack, allParts, switchLoc, caseBodies.get(i), stopPart2, loops, staticOperation, path)); caseCommands.add(cc); } @@ -626,7 +642,7 @@ public class AVM2Graph extends Graph { ret.add(ti); } else {*/ currentLoop.phase = 2; - ret.addAll(printGraph(localData, stack, allParts, null, next, stopPart, loops, staticOperation, path)); + ret.addAll(printGraph(partCodes, partCodePos, localData, stack, allParts, null, next, stopPart, loops, staticOperation, path)); //} } } @@ -636,33 +652,34 @@ public class AVM2Graph extends Graph { @Override protected GraphPart checkPart(TranslateStack stack, BaseLocalData localData, GraphPart next, List allParts) { AVM2LocalData aLocalData = (AVM2LocalData) localData; - List finallyJumps = aLocalData.finallyJumps; - List ignoredSwitches = aLocalData.ignoredSwitches; + Map> finallyJumps = aLocalData.finallyJumps; + Map ignoredSwitches = aLocalData.ignoredSwitches; GraphPart ret = next; - for (int f = 0; f < finallyJumps.size(); f++) { - int fip = finallyJumps.get(f); + for (int f : finallyJumps.keySet()) {//int f = 0; f < finallyJumps.size(); f++) { int swip = ignoredSwitches.get(f); - if (next.start == fip) { - if (stack != null && swip != -1) { - AVM2Instruction swIns = avm2code.code.get(swip); - GraphTargetItem t = stack.pop(); - Double dval = EcmaScript.toNumber(t.getResult()); - int val = (int) (double) dval; - if (swIns.definition instanceof LookupSwitchIns) { - List branches = swIns.getBranches(code); - int nip = branches.get(0); - if (val >= 0 && val < branches.size() - 1) { - nip = branches.get(1 + val); - } - for (GraphPart p : allParts) { - if (avm2code.fixIPAfterDebugLine(p.start) == avm2code.fixIPAfterDebugLine(nip)) { - return p; + for (int fip : finallyJumps.get(f)) { + if (next.start == fip) { + if (stack != null && swip != -1) { + AVM2Instruction swIns = avm2code.code.get(swip); + GraphTargetItem t = stack.pop(); + Double dval = EcmaScript.toNumber(t.getResult()); + int val = (int) (double) dval; + if (swIns.definition instanceof LookupSwitchIns) { + List branches = swIns.getBranches(code); + int nip = branches.get(0); + if (val >= 0 && val < branches.size() - 1) { + nip = branches.get(1 + val); } + for (GraphPart p : allParts) { + if (avm2code.fixIPAfterDebugLine(p.start) == avm2code.fixIPAfterDebugLine(nip)) { + return p; + } + } + ret = null; } - ret = null; } + ret = null; } - ret = null; } } if (ret != next) { @@ -678,8 +695,14 @@ public class AVM2Graph extends Graph { AVM2Instruction jmpIns = this.avm2code.code.get(avm2code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end))); if (jmpIns.definition instanceof JumpIns) { int finStart = avm2code.adr2pos(this.avm2code.fixAddrAfterDebugLine(body.exceptions[e].end) + jmpIns.getBytes().length + jmpIns.operands[0]); - finallyJumps.add(finStart); - ignoredSwitches.add(-1); + if (!finallyJumps.containsKey(e)) { + finallyJumps.put(e, new ArrayList<>()); + } + finallyJumps.get(e).add(finStart); + if (!ignoredSwitches.containsKey(e)) { + ignoredSwitches.put(e, -1); + } + //ignoredSwitches.put(e, -1); break; } } @@ -707,7 +730,11 @@ public class AVM2Graph extends Graph { } GraphTargetItem ft = w.commands.get(pos); if (ft instanceof WithAVM2Item) { - ft = w.commands.get(pos + 1); + pos++; + while (w.commands.get(pos) instanceof SetTypeAVM2Item) { + pos++; + } + ft = w.commands.get(pos); if (ft instanceof IfItem) { IfItem ift = (IfItem) ft; if (ift.onTrue.size() > 0) { @@ -759,7 +786,7 @@ public class AVM2Graph extends Graph { @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData) { - super.finalProcess(list, level, localData); + if (level == 0) { if (!list.isEmpty()) { if (list.get(list.size() - 1) instanceof ReturnVoidAVM2Item) { @@ -864,6 +891,8 @@ public class AVM2Graph extends Graph { } } } + //Handle for loops at the end: + super.finalProcess(list, level, localData); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/AlchemyTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/AlchemyTypeIns.java new file mode 100644 index 000000000..2f7890b38 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/AlchemyTypeIns.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +/** + * + * @author JPEXS + */ +public interface AlchemyTypeIns { + + public static final String ALCHEMY_PACKAGE = "avm2.intrinsics.memory"; + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf32Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf32Ins.java index 6739f5d58..215c47c7f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf32Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf32Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Lf32Ins extends InstructionDefinition { - - public Lf32Ins() { - super(0x38, "lf32", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - stack.push(new AlchemyLoadAVM2Item(ins, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Lf32Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Lf32Ins() { + super(0x38, "lf32", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + stack.push(new AlchemyLoadAVM2Item(ins, ofs, 'f', 32)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf64Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf64Ins.java index 33b88d996..9b971e5a5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf64Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Lf64Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Lf64Ins extends InstructionDefinition { - - public Lf64Ins() { - super(0x39, "lf64", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - stack.push(new AlchemyLoadAVM2Item(ins, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Lf64Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Lf64Ins() { + super(0x39, "lf64", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + stack.push(new AlchemyLoadAVM2Item(ins, ofs, 'f', 64)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li16Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li16Ins.java index 327dcafe8..44a3c0267 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li16Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li16Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Li16Ins extends InstructionDefinition { - - public Li16Ins() { - super(0x36, "li16", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - stack.push(new AlchemyLoadAVM2Item(ins, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Li16Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Li16Ins() { + super(0x36, "li16", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + stack.push(new AlchemyLoadAVM2Item(ins, ofs, 'i', 16)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li32Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li32Ins.java index 1f9086b89..e38c32477 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li32Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li32Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Li32Ins extends InstructionDefinition { - - public Li32Ins() { - super(0x37, "li32", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - stack.push(new AlchemyLoadAVM2Item(ins, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Li32Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Li32Ins() { + super(0x37, "li32", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + stack.push(new AlchemyLoadAVM2Item(ins, ofs, 'i', 32)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li8Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li8Ins.java index 3d4d7aef6..6987e579a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li8Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Li8Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Li8Ins extends InstructionDefinition { - - public Li8Ins() { - super(0x35, "li8", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - stack.push(new AlchemyLoadAVM2Item(ins, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyLoadAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Li8Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Li8Ins() { + super(0x35, "li8", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + stack.push(new AlchemyLoadAVM2Item(ins, ofs, 'i', 8)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf32Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf32Ins.java index 3600a9a38..c4b738610 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf32Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf32Ins.java @@ -1,59 +1,59 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Sf32Ins extends InstructionDefinition { - - public Sf32Ins() { - super(0x3D, "sf32", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -2; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - GraphTargetItem value = stack.pop(); - stack.push(new AlchemyStoreAVM2Item(ins, value, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Sf32Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Sf32Ins() { + super(0x3D, "sf32", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + GraphTargetItem value = stack.pop(); + output.add(new AlchemyStoreAVM2Item(ins, value, ofs, 'f', 32)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf64Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf64Ins.java index b3ab4aafd..aff8f6ed1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf64Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sf64Ins.java @@ -1,59 +1,59 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Sf64Ins extends InstructionDefinition { - - public Sf64Ins() { - super(0x3E, "sf64", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -2; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - GraphTargetItem value = stack.pop(); - stack.push(new AlchemyStoreAVM2Item(ins, value, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Sf64Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Sf64Ins() { + super(0x3E, "sf64", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + GraphTargetItem value = stack.pop(); + output.add(new AlchemyStoreAVM2Item(ins, value, ofs, 'f', 64)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si16Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si16Ins.java index 94a030a38..b8719b254 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si16Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si16Ins.java @@ -1,59 +1,59 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Si16Ins extends InstructionDefinition { - - public Si16Ins() { - super(0x3B, "si16", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -2; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - GraphTargetItem value = stack.pop(); - stack.push(new AlchemyStoreAVM2Item(ins, value, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Si16Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Si16Ins() { + super(0x3B, "si16", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + GraphTargetItem value = stack.pop(); + output.add(new AlchemyStoreAVM2Item(ins, value, ofs, 'i', 16)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si32Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si32Ins.java index 2c02aed1f..ef7124bd1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si32Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si32Ins.java @@ -1,59 +1,59 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Si32Ins extends InstructionDefinition { - - public Si32Ins() { - super(0x3C, "si32", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -2; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - GraphTargetItem value = stack.pop(); - stack.push(new AlchemyStoreAVM2Item(ins, value, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Si32Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Si32Ins() { + super(0x3C, "si32", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + GraphTargetItem value = stack.pop(); + output.add(new AlchemyStoreAVM2Item(ins, value, ofs, 'i', 32)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si8Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si8Ins.java index 32a14bc3b..9a10cda59 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si8Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Si8Ins.java @@ -1,59 +1,59 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Si8Ins extends InstructionDefinition { - - public Si8Ins() { - super(0x3A, "si8", new int[]{}, true); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -2; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem ofs = stack.pop(); - GraphTargetItem value = stack.pop(); - stack.push(new AlchemyStoreAVM2Item(ins, value, ofs, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemyStoreAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Si8Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Si8Ins() { + super(0x3A, "si8", new int[]{}, true); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem ofs = stack.pop(); + GraphTargetItem value = stack.pop(); + output.add(new AlchemyStoreAVM2Item(ins, value, ofs, 'i', 8)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi16Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi16Ins.java index b52e0d8f0..fa63166b5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi16Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi16Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Sxi16Ins extends InstructionDefinition { - - public Sxi16Ins() { - super(0x52, "sxi_16", new int[]{}, false); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem value = stack.pop(); - stack.push(new AlchemySignExtendAVM2Item(ins, value, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Sxi16Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Sxi16Ins() { + super(0x52, "sxi16", new int[]{}, false); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem value = stack.pop(); + stack.push(new AlchemySignExtendAVM2Item(ins, value, 16)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi1Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi1Ins.java index 434b7e479..e3a792330 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi1Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi1Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Sxi1Ins extends InstructionDefinition { - - public Sxi1Ins() { - super(0x50, "sxi_1", new int[]{}, false); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem value = stack.pop(); - stack.push(new AlchemySignExtendAVM2Item(ins, value, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Sxi1Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Sxi1Ins() { + super(0x50, "sxi1", new int[]{}, false); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem value = stack.pop(); + stack.push(new AlchemySignExtendAVM2Item(ins, value, 1)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi8Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi8Ins.java index 90096eafd..3b6976421 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi8Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/alchemy/Sxi8Ins.java @@ -1,58 +1,58 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -/** - * - * @author JPEXS - */ -public class Sxi8Ins extends InstructionDefinition { - - public Sxi8Ins() { - super(0x51, "sxi_8", new int[]{}, false); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1 - 1; - } - - @Override - public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { - return 0; - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem value = stack.pop(); - stack.push(new AlchemySignExtendAVM2Item(ins, value, instructionName)); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.AlchemySignExtendAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import java.util.HashMap; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class Sxi8Ins extends InstructionDefinition implements AlchemyTypeIns { + + public Sxi8Ins() { + super(0x51, "sxi8", new int[]{}, false); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1 - 1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 0; + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem value = stack.pop(); + stack.push(new AlchemySignExtendAVM2Item(ins, value, 8)); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/arithmetic/NotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/arithmetic/NotIns.java index f222a3d22..121344f18 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/arithmetic/NotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/arithmetic/NotIns.java @@ -1,49 +1,49 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import com.jpexs.decompiler.graph.model.NotItem; -import java.util.HashMap; -import java.util.List; - -public class NotIns extends InstructionDefinition { - - public NotIns() { - super(0x96, "not", new int[]{}, false); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem v = stack.pop(); - stack.push(new NotItem(ins, v)); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -1 + 1; - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.NotItem; +import java.util.HashMap; +import java.util.List; + +public class NotIns extends InstructionDefinition { + + public NotIns() { + super(0x96, "not", new int[]{}, false); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem v = stack.pop(); + stack.push(v.invert(ins)); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1 + 1; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfFalseIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfFalseIns.java index 1ac54af7a..e71bdb9e8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfFalseIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfFalseIns.java @@ -1,56 +1,57 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.jumps; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import com.jpexs.decompiler.graph.model.NotItem; -import java.util.HashMap; -import java.util.List; - -public class IfFalseIns extends InstructionDefinition implements IfTypeIns { - - public IfFalseIns() { - super(0x12, "iffalse", new int[]{AVM2Code.DAT_OFFSET}, false); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - GraphTargetItem v1 = stack.pop(); - stack.push(new NotItem(ins, v1)); - } - - @Override - public void translateInverted(HashMap localRegs, TranslateStack stack, AVM2Instruction ins) { - //String v1 = stack.pop().toString(); - //stack.push("(" + v1 + ")"); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -1; - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.jumps; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.NotItem; +import java.util.HashMap; +import java.util.List; + +public class IfFalseIns extends InstructionDefinition implements IfTypeIns { + + public IfFalseIns() { + super(0x12, "iffalse", new int[]{AVM2Code.DAT_OFFSET}, false); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + GraphTargetItem v1 = stack.pop(); + //stack.push(new NotItem(ins, v1)); + stack.push(v1.invert(ins)); + } + + @Override + public void translateInverted(HashMap localRegs, TranslateStack stack, AVM2Instruction ins) { + //String v1 = stack.pop().toString(); + //stack.push("(" + v1 + ")"); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfTrueIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfTrueIns.java index 8f61976f0..dd59e4687 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfTrueIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/jumps/IfTrueIns.java @@ -1,56 +1,56 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.jumps; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import com.jpexs.decompiler.graph.model.NotItem; -import java.util.HashMap; -import java.util.List; - -public class IfTrueIns extends InstructionDefinition implements IfTypeIns { - - public IfTrueIns() { - super(0x11, "iftrue", new int[]{AVM2Code.DAT_OFFSET}, false); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - //String v1 = stack.pop().toString(); - //stack.push("(" + v1 + ")"); - } - - @Override - public void translateInverted(HashMap localRegs, TranslateStack stack, AVM2Instruction ins) { - GraphTargetItem v1 = stack.pop(); - stack.push(new NotItem(ins, v1)); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -1; - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.jumps; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.IfTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.NotItem; +import java.util.HashMap; +import java.util.List; + +public class IfTrueIns extends InstructionDefinition implements IfTypeIns { + + public IfTrueIns() { + super(0x11, "iftrue", new int[]{AVM2Code.DAT_OFFSET}, false); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + //String v1 = stack.pop().toString(); + //stack.push("(" + v1 + ")"); + } + + @Override + public void translateInverted(HashMap localRegs, TranslateStack stack, AVM2Instruction ins) { + GraphTargetItem v1 = stack.pop(); + stack.push(v1.invert(null)); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/SetLocalTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/SetLocalTypeIns.java index 973dcde54..7fdc2075e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/SetLocalTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/SetLocalTypeIns.java @@ -1,134 +1,138 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.localregs; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns; -import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.DecrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.PostDecrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreDecrementAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; -import java.util.Stack; - -public abstract class SetLocalTypeIns extends InstructionDefinition implements SetTypeIns { - - public SetLocalTypeIns(int instructionCode, String instructionName, int[] operands, boolean canThrow) { - super(instructionCode, instructionName, operands, canThrow); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap regAssignCount, int ip, HashMap> refs, AVM2Code code) { - int regId = getRegisterId(ins); - GraphTargetItem value = stack.pop(); - /*if (localRegs.containsKey(regId)) { - localRegs.put(regId, new NotCompileTimeAVM2Item(ins, value)); - } else { - localRegs.put(regId, value); - }*/ - localRegs.put(regId, value); - if (!regAssignCount.containsKey(regId)) { - regAssignCount.put(regId, 0); - } - regAssignCount.put(regId, regAssignCount.get(regId) + 1); - //localRegsAssignmentIps.put(regId, ip); - if (value instanceof NewActivationAVM2Item) { - return; - } - if (value instanceof FindPropertyAVM2Item) { - return; - } - if (value.getNotCoerced() instanceof IncrementAVM2Item) { - GraphTargetItem inside = ((IncrementAVM2Item) value.getNotCoerced()).value.getNotCoerced().getThroughDuplicate(); - if (inside instanceof LocalRegAVM2Item) { - if (((LocalRegAVM2Item) inside).regIndex == regId) { - if (stack.size() > 0) { - GraphTargetItem top = stack.peek().getNotCoerced().getThroughDuplicate(); - if (top == inside) { - stack.pop(); - stack.push(new PostIncrementAVM2Item(ins, inside)); - } else if ((top instanceof IncrementAVM2Item) && (((IncrementAVM2Item) top).value == inside)) { - stack.pop(); - stack.push(new PreIncrementAVM2Item(ins, inside)); - } else { - output.add(new PostIncrementAVM2Item(ins, inside)); - } - } else { - output.add(new PostIncrementAVM2Item(ins, inside)); - } - return; - } - } - } - - if (value.getNotCoerced() instanceof DecrementAVM2Item) { - GraphTargetItem inside = ((DecrementAVM2Item) value.getNotCoerced()).value.getNotCoerced().getThroughDuplicate(); - if (inside instanceof LocalRegAVM2Item) { - if (((LocalRegAVM2Item) inside).regIndex == regId) { - if (stack.size() > 0) { - GraphTargetItem top = stack.peek().getNotCoerced().getThroughDuplicate(); - if (top == inside) { - stack.pop(); - stack.push(new PostDecrementAVM2Item(ins, inside)); - } else if ((top instanceof DecrementAVM2Item) && (((DecrementAVM2Item) top).value == inside)) { - stack.pop(); - stack.push(new PreDecrementAVM2Item(ins, inside)); - } else { - output.add(new PostDecrementAVM2Item(ins, inside)); - } - } else { - output.add(new PostDecrementAVM2Item(ins, inside)); - } - return; - } - } - } - - //if(val.startsWith("catchscope ")) return; - //if(val.startsWith("newactivation()")) return; - output.add(new SetLocalAVM2Item(ins, regId, value)); - } - - @Override - public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, MethodBody body, HashMap localRegNames, List fullyQualifiedNames) { - return AVM2Item.localRegName(localRegNames, getRegisterId(ins)); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return -1; - } - - public abstract int getRegisterId(AVM2Instruction ins); -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.localregs; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns; +import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.DecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.PostDecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreDecrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.NotCompileTimeItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.PopItem; +import java.util.HashMap; +import java.util.List; +import java.util.Stack; + +public abstract class SetLocalTypeIns extends InstructionDefinition implements SetTypeIns { + + public SetLocalTypeIns(int instructionCode, String instructionName, int[] operands, boolean canThrow) { + super(instructionCode, instructionName, operands, canThrow); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap regAssignCount, int ip, HashMap> refs, AVM2Code code) { + int regId = getRegisterId(ins); + GraphTargetItem value = stack.pop(); + /*if (localRegs.containsKey(regId)) { + localRegs.put(regId, new NotCompileTimeAVM2Item(ins, value)); + } else { + localRegs.put(regId, value); + }*/ + if (!(value instanceof PopItem)) { + localRegs.put(regId, value); + } + if (!regAssignCount.containsKey(regId)) { + regAssignCount.put(regId, 0); + } + regAssignCount.put(regId, regAssignCount.get(regId) + 1); + //localRegsAssignmentIps.put(regId, ip); + if (value.getThroughDuplicate() instanceof NewActivationAVM2Item) { + return; + } + if (value instanceof FindPropertyAVM2Item) { + return; + } + if (value.getNotCoerced() instanceof IncrementAVM2Item) { + GraphTargetItem inside = ((IncrementAVM2Item) value.getNotCoerced()).value.getNotCoerced().getThroughDuplicate(); + if (inside instanceof LocalRegAVM2Item) { + if (((LocalRegAVM2Item) inside).regIndex == regId) { + if (stack.size() > 0) { + GraphTargetItem top = stack.peek().getNotCoerced().getThroughDuplicate(); + if (top == inside) { + stack.pop(); + stack.push(new PostIncrementAVM2Item(ins, inside)); + } else if ((top instanceof IncrementAVM2Item) && (((IncrementAVM2Item) top).value == inside)) { + stack.pop(); + stack.push(new PreIncrementAVM2Item(ins, inside)); + } else { + output.add(new PostIncrementAVM2Item(ins, inside)); + } + } else { + output.add(new PostIncrementAVM2Item(ins, inside)); + } + return; + } + } + } + + if (value.getNotCoerced() instanceof DecrementAVM2Item) { + GraphTargetItem inside = ((DecrementAVM2Item) value.getNotCoerced()).value.getNotCoerced().getThroughDuplicate(); + if (inside instanceof LocalRegAVM2Item) { + if (((LocalRegAVM2Item) inside).regIndex == regId) { + if (stack.size() > 0) { + GraphTargetItem top = stack.peek().getNotCoerced().getThroughDuplicate(); + if (top == inside) { + stack.pop(); + stack.push(new PostDecrementAVM2Item(ins, inside)); + } else if ((top instanceof DecrementAVM2Item) && (((DecrementAVM2Item) top).value == inside)) { + stack.pop(); + stack.push(new PreDecrementAVM2Item(ins, inside)); + } else { + output.add(new PostDecrementAVM2Item(ins, inside)); + } + } else { + output.add(new PostDecrementAVM2Item(ins, inside)); + } + return; + } + } + } + + //if(val.startsWith("catchscope ")) return; + //if(val.startsWith("newactivation()")) return; + output.add(new SetLocalAVM2Item(ins, regId, value)); + } + + @Override + public String getObject(Stack stack, ABC abc, AVM2Instruction ins, List output, MethodBody body, HashMap localRegNames, List fullyQualifiedNames) { + return AVM2Item.localRegName(localRegNames, getRegisterId(ins)); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + public abstract int getRegisterId(AVM2Instruction ins); +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java index aceb9e46e..7456f9eea 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java @@ -156,9 +156,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { } } } - if (slotname == null) { - System.err.println("SLOT NOT FOUND"); - } + output.add(new SetSlotAVM2Item(ins, obj, slotname, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java index 4865b4ff0..9abebbaaf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PopIns.java @@ -45,13 +45,9 @@ public class PopIns extends InstructionDefinition { @Override public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - if (stack.size() > 0) { - GraphTargetItem top = stack.pop(); - //Note: Commands like "5;" - numbers are unsupported as it collide with try..finally block decompilation. TODO: allow this somehow - - if (/*!(top instanceof IntegerValueAVM2Item) &&*/(!(top instanceof MarkItem))) { - output.add(top); - } + GraphTargetItem top = stack.pop(); + if ((!(top instanceof MarkItem))) { + output.add(top); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushFalseIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushFalseIns.java index 8c32f6243..76076797c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushFalseIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushFalseIns.java @@ -1,54 +1,55 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.stack; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -public class PushFalseIns extends InstructionDefinition { - - public PushFalseIns() { - super(0x27, "pushfalse", new int[]{}, false); - } - - @Override - public void execute(LocalDataArea lda, AVM2ConstantPool constants, List arguments) { - lda.operandStack.push(Boolean.FALSE); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - stack.push(new BooleanAVM2Item(ins, Boolean.FALSE)); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1; - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.stack; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.FalseItem; +import java.util.HashMap; +import java.util.List; + +public class PushFalseIns extends InstructionDefinition { + + public PushFalseIns() { + super(0x27, "pushfalse", new int[]{}, false); + } + + @Override + public void execute(LocalDataArea lda, AVM2ConstantPool constants, List arguments) { + lda.operandStack.push(Boolean.FALSE); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + stack.push(new FalseItem(ins)); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushTrueIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushTrueIns.java index dc86afa3f..f87e6bb8d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushTrueIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/stack/PushTrueIns.java @@ -1,54 +1,55 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.instructions.stack; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; -import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.ScopeStack; -import com.jpexs.decompiler.graph.TranslateStack; -import java.util.HashMap; -import java.util.List; - -public class PushTrueIns extends InstructionDefinition { - - public PushTrueIns() { - super(0x26, "pushtrue", new int[]{}, false); - } - - @Override - public void execute(LocalDataArea lda, AVM2ConstantPool constants, List arguments) { - lda.operandStack.push(Boolean.TRUE); - } - - @Override - public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { - stack.push(new BooleanAVM2Item(ins, Boolean.TRUE)); - } - - @Override - public int getStackDelta(AVM2Instruction ins, ABC abc) { - return 1; - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.instructions.stack; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.TrueItem; +import java.util.HashMap; +import java.util.List; + +public class PushTrueIns extends InstructionDefinition { + + public PushTrueIns() { + super(0x26, "pushtrue", new int[]{}, false); + } + + @Override + public void execute(LocalDataArea lda, AVM2ConstantPool constants, List arguments) { + lda.operandStack.push(Boolean.TRUE); + } + + @Override + public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + stack.push(new TrueItem(ins)); + } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyLoadAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyLoadAVM2Item.java index 73525a4f6..b00b58b2a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyLoadAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyLoadAVM2Item.java @@ -16,11 +16,21 @@ */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Lf32Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Lf64Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Li16Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Li32Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Li8Ins; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; /** * @@ -28,25 +38,57 @@ import com.jpexs.decompiler.graph.model.LocalData; */ public class AlchemyLoadAVM2Item extends AVM2Item { - private final String name; + private final char type; + private final int size; private final GraphTargetItem ofs; - public AlchemyLoadAVM2Item(GraphSourceItem instruction, GraphTargetItem ofs, String name) { + public AlchemyLoadAVM2Item(GraphSourceItem instruction, GraphTargetItem ofs, char type, int size) { super(instruction, PRECEDENCE_PRIMARY); - this.name = name; this.ofs = ofs; + this.type = type; + this.size = size; } @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("op_" + name + "("); + writer.append("l" + type + size + "("); ofs.toString(writer, localData); - return writer.append(") /*Alchemy*/"); + return writer.append(")"); + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + String ts = "" + type + size; + InstructionDefinition def = null; + switch (ts) { + case "i8": + def = new Li8Ins(); + break; + case "i16": + def = new Li16Ins(); + break; + case "i32": + def = new Li32Ins(); + break; + case "f": + def = new Lf32Ins(); + break; + case "f32": + def = new Lf64Ins(); + break; + } + return toSourceMerge(localData, generator, ofs, ins(def)); } @Override public GraphTargetItem returnType() { + switch (type) { + case 'i': + return new TypeItem("int"); + case 'f': + return new TypeItem("Number"); + } return TypeItem.UNBOUNDED; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemySignExtendAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemySignExtendAVM2Item.java index ed725c54a..18095c337 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemySignExtendAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemySignExtendAVM2Item.java @@ -12,14 +12,23 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Sxi16Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Sxi1Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Sxi8Ins; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; /** * @@ -27,28 +36,45 @@ import com.jpexs.decompiler.graph.model.LocalData; */ public class AlchemySignExtendAVM2Item extends AVM2Item { - private final String name; + private final int size; - public AlchemySignExtendAVM2Item(GraphSourceItem instruction, GraphTargetItem value, String name) { + public AlchemySignExtendAVM2Item(GraphSourceItem instruction, GraphTargetItem value, int size) { super(instruction, PRECEDENCE_PRIMARY); - this.name = name; this.value = value; + this.size = size; } @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("op_" + name + "("); + writer.append("si" + size + "("); value.toString(writer, localData); - return writer.append(") /*Alchemy*/"); + return writer.append(")"); } @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return new TypeItem("int"); } @Override public boolean hasReturnValue() { return true; } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + InstructionDefinition def = null; + switch (size) { + case 1: + def = new Sxi1Ins(); + break; + case 8: + def = new Sxi8Ins(); + break; + case 16: + def = new Sxi16Ins(); + break; + } + return toSourceMerge(localData, generator, value, ins(def)); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyStoreAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyStoreAVM2Item.java index d36499f38..e26570594 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyStoreAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AlchemyStoreAVM2Item.java @@ -16,11 +16,21 @@ */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Sf32Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Sf64Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Si16Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Si32Ins; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.Si8Ins; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; /** * @@ -28,24 +38,26 @@ import com.jpexs.decompiler.graph.model.LocalData; */ public class AlchemyStoreAVM2Item extends AVM2Item { - private final String name; + private final char type; + private final int size; private final GraphTargetItem ofs; - public AlchemyStoreAVM2Item(GraphSourceItem instruction, GraphTargetItem value, GraphTargetItem ofs, String name) { + public AlchemyStoreAVM2Item(GraphSourceItem instruction, GraphTargetItem value, GraphTargetItem ofs, char type, int size) { super(instruction, PRECEDENCE_PRIMARY); - this.name = name; this.ofs = ofs; this.value = value; + this.type = type; + this.size = size; } @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("op_" + name + "("); + writer.append("s" + type + size + "("); ofs.toString(writer, localData); writer.append(","); value.toString(writer, localData); - return writer.append(") /*Alchemy*/"); + return writer.append(")"); } @Override @@ -57,4 +69,29 @@ public class AlchemyStoreAVM2Item extends AVM2Item { public boolean hasReturnValue() { return false; } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + String ts = "" + type + size; + InstructionDefinition def = null; + switch (ts) { + case "i8": + def = new Si8Ins(); + break; + case "i16": + def = new Si16Ins(); + break; + case "i32": + def = new Si32Ins(); + break; + case "f32": + def = new Sf32Ins(); + break; + case "f64": + def = new Sf64Ins(); + break; + } + return toSourceMerge(localData, generator, ofs, ins(def)); + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java index 671975b7f..12e3ca6a2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/HasNextAVM2Item.java @@ -40,9 +40,9 @@ public class HasNextAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - collection.toString(writer, localData); + collection.appendTo(writer, localData); writer.append(" hasNext "); - return object.toString(writer, localData); + return object.appendTo(writer, localData); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java index dbe0fc1de..8c75a60ad 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -25,6 +26,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; @@ -47,7 +49,7 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item { @Override public Object getResult() { - return (Double) (double) (long) value; + return value;//(Double) (double) (long) value; } @Override @@ -78,4 +80,5 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item { public boolean hasReturnValue() { return true; } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java index 36b178587..9dc5ef03d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java @@ -90,7 +90,7 @@ public class LocalRegAVM2Item extends AVM2Item { @Override public boolean isCompileTime(Set dependencies) { - return isCT; + return false; //isCT; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java index b664e18ef..a182b93e9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewActivationAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; @@ -32,7 +33,7 @@ public class NewActivationAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - return writer.append("newactivation()"); + return writer.append("§§activation"); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NumberValueAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NumberValueAVM2Item.java index 40f114929..3375c588e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NumberValueAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NumberValueAVM2Item.java @@ -1,25 +1,32 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.graph.SimpleValue; -public abstract class NumberValueAVM2Item extends AVM2Item { +public abstract class NumberValueAVM2Item extends AVM2Item implements SimpleValue { public NumberValueAVM2Item(AVM2Instruction instruction) { super(instruction, PRECEDENCE_PRIMARY); } + + @Override + public boolean isSimpleValue() { + return true; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java index 989735dc2..68256562d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java @@ -46,14 +46,14 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - srcData.localName = slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false); + srcData.localName = slotName == null ? "/*UnknownSlot*/" : slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false); getName(writer, localData); writer.append(" = "); return value.toString(writer, localData); } public String getNameAsStr(LocalData localData) { - return slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false); + return slotName == null ? "/*UnknownSlot*/" : slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false); } public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/StringAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/StringAVM2Item.java index c99741759..b2d84022a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/StringAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/StringAVM2Item.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; @@ -31,7 +32,7 @@ import com.jpexs.helpers.Helper; import java.util.List; import java.util.Set; -public class StringAVM2Item extends AVM2Item { +public class StringAVM2Item extends AVM2Item implements SimpleValue { public String value; @@ -71,4 +72,9 @@ public class StringAVM2Item extends AVM2Item { public boolean hasReturnValue() { return true; } + + @Override + public boolean isSimpleValue() { + return true; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java index 32d64eaad..956ecd8d6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java @@ -85,7 +85,7 @@ public class DeclarationAVM2Item extends AVM2Item { if (lti.value instanceof ConvertAVM2Item) { coerType = ((ConvertAVM2Item) lti.value).type; } - srcData.declaredType = (coerType instanceof TypeItem) ? ((TypeItem) coerType).fullTypeName : "*"; + srcData.declaredType = (coerType instanceof TypeItem) ? ((TypeItem) coerType).fullTypeName.toPrintableString() : "*"; writer.append("var "); writer.append(localName); writer.append(":"); @@ -97,7 +97,7 @@ public class DeclarationAVM2Item extends AVM2Item { SetSlotAVM2Item ssti = (SetSlotAVM2Item) assignment; srcData.localName = ssti.getNameAsStr(localData); srcData.declaration = true; - srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : "*"; + srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName.toPrintableString() : "*"; writer.append("var "); ssti.getName(writer, localData); writer.append(":"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java index 3e223f4a1..ab8a69b17 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java @@ -96,7 +96,7 @@ public class TryAVM2Item extends AVM2Item implements Block { int eti = catchExceptions.get(e).type_index; - data.declaredType = eti <= 0 ? "*" : localData.constantsAvm2.constant_multiname.get(eti).getNameWithNamespace(localData.constantsAvm2, true); + data.declaredType = eti <= 0 ? "*" : localData.constantsAvm2.constant_multiname.get(eti).getNameWithNamespace(localData.constantsAvm2).toPrintableString(); writer.hilightSpecial(localName, HighlightSpecialType.TRY_NAME, e, data); writer.append(":"); writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.constantsAvm2, localData.fullyQualifiedNames), HighlightSpecialType.TRY_TYPE, e); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java index fae5ce3b2..fe2f677bd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -53,7 +54,7 @@ public class EqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new NeqAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java index aaf861327..2fa46b963 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,7 @@ public class GeAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new LtAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java index 32ec2e1d1..bacf5fffa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,7 @@ public class GtAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new LeAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LeAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LeAVM2Item.java index a65e4250a..017f5e700 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LeAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LeAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,7 @@ public class LeAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new GtAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java index bbfc82018..006d7b386 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,7 @@ public class LtAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new GeAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java index 8e920d6df..69fc52490 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -54,7 +55,7 @@ public class NeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondit } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new EqAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java index e61d1196e..e13bce5a9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -56,7 +57,7 @@ public class StrictEqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfC } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new StrictNeqAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java index cea963789..82cdae968 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -49,7 +50,7 @@ public class StrictNeqAVM2Item extends BinaryOpItem implements LogicalOpItem, If } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new StrictEqAVM2Item(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index cd0302c22..37c42df8c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -57,9 +57,11 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.DupIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopScopeIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushByteIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushFalseIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushNullIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushScopeIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushStringIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushTrueIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushUndefinedIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushWithIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.SwapIns; @@ -103,10 +105,10 @@ import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; -import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; @@ -118,6 +120,7 @@ import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.FalseItem; import com.jpexs.decompiler.graph.model.ForItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.LocalData; @@ -125,6 +128,7 @@ import com.jpexs.decompiler.graph.model.NotItem; import com.jpexs.decompiler.graph.model.OrItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.io.ByteArrayOutputStream; @@ -161,6 +165,16 @@ public class AVM2SourceGenerator implements SourceGenerator { return new AVM2Instruction(0, def, operands); } + @Override + public List generate(SourceGeneratorLocalData localData, FalseItem item) throws CompilationException { + return GraphTargetItem.toSourceMerge(localData, this, ins(new PushFalseIns())); + } + + @Override + public List generate(SourceGeneratorLocalData localData, TrueItem item) throws CompilationException { + return GraphTargetItem.toSourceMerge(localData, this, ins(new PushTrueIns())); + } + public List generate(SourceGeneratorLocalData localData, GetDescendantsAVM2Item item) throws CompilationException { int[] nssa = new int[item.openedNamespaces.size()]; for (int i = 0; i < item.openedNamespaces.size(); i++) { @@ -1181,7 +1195,7 @@ public class AVM2SourceGenerator implements SourceGenerator { return abc; } - public void generateClass(List importedClasses, List sinitVariables, boolean staticNeedsActivation, List staticInit, List openedNamespaces, int namespace, int initScope, String pkg, ClassInfo classInfo, InstanceInfo instanceInfo, SourceGeneratorLocalData localData, boolean isInterface, String name, String superName, GraphTargetItem extendsVal, List implementsStr, GraphTargetItem constructor, List traitItems, Reference class_index) throws AVM2ParseException, CompilationException { + public void generateClass(List importedClasses, List sinitVariables, boolean staticNeedsActivation, List staticInit, List openedNamespaces, int namespace, int initScope, String pkg, ClassInfo classInfo, InstanceInfo instanceInfo, SourceGeneratorLocalData localData, boolean isInterface, String name, String superName, GraphTargetItem extendsVal, List implementsStr, GraphTargetItem constructor, List traitItems, Reference class_index) throws AVM2ParseException, CompilationException { localData.currentClass = name; localData.pkg = pkg; List ret = new ArrayList<>(); @@ -1693,7 +1707,7 @@ public class AVM2SourceGenerator implements SourceGenerator { TraitSlotConst tsc = (TraitSlotConst) mbody.traits.traits.get(i); GraphTargetItem type = TypeItem.UNBOUNDED; if (tsc.type_index > 0) { - type = new TypeItem(abc.constants.constant_multiname.get(tsc.type_index).getNameWithNamespace(abc.constants, true)); + type = new TypeItem(abc.constants.constant_multiname.get(tsc.type_index).getNameWithNamespace(abc.constants)); } NameAVM2Item d = new NameAVM2Item(type, 0, tsc.getName(abc).getName(abc.constants, new ArrayList<>(), true), NameAVM2Item.getDefaultValue("" + type), true, new ArrayList()); d.setSlotNumber(tsc.slot_id); @@ -1854,7 +1868,7 @@ public class AVM2SourceGenerator implements SourceGenerator { return null; } - private int genNs(List importedClasses, String pkg, String custom, int namespace, List openedNamespaces, SourceGeneratorLocalData localData, int line) throws CompilationException { + private int genNs(List importedClasses, String pkg, String custom, int namespace, List openedNamespaces, SourceGeneratorLocalData localData, int line) throws CompilationException { if (custom != null) { PropertyAVM2Item prop = new PropertyAVM2Item(null, custom, abc, allABCs, openedNamespaces, new ArrayList()); Reference value = new Reference<>(null); @@ -1865,11 +1879,9 @@ public class AVM2SourceGenerator implements SourceGenerator { } if (!resolved) { - String customPkg = ""; - String fullCustom = ""; - for (String imp : importedClasses) { - if (imp.endsWith("." + custom)) { - customPkg = imp.substring(0, imp.lastIndexOf('.')); + DottedChain fullCustom = null; + for (DottedChain imp : importedClasses) { + if (imp.getLast().equals(custom)) { fullCustom = imp; break; } @@ -1882,7 +1894,7 @@ public class AVM2SourceGenerator implements SourceGenerator { for (ScriptInfo si : a.script_info) { for (Trait t : si.traits.traits) { Multiname m = t.getName(a); - if (fullCustom.equals(m.getNameWithNamespace(a.constants, true))) { + if (fullCustom != null && fullCustom.equals(m.getNameWithNamespace(a.constants))) { if (t instanceof TraitSlotConst) { if (((TraitSlotConst) t).isNamespace()) { Namespace ns = a.constants.getNamespace(((TraitSlotConst) t).value_index); @@ -1901,7 +1913,7 @@ public class AVM2SourceGenerator implements SourceGenerator { return namespace; } - public void generateTraitsPhase2(List importedClasses, String pkg, List items, Trait[] traits, List openedNamespaces, SourceGeneratorLocalData localData) throws CompilationException { + public void generateTraitsPhase2(List importedClasses, String pkg, List items, Trait[] traits, List openedNamespaces, SourceGeneratorLocalData localData) throws CompilationException { for (int k = 0; k < items.size(); k++) { GraphTargetItem item = items.get(k); if (traits[k] == null) { @@ -2132,7 +2144,7 @@ public class AVM2SourceGenerator implements SourceGenerator { ScriptInfo si = new ScriptInfo(); localData.currentScript = si; Trait[] traitArr = generateTraitsPhase1(null, null, true, localData, commands, si.traits, class_index); - generateTraitsPhase2(new ArrayList<>(), null/*FIXME*/, commands, traitArr, new ArrayList(), localData); + generateTraitsPhase2(new ArrayList(), null/*FIXME*/, commands, traitArr, new ArrayList(), localData); MethodInfo mi = new MethodInfo(new int[0], 0, 0, 0, new ValueKind[0], new int[0]); MethodBody mb = new MethodBody(); mb.method_info = abc.addMethodInfo(mi); @@ -2444,12 +2456,9 @@ public class AVM2SourceGenerator implements SourceGenerator { TypeItem type = (TypeItem) typeItem; - String name = type.fullTypeName; - String pkg = ""; - if (name.contains(".")) { - pkg = name.substring(0, name.lastIndexOf('.')); - name = name.substring(name.lastIndexOf('.') + 1); - } + DottedChain dname = type.fullTypeName; + String pkg = dname.getWithoutLast().toString(); + String name = dname.getLast(); for (InstanceInfo ii : abc.instance_info) { Multiname mname = abc.constants.constant_multiname.get(ii.name_index); if (mname != null && name.equals(mname.getName(abc.constants, new ArrayList<>(), true))) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index 782302715..ad78e4ed0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -86,6 +86,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.TypeItem; @@ -144,7 +145,7 @@ public class ActionScript3Parser { return uniqLast; } - private List commands(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forinlevel, List variables) throws IOException, AVM2ParseException { + private List commands(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forinlevel, List variables) throws IOException, AVM2ParseException { List ret = new ArrayList<>(); if (debugMode) { System.out.println("commands:"); @@ -159,7 +160,7 @@ public class ActionScript3Parser { return ret; } - private GraphTargetItem type(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem type(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, List variables) throws IOException, AVM2ParseException { ParsedSymbol s = lex(); if (s.type == SymbolType.MULTIPLY) { return new UnboundedTypeItem(); @@ -174,7 +175,7 @@ public class ActionScript3Parser { return t; } - private GraphTargetItem memberOrCall(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem newcmds, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem memberOrCall(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem newcmds, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { if (debugMode) { System.out.println("memberOrCall:"); } @@ -223,7 +224,7 @@ public class ActionScript3Parser { return ret; } - private GraphTargetItem applyType(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem obj, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem applyType(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem obj, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { GraphTargetItem ret = obj; ParsedSymbol s = lex(); if (s.type == SymbolType.TYPENAME) { @@ -250,7 +251,7 @@ public class ActionScript3Parser { return ret; } - private GraphTargetItem member(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem obj, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem member(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, GraphTargetItem obj, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { if (debugMode) { System.out.println("member:"); } @@ -286,7 +287,7 @@ public class ActionScript3Parser { s = lex(); GraphTargetItem ns = null; if (s.type == SymbolType.NAMESPACE_OP) { - ns = new UnresolvedAVM2Item(new ArrayList(), importedClasses, false, null, lexer.yyline(), propName, null, openedNamespaces); + ns = new UnresolvedAVM2Item(new ArrayList(), importedClasses, false, null, lexer.yyline(), new DottedChain(propName), null, openedNamespaces); variables.add((UnresolvedAVM2Item) ns); s = lex(); if (s.type == SymbolType.BRACKET_OPEN) { @@ -317,28 +318,31 @@ public class ActionScript3Parser { return ret; } - private GraphTargetItem name(TypeItem thisType, String pkg, Reference needsActivation, boolean typeOnly, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables, List importedClasses) throws IOException, AVM2ParseException { + private GraphTargetItem name(TypeItem thisType, String pkg, Reference needsActivation, boolean typeOnly, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables, List importedClasses) throws IOException, AVM2ParseException { ParsedSymbol s = lex(); - String name = ""; + DottedChain name = new DottedChain(); + String name2 = ""; if (s.type == SymbolType.ATTRIBUTE) { - name += "@"; + name2 += "@"; s = lex(); } expected(s, lexer.yyline(), SymbolGroup.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP); - name += s.value.toString(); + name2 += s.value.toString(); s = lex(); boolean attrBracket = false; + name.parts.add(name2); while (s.isType(SymbolType.DOT)) { - name += s.value.toString(); //. or :: + //name += s.value.toString(); //. or :: s = lex(); + name2 = ""; if (s.type == SymbolType.ATTRIBUTE) { - name += "@"; + name2 += "@"; s = lex(); if (s.type == SymbolType.MULTIPLY) { - name += s.value.toString(); + name2 += s.value.toString(); } else if (s.group == SymbolGroup.IDENTIFIER) { - name += s.value.toString(); + name2 += s.value.toString(); } else { if (s.type != SymbolType.BRACKET_OPEN) { throw new AVM2ParseException("Attribute identifier or bracket expected", lexer.yyline()); @@ -348,19 +352,16 @@ public class ActionScript3Parser { } } else { expected(s, lexer.yyline(), SymbolGroup.IDENTIFIER, SymbolType.NAMESPACE); - name += s.value.toString(); + name2 += s.value.toString(); } + name.parts.add(name2); s = lex(); } String nsname = null; String nsprop = null; GraphTargetItem nspropItem = null; if (s.type == SymbolType.NAMESPACE_OP) { - if (name.contains(".")) { - nsname = name.substring(name.lastIndexOf('.') + 1); - } else { - nsname = name; - } + nsname = name.getLast(); s = lex(); if (s.group == SymbolGroup.IDENTIFIER) { nsprop = s.value.toString(); @@ -368,16 +369,12 @@ public class ActionScript3Parser { nspropItem = expression(thisType, pkg, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); expectedType(SymbolType.BRACKET_CLOSE); } - if (name.contains(".")) { - name = name.substring(0, name.lastIndexOf('.')); - } else { - name = null; - } + name = name.getWithoutLast(); s = lex(); } GraphTargetItem ret = null; - if (name != null) { + if (!name.parts.isEmpty()) { UnresolvedAVM2Item unr = new UnresolvedAVM2Item(new ArrayList(), importedClasses, typeOnly, null, lexer.yyline(), name, null, openedNamespaces); //unr.setIndex(index); variables.add(unr); @@ -388,7 +385,7 @@ public class ActionScript3Parser { if (attr) { nsname = nsname.substring(1); } - UnresolvedAVM2Item ns = new UnresolvedAVM2Item(new ArrayList(), importedClasses, typeOnly, null, lexer.yyline(), nsname, null, openedNamespaces); + UnresolvedAVM2Item ns = new UnresolvedAVM2Item(new ArrayList(), importedClasses, typeOnly, null, lexer.yyline(), new DottedChain(nsname), null, openedNamespaces); variables.add(ns); ret = new NamespacedAVM2Item(ns, nsprop, nspropItem, ret, attr, openedNamespaces, null); } @@ -443,7 +440,7 @@ public class ActionScript3Parser { return ret; } - private List call(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private List call(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { List ret = new ArrayList<>(); //expected(SymbolType.PARENT_OPEN); //MUST BE HANDLED BY CALLER ParsedSymbol s = lex(); @@ -458,12 +455,12 @@ public class ActionScript3Parser { return ret; } - private MethodAVM2Item method(String pkg, boolean isInterface, String customAccess, Reference needsActivation, List importedClasses, boolean override, boolean isFinal, TypeItem thisType, List openedNamespaces, boolean isStatic, int namespace, String functionName, boolean isMethod, List variables) throws IOException, AVM2ParseException { + private MethodAVM2Item method(String pkg, boolean isInterface, String customAccess, Reference needsActivation, List importedClasses, boolean override, boolean isFinal, TypeItem thisType, List openedNamespaces, boolean isStatic, int namespace, String functionName, boolean isMethod, List variables) throws IOException, AVM2ParseException { FunctionAVM2Item f = function(pkg, isInterface, needsActivation, importedClasses, namespace, thisType, openedNamespaces, functionName, isMethod, variables); return new MethodAVM2Item(f.pkg, f.isInterface, customAccess, f.needsActivation, f.hasRest, f.line, override, isFinal, isStatic, f.namespace, functionName, f.paramTypes, f.paramNames, f.paramValues, f.body, f.subvariables, f.retType); } - private FunctionAVM2Item function(String pkg, boolean isInterface, Reference needsActivation, List importedClasses, int namespace, TypeItem thisType, List openedNamespaces, String functionName, boolean isMethod, List variables) throws IOException, AVM2ParseException { + private FunctionAVM2Item function(String pkg, boolean isInterface, Reference needsActivation, List importedClasses, int namespace, TypeItem thisType, List openedNamespaces, String functionName, boolean isMethod, List variables) throws IOException, AVM2ParseException { openedNamespaces = new ArrayList<>(openedNamespaces); //local copy int line = lexer.yyline(); ParsedSymbol s; @@ -544,7 +541,7 @@ public class ActionScript3Parser { return new FunctionAVM2Item(pkg, isInterface, needsActivation2.getVal(), namespace, hasRest, line, functionName, paramTypes, paramNames, paramValues, body, subvariables, retType); } - private GraphTargetItem traits(String scriptName, boolean scriptTraits, List sinitVariables, Reference sinitNeedsActivation, List staticInitializer, List importedClasses, int privateNs, int protectedNs, int publicNs, int packageInternalNs, int protectedStaticNs, List openedNamespaces, String pkg, String classNameStr, boolean isInterface, List traits) throws AVM2ParseException, IOException, CompilationException { + private GraphTargetItem traits(String scriptName, boolean scriptTraits, List sinitVariables, Reference sinitNeedsActivation, List staticInitializer, List importedClasses, int privateNs, int protectedNs, int publicNs, int packageInternalNs, int protectedStaticNs, List openedNamespaces, String pkg, String classNameStr, boolean isInterface, List traits) throws AVM2ParseException, IOException, CompilationException { ParsedSymbol s; GraphTargetItem constr = null; TypeItem thisType = pkg == null && classNameStr == null ? null : new TypeItem(pkg == null || "".equals(pkg) ? classNameStr : pkg + "." + classNameStr); @@ -892,7 +889,7 @@ public class ActionScript3Parser { return constr; } - private GraphTargetItem classTraits(String scriptName, int gpublicNs, String pkg, List importedClasses, boolean isDynamic, boolean isFinal, List openedNamespaces, String packageName, int namespace, boolean isInterface, String nameStr, GraphTargetItem extendsStr, List implementsStr, List variables) throws IOException, AVM2ParseException, CompilationException { + private GraphTargetItem classTraits(String scriptName, int gpublicNs, String pkg, List importedClasses, boolean isDynamic, boolean isFinal, List openedNamespaces, String packageName, int namespace, boolean isInterface, String nameStr, GraphTargetItem extendsStr, List implementsStr, List variables) throws IOException, AVM2ParseException, CompilationException { GraphTargetItem ret = null; @@ -1049,7 +1046,7 @@ public class ActionScript3Parser { } } - private List xmltag(TypeItem thisType, String pkg, Reference usesVars, List openedTags, Reference closedVarTags, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private List xmltag(TypeItem thisType, String pkg, Reference usesVars, List openedTags, Reference closedVarTags, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { ParsedSymbol s = null; List rets = new ArrayList<>(); //GraphTargetItem ret = null; @@ -1178,7 +1175,7 @@ public class ActionScript3Parser { return rets; } - private GraphTargetItem xml(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem xml(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { List openedTags = new ArrayList<>(); int closedVarTags = 0; @@ -1189,7 +1186,7 @@ public class ActionScript3Parser { return ret; } - private GraphTargetItem command(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forinlevel, boolean mustBeCommand, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem command(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forinlevel, boolean mustBeCommand, List variables) throws IOException, AVM2ParseException { LexBufferer buf = new LexBufferer(); lexer.addListener(buf); GraphTargetItem ret = null; @@ -1672,7 +1669,7 @@ public class ActionScript3Parser { } - private GraphTargetItem expression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem expression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { return expression(thisType, pkg, needsActivation, importedClasses, openedNamespaces, false, registerVars, inFunction, inMethod, allowRemainder, variables); } @@ -1704,7 +1701,7 @@ public class ActionScript3Parser { return ret; } - /*private GraphTargetItem expressionRemainder(TypeItem thisType, String pkg, Reference needsActivation, List openedNamespaces, GraphTargetItem expr, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables, List importedClasses) throws IOException, AVM2ParseException { + /*private GraphTargetItem expressionRemainder(TypeItem thisType, String pkg, Reference needsActivation, List openedNamespaces, GraphTargetItem expr, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables, List importedClasses) throws IOException, AVM2ParseException { GraphTargetItem ret = null; ParsedSymbol s = lex(); @@ -1740,7 +1737,7 @@ public class ActionScript3Parser { return false; } - private int brackets(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, List ret, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { + private int brackets(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, List ret, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, AVM2ParseException { ParsedSymbol s = lex(); int arrCnt = 0; if (s.type == SymbolType.BRACKET_OPEN) { @@ -1764,7 +1761,7 @@ public class ActionScript3Parser { return arrCnt; } - private GraphTargetItem commaExpression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forInLevel, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem commaExpression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, Stack loops, Map loopLabels, HashMap registerVars, boolean inFunction, boolean inMethod, int forInLevel, List variables) throws IOException, AVM2ParseException { GraphTargetItem cmd = null; List expr = new ArrayList<>(); ParsedSymbol s; @@ -1786,7 +1783,7 @@ public class ActionScript3Parser { return new CommaExpressionItem(null, expr); } - private GraphTargetItem expression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem expression(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { GraphTargetItem prim = expressionPrimary(thisType, pkg, needsActivation, importedClasses, openedNamespaces, allowEmpty, registerVars, inFunction, inMethod, allowRemainder, variables); if (prim == null) { return null; @@ -1816,7 +1813,7 @@ public class ActionScript3Parser { return lookahead; } - private GraphTargetItem expression1(GraphTargetItem lhs, int min_precedence, TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem expression1(GraphTargetItem lhs, int min_precedence, TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { if (debugMode) { System.out.println("expression1:"); } @@ -2029,7 +2026,7 @@ public class ActionScript3Parser { return lhs; } - private GraphTargetItem expressionPrimary(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { + private GraphTargetItem expressionPrimary(TypeItem thisType, String pkg, Reference needsActivation, List importedClasses, List openedNamespaces, boolean allowEmpty, HashMap registerVars, boolean inFunction, boolean inMethod, boolean allowRemainder, List variables) throws IOException, AVM2ParseException { if (debugMode) { System.out.println("primary:"); } @@ -2279,39 +2276,34 @@ public class ActionScript3Parser { s = lex(); } - List importedClasses = new ArrayList<>(); + List importedClasses = new ArrayList<>(); s = lex(); while (s.type == SymbolType.IMPORT) { - String impPackage = ""; - String impName = null; boolean all = false; s = lex(); expected(s, lexer.yyline(), SymbolGroup.IDENTIFIER); - impName = s.value.toString(); + DottedChain imp = new DottedChain(); + imp.parts.add(s.value.toString()); s = lex(); + boolean isStar = false; while (s.type == SymbolType.DOT) { - if (!"".equals(impPackage)) { - impPackage += "."; - } - impPackage += impName; s = lex(); if (s.type == SymbolType.MULTIPLY) { - impName = null; + isStar = true; s = lex(); break; } expected(s, lexer.yyline(), SymbolGroup.IDENTIFIER); - - impName = s.value.toString(); + imp.parts.add(s.value.toString()); s = lex(); } - if (impName == null) { - openedNamespaces.add(abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, abc.constants.getStringId(impPackage, true)), 0, true)); + if (isStar) { + openedNamespaces.add(abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, abc.constants.getStringId(imp.toString(), true)), 0, true)); } else { - importedClasses.add(impPackage + "." + impName); + importedClasses.add(imp); } expected(s, lexer.yyline(), SymbolType.SEMICOLON); @@ -2349,7 +2341,7 @@ public class ActionScript3Parser { openedNamespaces.add(publicNs = abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, abc.constants.getStringId("", true)), 0, true)); List items = new ArrayList<>(); - traits(fileName, true, new ArrayList(), new Reference<>(false), new ArrayList(), new ArrayList<>(), scriptPrivateNs, 0, publicNs, 0, 0, openedNamespaces, null, null, false, items); + traits(fileName, true, new ArrayList(), new Reference<>(false), new ArrayList(), new ArrayList(), scriptPrivateNs, 0, publicNs, 0, 0, openedNamespaces, null, null, false, items); return items; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java index 719e7102c..cd49a855d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ClassAVM2Item.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.Block; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; @@ -54,7 +55,7 @@ public class ClassAVM2Item extends AVM2Item implements Block { public List sinitVariables; - public List importedClasses; + public List importedClasses; public String pkg; @@ -67,7 +68,7 @@ public class ClassAVM2Item extends AVM2Item implements Block { return ret; } - public ClassAVM2Item(List importedClasses, String pkg, List openedNamespaces, int protectedNs, boolean isDynamic, boolean isFinal, int namespace, String className, GraphTargetItem extendsOp, List implementsOp, List staticInit, boolean staticInitActivation, List sinitVariables, GraphTargetItem constructor, List traits) { + public ClassAVM2Item(List importedClasses, String pkg, List openedNamespaces, int protectedNs, boolean isDynamic, boolean isFinal, int namespace, String className, GraphTargetItem extendsOp, List implementsOp, List staticInit, boolean staticInitActivation, List sinitVariables, GraphTargetItem constructor, List traits) { super(null, NOPRECEDENCE); this.importedClasses = importedClasses; this.pkg = pkg; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/InterfaceAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/InterfaceAVM2Item.java index a21b5cdcb..70d5625e4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/InterfaceAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/InterfaceAVM2Item.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -43,9 +44,9 @@ public class InterfaceAVM2Item extends AVM2Item { public String pkg; - public List importedClasses; + public List importedClasses; - public InterfaceAVM2Item(List importedClasses, String pkg, List openedNamespaces, boolean isFinal, int namespace, String name, List superInterfaces, List traits) { + public InterfaceAVM2Item(List importedClasses, String pkg, List openedNamespaces, boolean isFinal, int namespace, String name, List superInterfaces, List traits) { super(null, NOPRECEDENCE); this.importedClasses = importedClasses; this.pkg = pkg; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PackageAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PackageAVM2Item.java index 5a69d0668..65e16378d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PackageAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PackageAVM2Item.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.avm2.parser.script; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -34,11 +35,11 @@ public class PackageAVM2Item extends AVM2Item { public String packageName; - public List importedClasses = new ArrayList<>(); + public List importedClasses = new ArrayList<>(); public int publicNs = 0; - public PackageAVM2Item(int publicNs, List importedClasses, String packageName, List items) { + public PackageAVM2Item(int publicNs, List importedClasses, String packageName, List items) { super(null, NOPRECEDENCE); this.publicNs = publicNs; this.importedClasses = importedClasses; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index 9bff7d6f7..96c238524 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -44,6 +44,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; @@ -115,7 +116,7 @@ public class PropertyAVM2Item extends AssignableAVM2Item { } return new ApplyTypeAVM2Item(null, obj, params); } else { - return new TypeItem(m.getNameWithNamespace(constants, true)); + return new TypeItem(m.getNameWithNamespace(constants)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolGroup.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolGroup.java index e2342d094..7c5cc7b27 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolGroup.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolGroup.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; /** @@ -32,5 +33,6 @@ public enum SymbolGroup { TYPENAME, EOF, //GLOBALFUNC, - GLOBALCONST + GLOBALCONST, + PREPROCESSOR } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java index 6e7b0a173..066fcbf48 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java @@ -205,7 +205,8 @@ public enum SymbolType { XML_INSTRVARTAG_BEGIN(GraphTargetItem.PRECEDENCE_PRIMARY, false), // importedClasses; + public List importedClasses; public List scopeStack = new ArrayList<>(); @@ -128,7 +129,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { */ public void appendName(String name) { - this.name += "." + name; + this.name.parts.add(name); } public void setDefinition(boolean definition) { @@ -150,15 +151,15 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { this.assignedValue = storeValue; } - public String getVariableName() { + public DottedChain getVariableName() { return name; } - public void setVariableName(String name) { + public void setVariableName(DottedChain name) { this.name = name; } - public UnresolvedAVM2Item(List subtypes, List importedClasses, boolean mustBeType, GraphTargetItem type, int line, String name, GraphTargetItem storeValue, List openedNamespaces) { + public UnresolvedAVM2Item(List subtypes, List importedClasses, boolean mustBeType, GraphTargetItem type, int line, DottedChain name, GraphTargetItem storeValue, List openedNamespaces) { super(storeValue); this.name = name; this.assignedValue = storeValue; @@ -264,7 +265,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (resolved != null) { return resolved.toString(); } - return name; + return name.toString(); } @Override @@ -290,14 +291,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { } public GraphTargetItem resolve(GraphTargetItem thisType, List paramTypes, List paramNames, ABC abc, List otherAbcs, List callStack, List variables) throws CompilationException { - List parts = new ArrayList<>(); - if (name.contains(".")) { - String[] partsArr = name.split("\\."); - parts.addAll(Arrays.asList(partsArr)); - } else { - parts.add(name); - } - + List parts = name.parts; if (scopeStack.isEmpty()) { //Everything is multiname property in with command //search for variable @@ -326,13 +320,9 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { } } //Search for types in imported classes - for (String imp : importedClasses) { - String impName = imp; - String impPkg = ""; - if (impName.contains(".")) { - impPkg = impName.substring(0, impName.lastIndexOf('.')); - impName = impName.substring(impName.lastIndexOf('.') + 1); - } + for (DottedChain imp : importedClasses) { + String impName = imp.getLast(); + if (impName.equals(parts.get(0))) { TypeItem ret = new TypeItem(imp); resolved = ret; @@ -354,13 +344,13 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { allAbcs.add(abc); allAbcs.addAll(otherAbcs); for (int i = 0; i < parts.size(); i++) { - String fname = Helper.joinStrings(parts.subList(0, i + 1), "."); + DottedChain fname = new DottedChain(parts.subList(0, i + 1)); //Helper.joinStrings(parts.subList(0, i + 1), "."); for (ABC a : allAbcs) { for (int c = 0; c < a.instance_info.size(); c++) { if (a.instance_info.get(c).deleted) { continue; } - if (a.instance_info.get(c).name_index > 0 && fname.equals(a.instance_info.get(c).getName(a.constants).getNameWithNamespace(a.constants, true))) { + if (a.instance_info.get(c).name_index > 0 && fname.equals(a.instance_info.get(c).getName(a.constants).getNameWithNamespace(a.constants))) { if (!subtypes.isEmpty() && parts.size() > i + 1) { continue; } @@ -400,7 +390,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (!subtypes.isEmpty() && parts.size() > 1) { continue; } - TypeItem ret = new TypeItem(a.instance_info.get(c).getName(a.constants).getNameWithNamespace(a.constants, true)); + TypeItem ret = new TypeItem(a.instance_info.get(c).getName(a.constants).getNameWithNamespace(a.constants)); /*for (String s : subtypes) { UnresolvedAVM2Item su = new UnresolvedAVM2Item(new ArrayList<>(), importedClasses, true, null, line, s, null, openedNamespaces); su.resolve(thisType, paramTypes, paramNames, abc, otherAbcs, callStack, variables); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java index a97943b7d..21aa19a6b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java @@ -97,10 +97,10 @@ public class InstanceInfo { } writer.appendNoHilight(modifiers + objType); - writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, new ArrayList<>()/* No full names here*/, false), HighlightSpecialType.CLASS_NAME); + writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, new ArrayList()/* No full names here*/, false), HighlightSpecialType.CLASS_NAME); if (super_index > 0) { - String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(abc.constants, true); + String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(abc.constants).toPrintableString(); writer.appendNoHilight(" extends "); writer.hilightSpecial(abc.constants.getMultiname(super_index).getName(abc.constants, fullyQualifiedNames, false), HighlightSpecialType.TYPE_NAME, typeName); } @@ -114,7 +114,7 @@ public class InstanceInfo { if (i > 0) { writer.append(", "); } - String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(abc.constants, true); + String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(abc.constants).toPrintableString(); writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(abc.constants, fullyQualifiedNames, false), HighlightSpecialType.TYPE_NAME, typeName); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 47817f2b5..5d4b0e288 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -20,8 +20,11 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ABCInputStream; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorRegisters; +import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorSimple; import com.jpexs.decompiler.flash.abc.avm2.CodeStats; import com.jpexs.decompiler.flash.abc.avm2.UnknownInstructionCode; +import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorJumps; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.configuration.Configuration; @@ -201,6 +204,7 @@ public final class MethodBody implements Cloneable { if (exportMode != ScriptExportMode.AS) { getCode().toASMSource(constants, trait, method_info.get(this.method_info), this, exportMode, writer); } else { + //if (!path.contains("_addGarbageLineMulti")) { if (!Configuration.decompile.get()) { writer.appendNoHilight(Helper.getDecompilationSkippedComment()).newLine(); return; @@ -244,6 +248,7 @@ public final class MethodBody implements Cloneable { if (exportMode != ScriptExportMode.AS) { getCode().toASMSource(constants, trait, method_info.get(this.method_info), this, exportMode, writer); } else { + //if (!path.contains("_addGarbageLineMulti")) { if (!Configuration.decompile.get()) { //writer.startMethod(this.method_info); writer.appendNoHilight(Helper.getDecompilationSkippedComment()).newLine(); @@ -275,17 +280,22 @@ public final class MethodBody implements Cloneable { public MethodBody convertMethodBody(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, Trait trait, AVM2ConstantPool constants, List method_info, ScopeStack scopeStack, boolean isStaticInitializer, List fullyQualifiedNames, Traits initTraits) throws InterruptedException { MethodBody b = clone(); - AVM2Code deobfuscated = b.getCode(); - deobfuscated.markMappedOffsets(); - //deobfuscated.inlineJumpExit(); + b.getCode().markMappedOffsets(); + if (Configuration.autoDeobfuscate.get()) { - try { - deobfuscated.removeTraps(constants, trait, method_info.get(this.method_info), b, abc, scriptIndex, classIndex, isStatic, path); - } catch (StackOverflowError ex) { - logger.log(Level.SEVERE, "Error during remove traps in " + path, ex); + if (Configuration.deobfuscationMode.get() == 0) { + try { + b.getCode().removeTraps(constants, trait, method_info.get(this.method_info), b, abc, scriptIndex, classIndex, isStatic, path); + } catch (Throwable ex) { + logger.log(Level.SEVERE, "Error during old deobfuscation: " + path, ex); + } + } else { + new AVM2DeobfuscatorSimple().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, method_info.get(this.method_info), b); + new AVM2DeobfuscatorRegisters().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, method_info.get(this.method_info), b); + new AVM2DeobfuscatorJumps().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, method_info.get(this.method_info), b); + } } - //deobfuscated.restoreControlFlow(constants, b); return b; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index 5452250a7..2090c8fbd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -49,7 +49,7 @@ public class MethodInfo { } } - public int[] param_types; + public int[] param_types = new int[]{}; public int ret_type; @@ -74,9 +74,9 @@ public class MethodInfo { public int flags; - public ValueKind[] optional; + public ValueKind[] optional = new ValueKind[0]; - public int[] paramNames; + public int[] paramNames = new int[0]; private MethodBody body; @@ -310,7 +310,7 @@ public class MethodInfo { } String ptype = "*"; if (param_types[i] > 0) { - ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(constants, false); + ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(constants).toPrintableString(); } HighlightData pdata = new HighlightData(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index f43b499d1..da15bae78 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -19,7 +19,9 @@ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.types.annotations.Internal; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.Helper; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -288,23 +290,28 @@ public class Multiname { } else { String name = constants.getString(name_index); if (fullyQualifiedNames != null && fullyQualifiedNames.contains(name)) { - return getNameWithNamespace(constants, raw); + DottedChain dc = getNameWithNamespace(constants); + return raw ? dc.toString() : dc.toPrintableString(); } return (isAttribute() ? "@" : "") + (raw ? name : IdentifiersDeobfuscation.printIdentifier(true, name)); } } - public String getNameWithNamespace(AVM2ConstantPool constants, boolean raw) { + public DottedChain getNameWithNamespace(AVM2ConstantPool constants) { StringBuilder ret = new StringBuilder(); Namespace ns = getNamespace(constants); + List chain = new ArrayList<>(); if (ns != null) { - String nsname = ns.getName(constants, raw); + String nsname = ns.getName(constants, true); if (nsname != null && !nsname.isEmpty()) { - ret.append(nsname).append("."); + String parts[] = nsname.split("\\."); + for (String p : parts) { + chain.add(p); + } } } - ret.append(getName(constants, null, raw)); - return ret.toString(); + chain.add(getName(constants, null, true)); + return new DottedChain(chain); } public Namespace getNamespace(AVM2ConstantPool constants) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java index 6a96ba792..42b6e7b63 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java @@ -88,6 +88,9 @@ public class ScriptInfo { } } } + if (ret.size() == 1) { + ret.get(0).isSimple = true; + } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index bc7bd4ed9..9772861ed 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -81,7 +81,8 @@ public abstract class Trait implements Serializable { if (m.namespace_index == -1) { break; } - nsname = abcTag.getABC().nsValueToName(abc.constants.getNamespace(m.namespace_index).getName(abc.constants, true)); + nsname = abcTag.getABC().nsValueToName(abc.constants.getNamespace(m.namespace_index).getName(abc.constants, true)).toString(); + if (nsname == null) { break; } @@ -194,7 +195,7 @@ public abstract class Trait implements Serializable { Multiname name = getName(abc); Namespace ns = name.getNamespace(abc.constants); String packageName = ns.getName(abc.constants, false); - String objectName = name.getName(abc.constants, new ArrayList<>(), false); + String objectName = name.getName(abc.constants, new ArrayList(), false); return new ClassPath(packageName, objectName); //assume not null name } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index ee2659131..be97762cf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ClassPath; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.alchemy.AlchemyTypeIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.construction.NewFunctionIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyStrictIns; @@ -36,6 +37,7 @@ import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.helpers.Helper; import java.util.ArrayList; @@ -89,57 +91,53 @@ public class TraitClass extends Trait implements TraitWithSlot { return "Class " + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata); } - private boolean parseUsagesFromNS(ABC abc, List imports, List uses, int namespace_index, String ignorePackage, String name) { + private boolean parseUsagesFromNS(ABC abc, List imports, List uses, int namespace_index, String ignorePackage, String name) { Namespace ns = abc.constants.getNamespace(namespace_index); if (name.isEmpty()) { name = "*"; } - String newimport = ns.getName(abc.constants, ns.kind == Namespace.KIND_NAMESPACE); + String nsname = ns.getName(abc.constants, ns.kind == Namespace.KIND_NAMESPACE); + DottedChain newimport = nsname == null ? new DottedChain() : new DottedChain(nsname.split("\\.")); /*if ((ns.kind != Namespace.KIND_PACKAGE) && (ns.kind != Namespace.KIND_NAMESPACE) && (ns.kind != Namespace.KIND_STATIC_PROTECTED)) { return false; }*/ /*if (ns.kind == Namespace.KIND_NAMESPACE)*/ { - String oldimport = newimport; - newimport = null; + DottedChain oldimport = newimport; + newimport = new DottedChain(); for (ABCContainerTag abcTag : abc.getAbcTags()) { - String newname = abcTag.getABC().nsValueToName(oldimport); - if (newname.equals("-")) { + DottedChain newname = abcTag.getABC().nsValueToName(oldimport == null ? null : oldimport.toString()); + if (newname.toString().equals("-")) { return true; } - if (!newname.isEmpty()) { + if (!newname.toString().isEmpty()) { newimport = newname; break; } } - if (newimport == null) { + if (newimport.parts.isEmpty()) { newimport = oldimport; - newimport += "." + name; + newimport.parts.add(name); } - if (newimport != null && newimport.isEmpty()) { - newimport = null; + if (!newimport.parts.isEmpty() && newimport.toString().isEmpty()) { + newimport.parts.clear(); } - if (newimport != null) { + if (newimport.parts.isEmpty()) { /* if(ns.kind==Namespace.KIND_PACKAGE){ newimport+=".*"; }*/ if (!imports.contains(newimport)) { - if (newimport.contains(":")) { - return true; - } - String pkg = ""; - if (newimport.contains(".")) { - pkg = newimport.substring(0, newimport.lastIndexOf('.')); - } - String usname = newimport; - if (usname.contains(".")) { - usname = usname.substring(usname.lastIndexOf('.') + 1); - } + //?? + /*if (newimport.contains(":")) { + return true; + }*/ + DottedChain pkg = newimport.getWithoutLast(); + String usname = newimport.getLast(); if (ns.kind == Namespace.KIND_PACKAGE) { if (!pkg.equals(ignorePackage)) { - if (!pkg.equals("__AS3__.vec")) { //Automatic import + if (!pkg.toString().equals("__AS3__.vec")) { //Automatic import imports.add(newimport); } } @@ -161,38 +159,39 @@ public class TraitClass extends Trait implements TraitWithSlot { return false; } - private void parseImportsUsagesFromNS(ABC abc, List imports, List uses, int namespace_index, String ignorePackage, String name) { + private void parseImportsUsagesFromNS(ABC abc, List imports, List uses, int namespace_index, String ignorePackage, String name) { Namespace ns = abc.constants.getNamespace(namespace_index); if (name.isEmpty()) { name = "*"; } - String newimport = ns.getName(abc.constants, false); + String niS = ns.getName(abc.constants, false); + DottedChain newimport = niS == null ? new DottedChain() : new DottedChain(niS.split("\\.")); if (parseUsagesFromNS(abc, imports, uses, namespace_index, ignorePackage, name)) { return; } else if ((ns.kind != Namespace.KIND_PACKAGE) && (ns.kind != Namespace.KIND_PACKAGE_INTERNAL)) { return; } - if (newimport == null) { - newimport = ""; - } - //if (!newimport.equals("")) { - newimport += "." + name; - if (newimport.contains(":")) { - return; + if (newimport.parts.isEmpty()) { + newimport = new DottedChain(""); } + newimport.parts.add(name); + //WUT? + /*if (newimport.contains(":")) { + return; + }*/ if (!imports.contains(newimport)) { - String pkg = newimport.substring(0, newimport.lastIndexOf('.')); - if (pkg.equals("__AS3__.vec")) { //special case - is imported always + DottedChain pkg = newimport.getWithoutLast(); //.substring(0, newimport.lastIndexOf('.')); + if (pkg.toString().equals("__AS3__.vec")) { //special case - is imported always return; } - if (!pkg.equals(ignorePackage)) { + if (!pkg.toString().equals(ignorePackage)) { imports.add(newimport); } } //} } - private void parseUsagesFromMultiname(ABC abc, List imports, List uses, Multiname m, String ignorePackage, List fullyQualifiedNames) { + private void parseUsagesFromMultiname(ABC abc, List imports, List uses, Multiname m, String ignorePackage, List fullyQualifiedNames) { if (m != null) { if (m.kind == Multiname.TYPENAME) { if (m.qname_index != 0) { @@ -223,7 +222,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } } - private void parseImportsUsagesFromMultiname(ABC abc, List imports, List uses, Multiname m, String ignorePackage, List fullyQualifiedNames) { + private void parseImportsUsagesFromMultiname(ABC abc, List imports, List uses, Multiname m, String ignorePackage, List fullyQualifiedNames) { if (m != null) { if (m.kind == Multiname.TYPENAME) { if (m.qname_index != 0) { @@ -250,7 +249,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } } - private void parseImportsUsagesFromMethodInfo(ABC abc, int method_index, List imports, List uses, String ignorePackage, List fullyQualifiedNames, List visitedMethods) { + private void parseImportsUsagesFromMethodInfo(ABC abc, int method_index, List imports, List uses, String ignorePackage, List fullyQualifiedNames, List visitedMethods) { if ((method_index < 0) || (method_index >= abc.method_info.size())) { return; } @@ -270,6 +269,12 @@ public class TraitClass extends Trait implements TraitWithSlot { parseImportsUsagesFromMultiname(abc, imports, uses, abc.constants.getMultiname(ex.type_index), ignorePackage, fullyQualifiedNames); } for (AVM2Instruction ins : body.getCode().code) { + if (ins.definition instanceof AlchemyTypeIns) { + DottedChain nimport = new DottedChain((AlchemyTypeIns.ALCHEMY_PACKAGE + "." + ins.definition.instructionName).split("\\.")); + if (!imports.contains(nimport)) { + imports.add(nimport); + } + } if (ins.definition instanceof NewFunctionIns) { if (ins.operands[0] != method_index) { if (!visitedMethods.contains(ins.operands[0])) { @@ -299,13 +304,13 @@ public class TraitClass extends Trait implements TraitWithSlot { } } - private void parseImportsUsagesFromTraits(ABC abc, Traits ts, List imports, List uses, String ignorePackage, List fullyQualifiedNames) { + private void parseImportsUsagesFromTraits(ABC abc, Traits ts, List imports, List uses, String ignorePackage, List fullyQualifiedNames) { for (Trait t : ts.traits) { parseImportsUsagesFromTrait(abc, t, imports, uses, ignorePackage, fullyQualifiedNames); } } - private void parseImportsUsagesFromTrait(ABC abc, Trait t, List imports, List uses, String ignorePackage, List fullyQualifiedNames) { + private void parseImportsUsagesFromTrait(ABC abc, Trait t, List imports, List uses, String ignorePackage, List fullyQualifiedNames) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; parseImportsUsagesFromMultiname(abc, imports, uses, abc.constants.getMultiname(tm.name_index), ignorePackage, fullyQualifiedNames); @@ -321,7 +326,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } } - private List getImportsUsages(ABC abc, List imports, List uses, List fullyQualifiedNames) { + private List getImportsUsages(ABC abc, List imports, List uses, List fullyQualifiedNames) { //constructor String packageName = abc.instance_info.get(class_info).getName(abc.constants).getNamespace(abc.constants).getName(abc.constants, false); //assume not null name @@ -377,7 +382,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //imports - List imports = new ArrayList<>(); + List imports = new ArrayList<>(); List uses = new ArrayList<>(); getImportsUsages(abc, imports, uses, new ArrayList<>()); @@ -385,20 +390,16 @@ public class TraitClass extends Trait implements TraitWithSlot { List importnames = new ArrayList<>(); importnames.addAll(namesInThisPackage); - for (String ipath : imports) { - String name = ipath; - String pkg = ""; - if (name.contains(".")) { - pkg = name.substring(0, name.lastIndexOf('.')); - name = name.substring(name.lastIndexOf('.') + 1); - } - if (importnames.contains(name) || ((!pkg.isEmpty()) && isBuiltInClass(name))) { + for (DottedChain ipath : imports) { + String name = ipath.getLast(); + DottedChain pkg = ipath.getWithoutLast(); + if (importnames.contains(name) || ((!pkg.toString().isEmpty()) && isBuiltInClass(name))) { fullyQualifiedNames.add(name); } else { importnames.add(name); } } - /*List imports2 = new ArrayList<>(); + /*List imports2 = new ArrayList(); for (String path : imports) { String name = path; String pkg = ""; @@ -414,21 +415,23 @@ public class TraitClass extends Trait implements TraitWithSlot { imports = imports2;*/ for (int i = 0; i < imports.size(); i++) { - String imp = imports.get(i); - String pkg = imp.substring(0, imp.lastIndexOf('.')); - String name = imp.substring(imp.lastIndexOf('.') + 1); + DottedChain imp = imports.get(i); + DottedChain pkg = imp.getWithoutLast(); //imp.substring(0, imp.lastIndexOf('.')); + String name = imp.getLast();//imp.substring(imp.lastIndexOf('.') + 1); if (name.equals("*")) { continue; } - if (imports.contains(pkg + ".*")) { + DottedChain dAll = new DottedChain(pkg.parts); + dAll.parts.add("*"); + if (imports.contains(dAll)) { imports.remove(i); i--; } } boolean hasImport = false; - for (String imp : imports) { - if (!imp.startsWith(".")) { + for (DottedChain imp : imports) { + if (!imp.parts.get(0).isEmpty()) { //No imports from root package writer.appendNoHilight("import " + imp + ";").newLine(); hasImport = true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java index a755f3e8e..56f98f9a9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java @@ -30,6 +30,6 @@ public class ClassNameMultinameUsage extends InsideClassMultinameUsage implement @Override public String toString() { - return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants, false); + return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants).toPrintableString(); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java index ea1c31796..6244374aa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java @@ -36,7 +36,7 @@ public abstract class InsideClassMultinameUsage extends MultinameUsage { @Override public String toString() { - return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants, false); + return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants).toPrintableString(); } public int getMultinameIndex() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 0161958ec..100126c3c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -74,8 +74,9 @@ import com.jpexs.decompiler.graph.model.CommentItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.NotItem; -import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import java.io.ByteArrayOutputStream; @@ -996,9 +997,15 @@ public abstract class Action implements GraphSourceItem { List tryCommands = ActionGraph.translateViaGraph(registerNames, variables, functions, atry.tryBody, version); ActionItem catchName; if (atry.catchInRegisterFlag) { + <<<<<<< HEAD catchName = new DirectValueActionItem(atry, -1, new RegisterNumber(atry.catchRegister), new ArrayList<>()); } else { catchName = new DirectValueActionItem(atry, -1, atry.catchName, new ArrayList<>()); + ======= + catchName = new DirectValueActionItem(atry, -1, new RegisterNumber(atry.catchRegister), new ArrayList()); + } else { + catchName = new DirectValueActionItem(atry, -1, atry.catchName, new ArrayList()); + >>>>>>> v6 } List catchExceptions = new ArrayList(); catchExceptions.add(catchName); @@ -1145,9 +1152,8 @@ public abstract class Action implements GraphSourceItem { className = getWithoutGlobal(nti.value); if (parts.size() >= 1) { int ipos = 0; - while ((parts.get(ipos) instanceof IfItem) - && ((((IfItem) parts.get(ipos)).onTrue.size() == 1) && (((IfItem) parts.get(ipos)).onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ((IfItem) parts.get(ipos)).onTrue.get(0)).value instanceof NewObjectActionItem))) { + while ((parts.get(ipos) instanceof PopItem) || ((parts.get(ipos) instanceof IfItem) && ((((IfItem) parts.get(ipos)).onTrue.size() == 1) && (((IfItem) parts.get(ipos)).onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ((IfItem) parts.get(ipos)).onTrue.get(0)).value instanceof NewObjectActionItem)))) { ipos++; } if (parts.get(ipos) instanceof ExtendsActionItem) { @@ -1256,7 +1262,7 @@ public abstract class Action implements GraphSourceItem { } else { ok = false; } - } else { + } else if (!(t instanceof PopItem)) { prevCount++; //ok = false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index bf1288e03..569bad1a1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -47,11 +47,13 @@ import com.jpexs.decompiler.graph.Loop; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; +import com.jpexs.decompiler.graph.model.PopItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -94,7 +96,6 @@ public class ActionGraph extends Graph { @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData) { - super.finalProcess(list, level, localData); List ret = Action.checkClass(list); if (ret != list) { list.clear(); @@ -120,7 +121,7 @@ public class ActionGraph extends Graph { break; } } else { - target = new DirectValueActionItem(null, 0, st.target, new ArrayList<>()); + target = new DirectValueActionItem(null, 0, st.target, new ArrayList()); targetStart = t; targetStartItem = it; } @@ -157,9 +158,8 @@ public class ActionGraph extends Graph { again = true; } } while (again); - for (int t = 0; t < list.size(); t++) { + for (int t = 1/*not first*/; t < list.size(); t++) { GraphTargetItem it = list.get(t); - if (it instanceof WhileItem) { WhileItem wi = (WhileItem) it; if ((!wi.commands.isEmpty()) && (wi.commands.get(0) instanceof SetTypeActionItem)) { @@ -169,24 +169,26 @@ public class ActionGraph extends Graph { if (ne.rightSide instanceof DirectValueActionItem) { DirectValueActionItem dv = (DirectValueActionItem) ne.rightSide; if (dv.value instanceof Null) { - GraphTargetItem en = ne.leftSide; - if (en instanceof StoreRegisterActionItem) { - en = ((StoreRegisterActionItem) en).value; - } + GraphTargetItem en = list.get(t - 1); if (en instanceof EnumerateActionItem) { EnumerateActionItem eti = (EnumerateActionItem) en; list.remove(t); wi.commands.remove(0); list.add(t, new ForInActionItem(null, wi.loop, sti.getObject(), eti.object, wi.commands)); + list.remove(t - 1); + t--; } } + } } } } } - //detectChained(list, temporaryRegisters); + //Handle for loops at the end: + super.finalProcess(list, level, localData); + } @Override @@ -247,7 +249,7 @@ public class ActionGraph extends Graph { } @Override - protected List check(GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { if (!output.isEmpty()) { if (output.get(output.size() - 1) instanceof StoreRegisterActionItem) { StoreRegisterActionItem str = (StoreRegisterActionItem) output.get(output.size() - 1); @@ -310,7 +312,7 @@ public class ActionGraph extends Graph { List defaultCommands = new ArrayList<>(); List stopPart2 = new ArrayList<>(stopPart); stopPart2.add(defaultPart2); - defaultCommands = printGraph(localData, stack, allParts, null, defaultPart, stopPart2, loops, staticOperation, path); + defaultCommands = printGraph(partCodes, partCodePos, localData, stack, allParts, null, defaultPart, stopPart2, loops, staticOperation, path); List loopContinues = new ArrayList<>(); for (Loop l : loops) { @@ -384,7 +386,7 @@ public class ActionGraph extends Graph { if ((defaultPart != null) && (defaultCommands.isEmpty())) { List stopPart2x = new ArrayList<>(stopPart); stopPart2x.add(next); - defaultCommands = printGraph(localData, stack, allParts, null, defaultPart, stopPart2x, loops, staticOperation, path); + defaultCommands = printGraph(partCodes, partCodePos, localData, stack, allParts, null, defaultPart, stopPart2x, loops, staticOperation, path); } if (!defaultCommands.isEmpty()) { @@ -433,7 +435,7 @@ public class ActionGraph extends Graph { if (breakPart != null) { stopPart2x.add(breakPart); } - cc.addAll(0, printGraph(localData, stack, allParts, null, caseBodies.get(i), stopPart2x, loops, staticOperation, path)); + cc.addAll(0, printGraph(partCodes, partCodePos, localData, stack, allParts, null, caseBodies.get(i), stopPart2x, loops, staticOperation, path)); if (cc.size() >= 2) { if (cc.get(cc.size() - 1) instanceof BreakItem) { if ((cc.get(cc.size() - 2) instanceof ContinueItem) || (cc.get(cc.size() - 2) instanceof BreakItem)) { @@ -452,7 +454,7 @@ public class ActionGraph extends Graph { if (ti != null) { ret.add(ti); } else { - ret.addAll(printGraph(localData, stack, allParts, null, next, stopPart, loops, staticOperation, path)); + ret.addAll(printGraph(partCodes, partCodePos, localData, stack, allParts, null, next, stopPart, loops, staticOperation, path)); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java index 19d962e4b..7f2a6a07a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java @@ -296,7 +296,7 @@ public class ActionListReader { new ArrayList(), new HashMap>(), new ActionLocalData(), - new TranslateStack(), + new TranslateStack(path), new ConstantPool(), actionMap, ip, retMap, ip, endIp, path, new HashMap(), false, @@ -888,10 +888,10 @@ public class ActionListReader { } else if (!(a instanceof GraphSourceItemContainer)) { //return in for..in, TODO:Handle this better way if (((a instanceof ActionEquals) || (a instanceof ActionEquals2)) && (stack.size() == 1) && (stack.peek() instanceof DirectValueActionItem)) { - stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList<>())); + stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); } if ((a instanceof ActionStoreRegister) && stack.isEmpty()) { - stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList<>())); + stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); } a.translate(localData, stack, output, Graph.SOP_USE_STATIC/*Graph.SOP_SKIP_STATIC*/, path); } @@ -930,7 +930,7 @@ public class ActionListReader { } else { localData2 = localData; } - deobfustaceActionListAtPosRecursive(listeners, output2, containers, localData2, new TranslateStack(), cpool, actions, (int) endAddr, ret, startIp, (int) (endAddr + size), path + (cntName == null ? "" : "/" + cntName), visited, indeterminate, decisionStates, version, recursionLevel + 1, maxRecursionLevel); + deobfustaceActionListAtPosRecursive(listeners, output2, containers, localData2, new TranslateStack(path), cpool, actions, (int) endAddr, ret, startIp, (int) (endAddr + size), path + (cntName == null ? "" : "/" + cntName), visited, indeterminate, decisionStates, version, recursionLevel + 1, maxRecursionLevel); output2s.add(output2); endAddr += size; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java index 5db58dbd6..06e412127 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java @@ -231,7 +231,7 @@ public class ActionDeobfuscator extends ActionDeobfuscatorSimple { private void executeActions(ActionList actions, int idx, int endIdx, ActionConstantPool constantPool, ExecutionResult result, Map fakeFunctions) { List output = new ArrayList<>(); ActionLocalData localData = new ActionLocalData(); - FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack(); + FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack(""); int instructionsProcessed = 0; ActionConstantPool lastConstantPool = null; @@ -450,7 +450,7 @@ public class ActionDeobfuscator extends ActionDeobfuscatorSimple { public Set defines = new HashSet<>(); - public TranslateStack stack = new TranslateStack(); + public TranslateStack stack = new TranslateStack("?"); public Object resultValue; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimple.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimple.java index 2bea33d89..6b90466f7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimple.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimple.java @@ -273,7 +273,7 @@ public class ActionDeobfuscatorSimple implements SWFDecompilerListener { private void executeActions(ActionList actions, int idx, int endIdx, ExecutionResult result) { List output = new ArrayList<>(); ActionLocalData localData = new ActionLocalData(); - FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack(); + FixItemCounterTranslateStack stack = new FixItemCounterTranslateStack(""); int instructionsProcessed = 0; try { @@ -388,7 +388,7 @@ public class ActionDeobfuscatorSimple implements SWFDecompilerListener { public int instructionsProcessed = -1; - public TranslateStack stack = new TranslateStack(); + public TranslateStack stack = new TranslateStack("?"); public Object resultValue; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/FixItemCounterTranslateStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/FixItemCounterTranslateStack.java index 133476812..677710042 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/FixItemCounterTranslateStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/FixItemCounterTranslateStack.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.deobfuscation; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -26,6 +27,10 @@ public class FixItemCounterTranslateStack extends TranslateStack { private int fixItemCount = Integer.MAX_VALUE; + public FixItemCounterTranslateStack(String path) { + super(null); //null path => do not add PushItems + } + @Override public GraphTargetItem pop() { GraphTargetItem result = super.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java index 8536e4da7..4dc97afc0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Helper; @@ -34,7 +35,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; -public class DirectValueActionItem extends ActionItem { +public class DirectValueActionItem extends ActionItem implements SimpleValue { public Object value; @@ -91,6 +92,11 @@ public class DirectValueActionItem extends ActionItem { return value; } + @Override + public boolean isSimpleValue() { + return !(value instanceof RegisterNumber); + } + @Override public String toStringNoQuotes(LocalData localData) { if (value instanceof Double) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java index 99809b9aa..e286e5053 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/EnumerateActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; @@ -41,8 +42,9 @@ public class EnumerateActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("enumerate "); - return object.toString(writer, localData); + writer.append("§§enumerate("); + object.toString(writer, localData); + return writer.append(")"); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/EqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/EqActionItem.java index 1508f005f..4408950b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/EqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/EqActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -48,7 +49,7 @@ public class EqActionItem extends BinaryOpItem implements LogicalOpItem { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new NeqActionItem(src, leftSide, rightSide, version2); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GeActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GeActionItem.java index 30bb365a3..c33f6375f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GeActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GeActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -58,7 +59,7 @@ public class GeActionItem extends BinaryOpItem implements LogicalOpItem, Inverte } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new LtActionItem(src, leftSide, rightSide, version2); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GtActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GtActionItem.java index 7cb210db6..29b3a6528 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GtActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/GtActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -42,7 +43,7 @@ public class GtActionItem extends BinaryOpItem implements LogicalOpItem { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new LeActionItem(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/Inverted.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/Inverted.java index 834c918ec..df7e5ac6e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/Inverted.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/Inverted.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.operations; +import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; /** @@ -23,5 +25,5 @@ import com.jpexs.decompiler.graph.GraphTargetItem; */ public interface Inverted { - public GraphTargetItem invert(); + public GraphTargetItem invert(GraphSourceItem src); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LeActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LeActionItem.java index 9cbeb028a..76ef25950 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LeActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LeActionItem.java @@ -50,7 +50,7 @@ public class LeActionItem extends BinaryOpItem implements LogicalOpItem, Inverte } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new GtActionItem(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LtActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LtActionItem.java index 87f51504d..9d4b8c702 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LtActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/LtActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.operations; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -50,7 +51,7 @@ public class LtActionItem extends BinaryOpItem implements LogicalOpItem { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem neqSrc) { return new GeActionItem(src, leftSide, rightSide, version2); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java index 463efa58a..2b2a31bfd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/NeqActionItem.java @@ -49,7 +49,7 @@ public class NeqActionItem extends BinaryOpItem implements LogicalOpItem, Invert } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new EqActionItem(src, leftSide, rightSide, version2); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictEqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictEqActionItem.java index 91ab8b2cc..c25133620 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictEqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictEqActionItem.java @@ -42,7 +42,7 @@ public class StrictEqActionItem extends BinaryOpItem implements LogicalOpItem, I } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StrictNeqActionItem(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java index f7331a689..47f6986da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StrictNeqActionItem.java @@ -43,7 +43,7 @@ public class StrictNeqActionItem extends BinaryOpItem implements LogicalOpItem, } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StrictEqActionItem(src, leftSide, rightSide); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringEqActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringEqActionItem.java index 0b0d9a432..f122b47de 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringEqActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringEqActionItem.java @@ -48,7 +48,7 @@ public class StringEqActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringNeActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGeActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGeActionItem.java index 84c262ffd..dabc07d66 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGeActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGeActionItem.java @@ -49,7 +49,7 @@ public class StringGeActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringLtActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGtActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGtActionItem.java index 941d8d00e..1df7f826a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGtActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringGtActionItem.java @@ -54,7 +54,7 @@ public class StringGtActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringLeActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLeActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLeActionItem.java index 4815f27cd..4f42a55b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLeActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLeActionItem.java @@ -57,7 +57,7 @@ public class StringLeActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringGtActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLtActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLtActionItem.java index f90ac8046..c85bfa334 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLtActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringLtActionItem.java @@ -48,7 +48,7 @@ public class StringLtActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringGeActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringNeActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringNeActionItem.java index f24f2d5da..9027886d3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringNeActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/operations/StringNeActionItem.java @@ -49,7 +49,7 @@ public class StringNeActionItem extends BinaryOpItem implements Inverted { } @Override - public GraphTargetItem invert() { + public GraphTargetItem invert(GraphSourceItem negSrc) { return new StringEqActionItem(src, leftSide, rightSide); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java index 04477c044..12a1d8506 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java @@ -17,1253 +17,1207 @@ * License along with this library. */ package com.jpexs.decompiler.flash.action.parser.script; - import com.jpexs.decompiler.flash.action.parser.ActionParseException; import java.util.ArrayList; import java.util.List; import java.util.Stack; + /** - * This class is a scanner generated by - * JFlex 1.6.0 from the specification file - * D:/Dropbox/Programovani/JavaSE/FFDec/libsrc/ffdec_lib/lexers/actionscript_script.flex + * This class is a scanner generated by + * JFlex 1.6.0 + * from the specification file C:/Dropbox/Programovani/JavaSE/FFDec/libsrc/ffdec_lib/lexers/actionscript_script.flex */ public final class ActionScriptLexer { - /** - * This character denotes the end of file - */ - public static final int YYEOF = -1; + /** This character denotes the end of file */ + public static final int YYEOF = -1; - /** - * initial size of the lookahead buffer - */ - private static final int ZZ_BUFFERSIZE = 16384; + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; - /** - * lexical states - */ - public static final int YYINITIAL = 0; + /** lexical states */ + public static final int YYINITIAL = 0; + public static final int STRING = 2; + public static final int CHARLITERAL = 4; + public static final int XMLSTARTTAG = 6; + public static final int XML = 8; + public static final int OIDENTIFIER = 10; - public static final int STRING = 2; + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 + }; - public static final int CHARLITERAL = 4; + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\7\1\3\1\2\1\121\1\122\1\1\16\7\4\0\1\14\1\110"+ + "\1\16\1\0\1\6\1\117\1\113\1\30\1\100\1\101\1\5\1\115"+ + "\1\107\1\26\1\11\1\4\1\17\3\23\4\24\2\20\1\10\1\106"+ + "\1\12\1\15\1\13\1\112\1\120\1\62\1\22\1\72\1\73\1\25"+ + "\1\64\1\6\1\66\1\77\2\6\1\70\1\71\1\76\1\6\1\75"+ + "\1\67\1\6\1\63\1\65\1\61\1\74\1\6\1\21\2\6\1\104"+ + "\1\27\1\105\1\116\1\6\1\0\1\35\1\32\1\37\1\46\1\34"+ + "\1\47\1\60\1\52\1\44\1\6\1\36\1\50\1\55\1\42\1\41"+ + "\1\53\1\6\1\33\1\40\1\43\1\45\1\56\1\51\1\57\1\54"+ + "\1\6\1\102\1\114\1\103\1\111\6\7\1\123\32\7\2\0\4\6"+ + "\1\0\1\31\2\0\1\6\2\0\1\7\7\0\1\6\4\0\1\6"+ + "\5\0\27\6\1\0\37\6\1\0\u01ca\6\4\0\14\6\16\0\5\6"+ + "\7\0\1\6\1\0\1\6\21\0\160\7\5\6\1\0\2\6\2\0"+ + "\4\6\10\0\1\6\1\0\3\6\1\0\1\6\1\0\24\6\1\0"+ + "\123\6\1\0\213\6\1\0\5\7\2\0\236\6\11\0\46\6\2\0"+ + "\1\6\7\0\47\6\7\0\1\6\1\0\55\7\1\0\1\7\1\0"+ + "\2\7\1\0\2\7\1\0\1\7\10\0\33\6\5\0\3\6\15\0"+ + "\5\7\6\0\1\6\4\0\13\7\5\0\53\6\37\7\4\0\2\6"+ + "\1\7\143\6\1\0\1\6\10\7\1\0\6\7\2\6\2\7\1\0"+ + "\4\7\2\6\12\7\3\6\2\0\1\6\17\0\1\7\1\6\1\7"+ + "\36\6\33\7\2\0\131\6\13\7\1\6\16\0\12\7\41\6\11\7"+ + "\2\6\4\0\1\6\5\0\26\6\4\7\1\6\11\7\1\6\3\7"+ + "\1\6\5\7\22\0\31\6\3\7\104\0\1\6\1\0\13\6\67\0"+ + "\33\7\1\0\4\7\66\6\3\7\1\6\22\7\1\6\7\7\12\6"+ + "\2\7\2\0\12\7\1\0\7\6\1\0\7\6\1\0\3\7\1\0"+ + "\10\6\2\0\2\6\2\0\26\6\1\0\7\6\1\0\1\6\3\0"+ + "\4\6\2\0\1\7\1\6\7\7\2\0\2\7\2\0\3\7\1\6"+ + "\10\0\1\7\4\0\2\6\1\0\3\6\2\7\2\0\12\7\4\6"+ + "\7\0\1\6\5\0\3\7\1\0\6\6\4\0\2\6\2\0\26\6"+ + "\1\0\7\6\1\0\2\6\1\0\2\6\1\0\2\6\2\0\1\7"+ + "\1\0\5\7\4\0\2\7\2\0\3\7\3\0\1\7\7\0\4\6"+ + "\1\0\1\6\7\0\14\7\3\6\1\7\13\0\3\7\1\0\11\6"+ + "\1\0\3\6\1\0\26\6\1\0\7\6\1\0\2\6\1\0\5\6"+ + "\2\0\1\7\1\6\10\7\1\0\3\7\1\0\3\7\2\0\1\6"+ + "\17\0\2\6\2\7\2\0\12\7\1\0\1\6\17\0\3\7\1\0"+ + "\10\6\2\0\2\6\2\0\26\6\1\0\7\6\1\0\2\6\1\0"+ + "\5\6\2\0\1\7\1\6\7\7\2\0\2\7\2\0\3\7\10\0"+ + "\2\7\4\0\2\6\1\0\3\6\2\7\2\0\12\7\1\0\1\6"+ + "\20\0\1\7\1\6\1\0\6\6\3\0\3\6\1\0\4\6\3\0"+ + "\2\6\1\0\1\6\1\0\2\6\3\0\2\6\3\0\3\6\3\0"+ + "\14\6\4\0\5\7\3\0\3\7\1\0\4\7\2\0\1\6\6\0"+ + "\1\7\16\0\12\7\11\0\1\6\7\0\3\7\1\0\10\6\1\0"+ + "\3\6\1\0\27\6\1\0\12\6\1\0\5\6\3\0\1\6\7\7"+ + "\1\0\3\7\1\0\4\7\7\0\2\7\1\0\2\6\6\0\2\6"+ + "\2\7\2\0\12\7\22\0\2\7\1\0\10\6\1\0\3\6\1\0"+ + "\27\6\1\0\12\6\1\0\5\6\2\0\1\7\1\6\7\7\1\0"+ + "\3\7\1\0\4\7\7\0\2\7\7\0\1\6\1\0\2\6\2\7"+ + "\2\0\12\7\1\0\2\6\17\0\2\7\1\0\10\6\1\0\3\6"+ + "\1\0\51\6\2\0\1\6\7\7\1\0\3\7\1\0\4\7\1\6"+ + "\10\0\1\7\10\0\2\6\2\7\2\0\12\7\12\0\6\6\2\0"+ + "\2\7\1\0\22\6\3\0\30\6\1\0\11\6\1\0\1\6\2\0"+ + "\7\6\3\0\1\7\4\0\6\7\1\0\1\7\1\0\10\7\22\0"+ + "\2\7\15\0\60\6\1\7\2\6\7\7\4\0\10\6\10\7\1\0"+ + "\12\7\47\0\2\6\1\0\1\6\2\0\2\6\1\0\1\6\2\0"+ + "\1\6\6\0\4\6\1\0\7\6\1\0\3\6\1\0\1\6\1\0"+ + "\1\6\2\0\2\6\1\0\4\6\1\7\2\6\6\7\1\0\2\7"+ + "\1\6\2\0\5\6\1\0\1\6\1\0\6\7\2\0\12\7\2\0"+ + "\4\6\40\0\1\6\27\0\2\7\6\0\12\7\13\0\1\7\1\0"+ + "\1\7\1\0\1\7\4\0\2\7\10\6\1\0\44\6\4\0\24\7"+ + "\1\0\2\7\5\6\13\7\1\0\44\7\11\0\1\7\71\0\53\6"+ + "\24\7\1\6\12\7\6\0\6\6\4\7\4\6\3\7\1\6\3\7"+ + "\2\6\7\7\3\6\4\7\15\6\14\7\1\6\17\7\2\0\46\6"+ + "\1\0\1\6\5\0\1\6\2\0\53\6\1\0\u014d\6\1\0\4\6"+ + "\2\0\7\6\1\0\1\6\1\0\4\6\2\0\51\6\1\0\4\6"+ + "\2\0\41\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0\4\6"+ + "\2\0\17\6\1\0\71\6\1\0\4\6\2\0\103\6\2\0\3\7"+ + "\40\0\20\6\20\0\125\6\14\0\u026c\6\2\0\21\6\1\0\32\6"+ + "\5\0\113\6\3\0\3\6\17\0\15\6\1\0\4\6\3\7\13\0"+ + "\22\6\3\7\13\0\22\6\2\7\14\0\15\6\1\0\3\6\1\0"+ + "\2\7\14\0\64\6\40\7\3\0\1\6\3\0\2\6\1\7\2\0"+ + "\12\7\41\0\3\7\2\0\12\7\6\0\130\6\10\0\51\6\1\7"+ + "\1\6\5\0\106\6\12\0\35\6\3\0\14\7\4\0\14\7\12\0"+ + "\12\7\36\6\2\0\5\6\13\0\54\6\4\0\21\7\7\6\2\7"+ + "\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7\1\0\35\7"+ + "\2\0\13\7\6\0\12\7\15\0\1\6\130\0\5\7\57\6\21\7"+ + "\7\6\4\0\12\7\21\0\11\7\14\0\3\7\36\6\15\7\2\6"+ + "\12\7\54\6\16\7\14\0\44\6\24\7\10\0\12\7\3\0\3\6"+ + "\12\7\44\6\122\0\3\7\1\0\25\7\4\6\1\7\4\6\3\7"+ + "\2\6\11\0\300\6\47\7\25\0\4\7\u0116\6\2\0\6\6\2\0"+ + "\46\6\2\0\6\6\2\0\10\6\1\0\1\6\1\0\1\6\1\0"+ + "\1\6\1\0\37\6\2\0\65\6\1\0\7\6\1\0\1\6\3\0"+ + "\3\6\1\0\7\6\3\0\4\6\2\0\6\6\4\0\15\6\5\0"+ + "\3\6\1\0\7\6\16\0\5\7\30\0\1\121\1\121\5\7\20\0"+ + "\2\6\23\0\1\6\13\0\5\7\5\0\6\7\1\0\1\6\15\0"+ + "\1\6\20\0\15\6\3\0\33\6\25\0\15\7\4\0\1\7\3\0"+ + "\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0\1\6\3\0"+ + "\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0\4\6\1\0"+ + "\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0\51\6\u0a77\0"+ + "\57\6\1\0\57\6\1\0\205\6\6\0\4\6\3\7\2\6\14\0"+ + "\46\6\1\0\1\6\5\0\1\6\2\0\70\6\7\0\1\6\17\0"+ + "\1\7\27\6\11\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6"+ + "\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\40\7"+ + "\57\0\1\6\u01d5\0\3\6\31\0\11\6\6\7\1\0\5\6\2\0"+ + "\5\6\4\0\126\6\2\0\2\7\2\0\3\6\1\0\132\6\1\0"+ + "\4\6\5\0\51\6\3\0\136\6\21\0\33\6\65\0\20\6\u0200\0"+ + "\u19b6\6\112\0\u51cd\6\63\0\u048d\6\103\0\56\6\2\0\u010d\6\3\0"+ + "\20\6\12\7\2\6\24\0\57\6\1\7\4\0\12\7\1\0\31\6"+ + "\7\0\1\7\120\6\2\7\45\0\11\6\2\0\147\6\2\0\4\6"+ + "\1\0\4\6\14\0\13\6\115\0\12\6\1\7\3\6\1\7\4\6"+ + "\1\7\27\6\5\7\20\0\1\6\7\0\64\6\14\0\2\7\62\6"+ + "\21\7\13\0\12\7\6\0\22\7\6\6\3\0\1\6\4\0\12\7"+ + "\34\6\10\7\2\0\27\6\15\7\14\0\35\6\3\0\4\7\57\6"+ + "\16\7\16\0\1\6\12\7\46\0\51\6\16\7\11\0\3\6\1\7"+ + "\10\6\2\7\2\0\12\7\6\0\27\6\3\0\1\6\1\7\4\0"+ + "\60\6\1\7\1\6\3\7\2\6\2\7\5\6\2\7\1\6\1\7"+ + "\1\6\30\0\3\6\2\0\13\6\5\7\2\0\3\6\2\7\12\0"+ + "\6\6\2\0\6\6\2\0\6\6\11\0\7\6\1\0\7\6\221\0"+ + "\43\6\10\7\1\0\2\7\2\0\12\7\6\0\u2ba4\6\14\0\27\6"+ + "\4\0\61\6\u2104\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6"+ + "\5\0\1\6\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6"+ + "\1\0\2\6\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6"+ + "\2\0\66\6\50\0\15\6\3\0\20\7\20\0\7\7\14\0\2\6"+ + "\30\0\3\6\31\0\1\6\6\0\5\6\1\0\207\6\2\0\1\7"+ + "\4\0\1\6\13\0\12\7\7\0\32\6\4\0\1\6\1\0\32\6"+ + "\13\0\131\6\3\0\6\6\2\0\6\6\2\0\6\6\2\0\3\6"+ + "\3\0\2\6\3\0\2\6\22\0\3\7\4\0\14\6\1\0\32\6"+ + "\1\0\23\6\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6"+ + "\105\0\65\6\210\0\1\7\202\0\35\6\3\0\61\6\57\0\37\6"+ + "\21\0\33\6\65\0\36\6\2\0\44\6\4\0\10\6\1\0\5\6"+ + "\52\0\236\6\2\0\12\7\u0356\0\6\6\2\0\1\6\1\0\54\6"+ + "\1\0\2\6\3\0\1\6\2\0\27\6\252\0\26\6\12\0\32\6"+ + "\106\0\70\6\6\0\2\6\100\0\1\6\3\7\1\0\2\7\5\0"+ + "\4\7\4\6\1\0\3\6\1\0\33\6\4\0\3\7\4\0\1\7"+ + "\40\0\35\6\203\0\66\6\12\0\26\6\12\0\23\6\215\0\111\6"+ + "\u03b7\0\3\7\65\6\17\7\37\0\12\7\20\0\3\7\55\6\13\7"+ + "\2\0\1\7\22\0\31\6\7\0\12\7\6\0\3\7\44\6\16\7"+ + "\1\0\12\7\100\0\3\7\60\6\16\7\4\6\13\0\12\7\u04a6\0"+ + "\53\6\15\7\10\0\12\7\u0936\0\u036f\6\221\0\143\6\u0b9d\0\u042f\6"+ + "\u33d1\0\u0239\6\u04c7\0\105\6\13\0\1\6\56\7\20\0\4\7\15\6"+ + "\u4060\0\2\6\u2163\0\5\7\3\0\26\7\2\0\7\7\36\0\4\7"+ + "\224\0\3\7\u01bb\0\125\6\1\0\107\6\1\0\2\6\2\0\1\6"+ + "\2\0\2\6\2\0\4\6\1\0\14\6\1\0\1\6\1\0\7\6"+ + "\1\0\101\6\1\0\4\6\2\0\10\6\1\0\7\6\1\0\34\6"+ + "\1\0\4\6\1\0\5\6\1\0\1\6\3\0\7\6\1\0\u0154\6"+ + "\2\0\31\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6"+ + "\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6"+ + "\1\0\10\6\2\0\62\7\u1600\0\4\6\1\0\33\6\1\0\2\6"+ + "\1\0\1\6\2\0\1\6\1\0\12\6\1\0\4\6\1\0\1\6"+ + "\1\0\1\6\6\0\1\6\4\0\1\6\1\0\1\6\1\0\1\6"+ + "\1\0\3\6\1\0\2\6\1\0\1\6\2\0\1\6\1\0\1\6"+ + "\1\0\1\6\1\0\1\6\1\0\1\6\1\0\2\6\1\0\1\6"+ + "\2\0\4\6\1\0\7\6\1\0\4\6\1\0\4\6\1\0\1\6"+ + "\1\0\12\6\1\0\21\6\5\0\3\6\1\0\5\6\1\0\21\6"+ + "\u1144\0\ua6d7\6\51\0\u1035\6\13\0\336\6\u3fe2\0\u021e\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\u05ee\0"+ + "\1\7\36\0\140\7\200\0\360\7\uffff\0\uffff\0\ufe12\0"; - public static final int XMLSTARTTAG = 6; + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - public static final int XML = 8; + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); - public static final int OIDENTIFIER = 10; + private static final String ZZ_ACTION_PACKED_0 = + "\6\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7"+ + "\1\10\1\11\1\12\1\13\1\14\2\15\1\16\1\17"+ + "\1\20\26\6\1\21\1\22\1\23\1\24\1\25\1\26"+ + "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36"+ + "\1\37\1\40\1\41\1\42\2\43\1\44\1\1\1\42"+ + "\1\1\2\45\1\42\1\1\1\46\2\42\2\47\2\42"+ + "\1\1\1\50\1\3\1\0\1\51\1\52\1\53\2\0"+ + "\1\54\1\0\1\55\1\56\1\57\1\60\1\61\1\62"+ + "\1\63\1\54\1\0\2\63\1\0\1\64\1\65\1\0"+ + "\7\6\1\66\11\6\1\67\12\6\1\70\1\71\1\72"+ + "\4\6\1\73\30\6\1\56\1\74\1\75\1\76\1\77"+ + "\1\100\1\101\1\102\1\103\1\104\1\105\1\104\1\106"+ + "\1\107\1\110\1\111\1\112\1\113\1\104\1\114\1\104"+ + "\6\0\1\115\1\116\2\115\2\3\2\0\1\117\3\0"+ + "\1\120\1\0\1\121\1\122\1\123\1\124\2\125\1\63"+ + "\1\54\1\0\1\126\10\6\1\127\5\6\1\130\1\131"+ + "\5\6\1\132\1\6\1\133\5\6\1\134\7\6\1\135"+ + "\2\6\1\136\10\6\1\137\20\6\1\140\1\6\1\141"+ + "\2\6\1\142\2\6\1\143\12\0\1\144\5\0\1\145"+ + "\1\125\1\63\4\6\1\146\1\147\1\150\1\6\1\151"+ + "\1\6\1\152\5\6\1\153\7\6\1\154\1\6\1\155"+ + "\4\6\1\156\22\6\1\157\7\6\1\160\4\6\1\161"+ + "\7\6\1\162\1\0\1\163\1\42\1\0\1\164\12\0"+ + "\1\125\1\63\1\165\4\6\1\166\1\167\1\6\1\170"+ + "\5\6\1\171\5\6\1\172\3\6\1\173\14\6\1\174"+ + "\6\6\1\175\2\6\1\176\3\6\1\177\1\6\1\200"+ + "\10\6\10\0\1\125\1\63\1\201\1\6\1\202\3\6"+ + "\1\203\2\6\1\204\1\205\7\6\1\206\4\6\1\207"+ + "\4\6\1\210\5\6\1\211\10\6\1\212\2\6\1\213"+ + "\3\6\1\214\1\215\1\6\2\0\1\120\1\125\1\63"+ + "\1\6\1\216\5\6\1\217\14\6\1\220\1\6\1\221"+ + "\1\6\1\222\7\6\1\223\1\224\6\6\1\42\1\125"+ + "\1\63\1\6\1\225\2\6\1\226\1\227\6\6\1\230"+ + "\7\6\1\231\5\6\1\232\1\6\1\233\1\234\3\6"+ + "\1\235\1\125\1\63\1\6\1\236\1\6\1\237\1\240"+ + "\4\6\1\241\2\6\1\242\2\6\1\243\1\244\1\6"+ + "\1\245\1\246\5\6\1\125\1\63\2\6\1\247\1\250"+ + "\1\6\1\251\1\6\1\252\6\6\1\253\2\6\1\63"+ + "\4\6\1\254\4\6\1\255\1\256\1\257\1\63\6\6"+ + "\1\260\2\6\1\63\1\6\1\261\1\6\1\262\2\6"+ + "\1\263\1\264\1\63\2\6\1\265\3\6\1\63\1\266"+ + "\4\6\1\63\2\6\1\267\1\270\1\271\1\6\1\272"; - /** - * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l - * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l at the - * beginning of a line l is of the form l = 2*k, k a non negative integer - */ - private static final int ZZ_LEXSTATE[] = { - 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 - }; + private static int [] zzUnpackAction() { + int [] result = new int[707]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED - = "\11\7\1\3\1\2\1\121\1\122\1\1\16\7\4\0\1\14\1\110" - + "\1\16\1\0\1\6\1\117\1\113\1\30\1\100\1\101\1\5\1\115" - + "\1\107\1\26\1\11\1\4\1\17\3\23\4\24\2\20\1\10\1\106" - + "\1\12\1\15\1\13\1\112\1\120\1\62\1\22\1\72\1\73\1\25" - + "\1\64\1\6\1\66\1\77\2\6\1\70\1\71\1\76\1\6\1\75" - + "\1\67\1\6\1\63\1\65\1\61\1\74\1\6\1\21\2\6\1\104" - + "\1\27\1\105\1\116\1\6\1\0\1\35\1\32\1\37\1\46\1\34" - + "\1\47\1\60\1\52\1\44\1\6\1\36\1\50\1\55\1\42\1\41" - + "\1\53\1\6\1\33\1\40\1\43\1\45\1\56\1\51\1\57\1\54" - + "\1\6\1\102\1\114\1\103\1\111\6\7\1\123\32\7\2\0\4\6" - + "\1\0\1\31\2\0\1\6\2\0\1\7\7\0\1\6\4\0\1\6" - + "\5\0\27\6\1\0\37\6\1\0\u01ca\6\4\0\14\6\16\0\5\6" - + "\7\0\1\6\1\0\1\6\21\0\160\7\5\6\1\0\2\6\2\0" - + "\4\6\10\0\1\6\1\0\3\6\1\0\1\6\1\0\24\6\1\0" - + "\123\6\1\0\213\6\1\0\5\7\2\0\236\6\11\0\46\6\2\0" - + "\1\6\7\0\47\6\7\0\1\6\1\0\55\7\1\0\1\7\1\0" - + "\2\7\1\0\2\7\1\0\1\7\10\0\33\6\5\0\3\6\15\0" - + "\5\7\6\0\1\6\4\0\13\7\5\0\53\6\37\7\4\0\2\6" - + "\1\7\143\6\1\0\1\6\10\7\1\0\6\7\2\6\2\7\1\0" - + "\4\7\2\6\12\7\3\6\2\0\1\6\17\0\1\7\1\6\1\7" - + "\36\6\33\7\2\0\131\6\13\7\1\6\16\0\12\7\41\6\11\7" - + "\2\6\4\0\1\6\5\0\26\6\4\7\1\6\11\7\1\6\3\7" - + "\1\6\5\7\22\0\31\6\3\7\104\0\1\6\1\0\13\6\67\0" - + "\33\7\1\0\4\7\66\6\3\7\1\6\22\7\1\6\7\7\12\6" - + "\2\7\2\0\12\7\1\0\7\6\1\0\7\6\1\0\3\7\1\0" - + "\10\6\2\0\2\6\2\0\26\6\1\0\7\6\1\0\1\6\3\0" - + "\4\6\2\0\1\7\1\6\7\7\2\0\2\7\2\0\3\7\1\6" - + "\10\0\1\7\4\0\2\6\1\0\3\6\2\7\2\0\12\7\4\6" - + "\7\0\1\6\5\0\3\7\1\0\6\6\4\0\2\6\2\0\26\6" - + "\1\0\7\6\1\0\2\6\1\0\2\6\1\0\2\6\2\0\1\7" - + "\1\0\5\7\4\0\2\7\2\0\3\7\3\0\1\7\7\0\4\6" - + "\1\0\1\6\7\0\14\7\3\6\1\7\13\0\3\7\1\0\11\6" - + "\1\0\3\6\1\0\26\6\1\0\7\6\1\0\2\6\1\0\5\6" - + "\2\0\1\7\1\6\10\7\1\0\3\7\1\0\3\7\2\0\1\6" - + "\17\0\2\6\2\7\2\0\12\7\1\0\1\6\17\0\3\7\1\0" - + "\10\6\2\0\2\6\2\0\26\6\1\0\7\6\1\0\2\6\1\0" - + "\5\6\2\0\1\7\1\6\7\7\2\0\2\7\2\0\3\7\10\0" - + "\2\7\4\0\2\6\1\0\3\6\2\7\2\0\12\7\1\0\1\6" - + "\20\0\1\7\1\6\1\0\6\6\3\0\3\6\1\0\4\6\3\0" - + "\2\6\1\0\1\6\1\0\2\6\3\0\2\6\3\0\3\6\3\0" - + "\14\6\4\0\5\7\3\0\3\7\1\0\4\7\2\0\1\6\6\0" - + "\1\7\16\0\12\7\11\0\1\6\7\0\3\7\1\0\10\6\1\0" - + "\3\6\1\0\27\6\1\0\12\6\1\0\5\6\3\0\1\6\7\7" - + "\1\0\3\7\1\0\4\7\7\0\2\7\1\0\2\6\6\0\2\6" - + "\2\7\2\0\12\7\22\0\2\7\1\0\10\6\1\0\3\6\1\0" - + "\27\6\1\0\12\6\1\0\5\6\2\0\1\7\1\6\7\7\1\0" - + "\3\7\1\0\4\7\7\0\2\7\7\0\1\6\1\0\2\6\2\7" - + "\2\0\12\7\1\0\2\6\17\0\2\7\1\0\10\6\1\0\3\6" - + "\1\0\51\6\2\0\1\6\7\7\1\0\3\7\1\0\4\7\1\6" - + "\10\0\1\7\10\0\2\6\2\7\2\0\12\7\12\0\6\6\2\0" - + "\2\7\1\0\22\6\3\0\30\6\1\0\11\6\1\0\1\6\2\0" - + "\7\6\3\0\1\7\4\0\6\7\1\0\1\7\1\0\10\7\22\0" - + "\2\7\15\0\60\6\1\7\2\6\7\7\4\0\10\6\10\7\1\0" - + "\12\7\47\0\2\6\1\0\1\6\2\0\2\6\1\0\1\6\2\0" - + "\1\6\6\0\4\6\1\0\7\6\1\0\3\6\1\0\1\6\1\0" - + "\1\6\2\0\2\6\1\0\4\6\1\7\2\6\6\7\1\0\2\7" - + "\1\6\2\0\5\6\1\0\1\6\1\0\6\7\2\0\12\7\2\0" - + "\4\6\40\0\1\6\27\0\2\7\6\0\12\7\13\0\1\7\1\0" - + "\1\7\1\0\1\7\4\0\2\7\10\6\1\0\44\6\4\0\24\7" - + "\1\0\2\7\5\6\13\7\1\0\44\7\11\0\1\7\71\0\53\6" - + "\24\7\1\6\12\7\6\0\6\6\4\7\4\6\3\7\1\6\3\7" - + "\2\6\7\7\3\6\4\7\15\6\14\7\1\6\17\7\2\0\46\6" - + "\1\0\1\6\5\0\1\6\2\0\53\6\1\0\u014d\6\1\0\4\6" - + "\2\0\7\6\1\0\1\6\1\0\4\6\2\0\51\6\1\0\4\6" - + "\2\0\41\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0\4\6" - + "\2\0\17\6\1\0\71\6\1\0\4\6\2\0\103\6\2\0\3\7" - + "\40\0\20\6\20\0\125\6\14\0\u026c\6\2\0\21\6\1\0\32\6" - + "\5\0\113\6\3\0\3\6\17\0\15\6\1\0\4\6\3\7\13\0" - + "\22\6\3\7\13\0\22\6\2\7\14\0\15\6\1\0\3\6\1\0" - + "\2\7\14\0\64\6\40\7\3\0\1\6\3\0\2\6\1\7\2\0" - + "\12\7\41\0\3\7\2\0\12\7\6\0\130\6\10\0\51\6\1\7" - + "\1\6\5\0\106\6\12\0\35\6\3\0\14\7\4\0\14\7\12\0" - + "\12\7\36\6\2\0\5\6\13\0\54\6\4\0\21\7\7\6\2\7" - + "\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7\1\0\35\7" - + "\2\0\13\7\6\0\12\7\15\0\1\6\130\0\5\7\57\6\21\7" - + "\7\6\4\0\12\7\21\0\11\7\14\0\3\7\36\6\15\7\2\6" - + "\12\7\54\6\16\7\14\0\44\6\24\7\10\0\12\7\3\0\3\6" - + "\12\7\44\6\122\0\3\7\1\0\25\7\4\6\1\7\4\6\3\7" - + "\2\6\11\0\300\6\47\7\25\0\4\7\u0116\6\2\0\6\6\2\0" - + "\46\6\2\0\6\6\2\0\10\6\1\0\1\6\1\0\1\6\1\0" - + "\1\6\1\0\37\6\2\0\65\6\1\0\7\6\1\0\1\6\3\0" - + "\3\6\1\0\7\6\3\0\4\6\2\0\6\6\4\0\15\6\5\0" - + "\3\6\1\0\7\6\16\0\5\7\30\0\1\121\1\121\5\7\20\0" - + "\2\6\23\0\1\6\13\0\5\7\5\0\6\7\1\0\1\6\15\0" - + "\1\6\20\0\15\6\3\0\33\6\25\0\15\7\4\0\1\7\3\0" - + "\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0\1\6\3\0" - + "\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0\4\6\1\0" - + "\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0\51\6\u0a77\0" - + "\57\6\1\0\57\6\1\0\205\6\6\0\4\6\3\7\2\6\14\0" - + "\46\6\1\0\1\6\5\0\1\6\2\0\70\6\7\0\1\6\17\0" - + "\1\7\27\6\11\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6" - + "\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\40\7" - + "\57\0\1\6\u01d5\0\3\6\31\0\11\6\6\7\1\0\5\6\2\0" - + "\5\6\4\0\126\6\2\0\2\7\2\0\3\6\1\0\132\6\1\0" - + "\4\6\5\0\51\6\3\0\136\6\21\0\33\6\65\0\20\6\u0200\0" - + "\u19b6\6\112\0\u51cd\6\63\0\u048d\6\103\0\56\6\2\0\u010d\6\3\0" - + "\20\6\12\7\2\6\24\0\57\6\1\7\4\0\12\7\1\0\31\6" - + "\7\0\1\7\120\6\2\7\45\0\11\6\2\0\147\6\2\0\4\6" - + "\1\0\4\6\14\0\13\6\115\0\12\6\1\7\3\6\1\7\4\6" - + "\1\7\27\6\5\7\20\0\1\6\7\0\64\6\14\0\2\7\62\6" - + "\21\7\13\0\12\7\6\0\22\7\6\6\3\0\1\6\4\0\12\7" - + "\34\6\10\7\2\0\27\6\15\7\14\0\35\6\3\0\4\7\57\6" - + "\16\7\16\0\1\6\12\7\46\0\51\6\16\7\11\0\3\6\1\7" - + "\10\6\2\7\2\0\12\7\6\0\27\6\3\0\1\6\1\7\4\0" - + "\60\6\1\7\1\6\3\7\2\6\2\7\5\6\2\7\1\6\1\7" - + "\1\6\30\0\3\6\2\0\13\6\5\7\2\0\3\6\2\7\12\0" - + "\6\6\2\0\6\6\2\0\6\6\11\0\7\6\1\0\7\6\221\0" - + "\43\6\10\7\1\0\2\7\2\0\12\7\6\0\u2ba4\6\14\0\27\6" - + "\4\0\61\6\u2104\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6" - + "\5\0\1\6\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6" - + "\1\0\2\6\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6" - + "\2\0\66\6\50\0\15\6\3\0\20\7\20\0\7\7\14\0\2\6" - + "\30\0\3\6\31\0\1\6\6\0\5\6\1\0\207\6\2\0\1\7" - + "\4\0\1\6\13\0\12\7\7\0\32\6\4\0\1\6\1\0\32\6" - + "\13\0\131\6\3\0\6\6\2\0\6\6\2\0\6\6\2\0\3\6" - + "\3\0\2\6\3\0\2\6\22\0\3\7\4\0\14\6\1\0\32\6" - + "\1\0\23\6\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6" - + "\105\0\65\6\210\0\1\7\202\0\35\6\3\0\61\6\57\0\37\6" - + "\21\0\33\6\65\0\36\6\2\0\44\6\4\0\10\6\1\0\5\6" - + "\52\0\236\6\2\0\12\7\u0356\0\6\6\2\0\1\6\1\0\54\6" - + "\1\0\2\6\3\0\1\6\2\0\27\6\252\0\26\6\12\0\32\6" - + "\106\0\70\6\6\0\2\6\100\0\1\6\3\7\1\0\2\7\5\0" - + "\4\7\4\6\1\0\3\6\1\0\33\6\4\0\3\7\4\0\1\7" - + "\40\0\35\6\203\0\66\6\12\0\26\6\12\0\23\6\215\0\111\6" - + "\u03b7\0\3\7\65\6\17\7\37\0\12\7\20\0\3\7\55\6\13\7" - + "\2\0\1\7\22\0\31\6\7\0\12\7\6\0\3\7\44\6\16\7" - + "\1\0\12\7\100\0\3\7\60\6\16\7\4\6\13\0\12\7\u04a6\0" - + "\53\6\15\7\10\0\12\7\u0936\0\u036f\6\221\0\143\6\u0b9d\0\u042f\6" - + "\u33d1\0\u0239\6\u04c7\0\105\6\13\0\1\6\56\7\20\0\4\7\15\6" - + "\u4060\0\2\6\u2163\0\5\7\3\0\26\7\2\0\7\7\36\0\4\7" - + "\224\0\3\7\u01bb\0\125\6\1\0\107\6\1\0\2\6\2\0\1\6" - + "\2\0\2\6\2\0\4\6\1\0\14\6\1\0\1\6\1\0\7\6" - + "\1\0\101\6\1\0\4\6\2\0\10\6\1\0\7\6\1\0\34\6" - + "\1\0\4\6\1\0\5\6\1\0\1\6\3\0\7\6\1\0\u0154\6" - + "\2\0\31\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6" - + "\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6" - + "\1\0\10\6\2\0\62\7\u1600\0\4\6\1\0\33\6\1\0\2\6" - + "\1\0\1\6\2\0\1\6\1\0\12\6\1\0\4\6\1\0\1\6" - + "\1\0\1\6\6\0\1\6\4\0\1\6\1\0\1\6\1\0\1\6" - + "\1\0\3\6\1\0\2\6\1\0\1\6\2\0\1\6\1\0\1\6" - + "\1\0\1\6\1\0\1\6\1\0\1\6\1\0\2\6\1\0\1\6" - + "\2\0\4\6\1\0\7\6\1\0\4\6\1\0\4\6\1\0\1\6" - + "\1\0\12\6\1\0\21\6\5\0\3\6\1\0\5\6\1\0\21\6" - + "\u1144\0\ua6d7\6\51\0\u1035\6\13\0\336\6\u3fe2\0\u021e\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\u05ee\0" - + "\1\7\36\0\140\7\200\0\360\7\uffff\0\uffff\0\ufe12\0"; - - /** - * Translates characters to character classes - */ - private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int[] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 - = "\6\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7" - + "\1\10\1\11\1\12\1\13\1\14\2\15\1\16\1\17" - + "\1\20\26\6\1\21\1\22\1\23\1\24\1\25\1\26" - + "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36" - + "\1\37\1\40\1\41\1\42\2\43\1\44\1\1\1\42" - + "\1\1\2\45\1\42\1\1\1\46\2\42\2\47\2\42" - + "\1\1\1\50\1\3\1\0\1\51\1\52\1\53\2\0" - + "\1\54\1\0\1\55\1\56\1\57\1\60\1\61\1\62" - + "\1\63\1\54\1\0\2\63\1\0\1\64\1\65\7\6" - + "\1\66\11\6\1\67\12\6\1\70\1\71\1\72\4\6" - + "\1\73\30\6\1\56\1\74\1\75\1\76\1\77\1\100" - + "\1\101\1\102\1\103\1\104\1\105\1\104\1\106\1\107" - + "\1\110\1\111\1\112\1\113\1\104\1\114\1\104\6\0" - + "\1\115\1\116\2\115\2\3\2\0\1\117\3\0\1\120" - + "\1\0\1\121\1\122\1\123\1\124\2\125\1\63\1\54" - + "\1\0\10\6\1\126\5\6\1\127\1\130\5\6\1\131" - + "\1\6\1\132\5\6\1\133\7\6\1\134\2\6\1\135" - + "\10\6\1\136\20\6\1\137\1\6\1\140\2\6\1\141" - + "\2\6\1\142\12\0\1\143\5\0\1\144\1\125\1\63" - + "\4\6\1\145\1\146\1\147\1\6\1\150\1\6\1\151" - + "\5\6\1\152\7\6\1\153\1\6\1\154\4\6\1\155" - + "\22\6\1\156\7\6\1\157\4\6\1\160\7\6\1\161" - + "\1\0\1\162\1\42\1\0\1\163\12\0\1\125\1\63" - + "\1\164\4\6\1\165\1\166\1\6\1\167\5\6\1\170" - + "\5\6\1\171\3\6\1\172\14\6\1\173\6\6\1\174" - + "\2\6\1\175\3\6\1\176\1\6\1\177\10\6\10\0" - + "\1\125\1\63\1\200\1\6\1\201\3\6\1\202\2\6" - + "\1\203\1\204\7\6\1\205\4\6\1\206\4\6\1\207" - + "\5\6\1\210\10\6\1\211\2\6\1\212\3\6\1\213" - + "\1\214\1\6\2\0\1\120\1\125\1\63\1\6\1\215" - + "\5\6\1\216\14\6\1\217\1\6\1\220\1\6\1\221" - + "\7\6\1\222\1\223\6\6\1\42\1\125\1\63\1\6" - + "\1\224\2\6\1\225\1\226\6\6\1\227\7\6\1\230" - + "\5\6\1\231\1\6\1\232\1\233\3\6\1\234\1\125" - + "\1\63\1\6\1\235\1\6\1\236\1\237\4\6\1\240" - + "\2\6\1\241\2\6\1\242\1\243\1\6\1\244\1\245" - + "\5\6\1\125\1\63\2\6\1\246\1\247\1\6\1\250" - + "\1\6\1\251\6\6\1\252\2\6\1\63\4\6\1\253" - + "\4\6\1\254\1\255\1\256\1\63\6\6\1\257\2\6" - + "\1\63\1\6\1\260\1\6\1\261\2\6\1\262\1\263" - + "\1\63\2\6\1\264\3\6\1\63\1\265\4\6\1\63" - + "\2\6\1\266\1\267\1\270\1\6\1\271"; - - private static int[] zzUnpackAction() { - int[] result = new int[705]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); } + return j; + } - private static int zzUnpackAction(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do { - result[j++] = value; - } while (--count > 0); - } - return j; + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\124\0\250\0\374\0\u0150\0\u01a4\0\u01f8\0\u024c"+ + "\0\u01f8\0\u02a0\0\u02f4\0\u0348\0\u039c\0\u03f0\0\u0444\0\u0498"+ + "\0\u04ec\0\u0540\0\u01f8\0\u0594\0\u05e8\0\u063c\0\u01f8\0\u0690"+ + "\0\u06e4\0\u0738\0\u078c\0\u07e0\0\u0834\0\u0888\0\u08dc\0\u0930"+ + "\0\u0984\0\u09d8\0\u0a2c\0\u0a80\0\u0ad4\0\u0b28\0\u0b7c\0\u0bd0"+ + "\0\u0c24\0\u0c78\0\u0ccc\0\u0d20\0\u0d74\0\u0dc8\0\u01f8\0\u01f8"+ + "\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u0e1c\0\u01f8"+ + "\0\u01f8\0\u0e70\0\u0ec4\0\u0f18\0\u0f6c\0\u0fc0\0\u01f8\0\u1014"+ + "\0\u1068\0\u01f8\0\u01f8\0\u10bc\0\u1110\0\u1164\0\u11b8\0\u01f8"+ + "\0\u120c\0\u1260\0\u01f8\0\u12b4\0\u01f8\0\u1308\0\u01f8\0\u135c"+ + "\0\u13b0\0\u1404\0\u01f8\0\u1458\0\u14ac\0\u01f8\0\u01f8\0\u01f8"+ + "\0\u1500\0\u1554\0\u15a8\0\u15fc\0\u1650\0\u01f8\0\u01f8\0\u16a4"+ + "\0\u01f8\0\u16f8\0\u174c\0\u17a0\0\u17f4\0\u1848\0\u189c\0\u18f0"+ + "\0\u01f8\0\u01f8\0\u1944\0\u1998\0\u19ec\0\u1a40\0\u1a94\0\u1ae8"+ + "\0\u1b3c\0\u1b90\0\u039c\0\u1be4\0\u1c38\0\u1c8c\0\u1ce0\0\u1d34"+ + "\0\u1d88\0\u1ddc\0\u1e30\0\u1e84\0\u1ed8\0\u1f2c\0\u1f80\0\u1fd4"+ + "\0\u2028\0\u207c\0\u20d0\0\u2124\0\u2178\0\u21cc\0\u2220\0\u039c"+ + "\0\u2274\0\u22c8\0\u231c\0\u2370\0\u23c4\0\u2418\0\u039c\0\u246c"+ + "\0\u24c0\0\u2514\0\u2568\0\u25bc\0\u2610\0\u2664\0\u26b8\0\u270c"+ + "\0\u2760\0\u27b4\0\u2808\0\u285c\0\u28b0\0\u2904\0\u2958\0\u29ac"+ + "\0\u2a00\0\u2a54\0\u2aa8\0\u2afc\0\u2b50\0\u2ba4\0\u2bf8\0\u2c4c"+ + "\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8"+ + "\0\u01f8\0\u01f8\0\u2ca0\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8"+ + "\0\u01f8\0\u2cf4\0\u01f8\0\u2d48\0\u1260\0\u2d9c\0\u2df0\0\u2e44"+ + "\0\u2e98\0\u2eec\0\u01f8\0\u01f8\0\u2cf4\0\u2d48\0\u2f40\0\u01f8"+ + "\0\u2f94\0\u2fe8\0\u01f8\0\u303c\0\u3090\0\u30e4\0\u01f8\0\u3138"+ + "\0\u01f8\0\u318c\0\u01f8\0\u01f8\0\u17f4\0\u31e0\0\u3234\0\u3288"+ + "\0\u3288\0\u32dc\0\u3330\0\u3384\0\u33d8\0\u342c\0\u3480\0\u34d4"+ + "\0\u3528\0\u357c\0\u039c\0\u35d0\0\u3624\0\u3678\0\u36cc\0\u3720"+ + "\0\u039c\0\u039c\0\u3774\0\u37c8\0\u381c\0\u3870\0\u38c4\0\u039c"+ + "\0\u3918\0\u396c\0\u39c0\0\u3a14\0\u3a68\0\u3abc\0\u3b10\0\u039c"+ + "\0\u3b64\0\u3bb8\0\u3c0c\0\u3c60\0\u3cb4\0\u3d08\0\u3d5c\0\u3db0"+ + "\0\u3e04\0\u3e58\0\u039c\0\u3eac\0\u3f00\0\u3f54\0\u3fa8\0\u3ffc"+ + "\0\u4050\0\u40a4\0\u40f8\0\u039c\0\u414c\0\u41a0\0\u41f4\0\u4248"+ + "\0\u429c\0\u42f0\0\u4344\0\u4398\0\u43ec\0\u4440\0\u4494\0\u44e8"+ + "\0\u453c\0\u4590\0\u45e4\0\u4638\0\u039c\0\u468c\0\u46e0\0\u4734"+ + "\0\u4788\0\u039c\0\u47dc\0\u4830\0\u01f8\0\u4884\0\u48d8\0\u492c"+ + "\0\u4980\0\u49d4\0\u4a28\0\u4a7c\0\u4ad0\0\u4b24\0\u4b78\0\u01f8"+ + "\0\u4bcc\0\u4c20\0\u4c74\0\u4cc8\0\u4d1c\0\u01f8\0\u4d70\0\u4dc4"+ + "\0\u4e18\0\u4e6c\0\u4ec0\0\u4f14\0\u039c\0\u039c\0\u039c\0\u4f68"+ + "\0\u039c\0\u4fbc\0\u039c\0\u5010\0\u5064\0\u50b8\0\u510c\0\u5160"+ + "\0\u51b4\0\u5208\0\u525c\0\u52b0\0\u5304\0\u5358\0\u53ac\0\u5400"+ + "\0\u039c\0\u5454\0\u039c\0\u54a8\0\u54fc\0\u5550\0\u55a4\0\u039c"+ + "\0\u55f8\0\u564c\0\u56a0\0\u56f4\0\u5748\0\u579c\0\u57f0\0\u5844"+ + "\0\u5898\0\u58ec\0\u5940\0\u5994\0\u59e8\0\u5a3c\0\u5a90\0\u5ae4"+ + "\0\u5b38\0\u5b8c\0\u039c\0\u5be0\0\u5c34\0\u5c88\0\u5cdc\0\u5d30"+ + "\0\u5d84\0\u5dd8\0\u039c\0\u5e2c\0\u5e80\0\u5ed4\0\u5f28\0\u039c"+ + "\0\u5f7c\0\u5fd0\0\u6024\0\u6078\0\u60cc\0\u6120\0\u6174\0\u01f8"+ + "\0\u2d48\0\u01f8\0\u61c8\0\u621c\0\u01f8\0\u6270\0\u62c4\0\u6318"+ + "\0\u636c\0\u63c0\0\u6414\0\u6468\0\u64bc\0\u6510\0\u6564\0\u65b8"+ + "\0\u660c\0\u039c\0\u6660\0\u66b4\0\u6708\0\u675c\0\u039c\0\u039c"+ + "\0\u67b0\0\u039c\0\u6804\0\u6858\0\u68ac\0\u6900\0\u6954\0\u039c"+ + "\0\u69a8\0\u69fc\0\u6a50\0\u6aa4\0\u6af8\0\u039c\0\u6b4c\0\u6ba0"+ + "\0\u6bf4\0\u039c\0\u6c48\0\u6c9c\0\u6cf0\0\u6d44\0\u6d98\0\u6dec"+ + "\0\u6e40\0\u6e94\0\u6ee8\0\u6f3c\0\u6f90\0\u6fe4\0\u039c\0\u7038"+ + "\0\u708c\0\u70e0\0\u7134\0\u7188\0\u71dc\0\u039c\0\u7230\0\u7284"+ + "\0\u72d8\0\u732c\0\u7380\0\u73d4\0\u039c\0\u7428\0\u039c\0\u747c"+ + "\0\u74d0\0\u7524\0\u7578\0\u75cc\0\u7620\0\u7674\0\u76c8\0\u771c"+ + "\0\u7770\0\u77c4\0\u7818\0\u786c\0\u78c0\0\u7914\0\u7968\0\u79bc"+ + "\0\u7a10\0\u039c\0\u7a64\0\u039c\0\u7ab8\0\u7b0c\0\u7b60\0\u039c"+ + "\0\u7bb4\0\u7c08\0\u039c\0\u039c\0\u7c5c\0\u7cb0\0\u7d04\0\u7d58"+ + "\0\u7dac\0\u7e00\0\u7e54\0\u039c\0\u7ea8\0\u7efc\0\u7f50\0\u7fa4"+ + "\0\u039c\0\u7ff8\0\u804c\0\u80a0\0\u80f4\0\u039c\0\u8148\0\u819c"+ + "\0\u81f0\0\u8244\0\u8298\0\u039c\0\u82ec\0\u8340\0\u8394\0\u83e8"+ + "\0\u843c\0\u8490\0\u84e4\0\u8538\0\u039c\0\u858c\0\u85e0\0\u039c"+ + "\0\u8634\0\u8688\0\u86dc\0\u039c\0\u039c\0\u8730\0\u8784\0\u87d8"+ + "\0\u6468\0\u882c\0\u8880\0\u88d4\0\u039c\0\u8928\0\u897c\0\u89d0"+ + "\0\u8a24\0\u8a78\0\u039c\0\u8acc\0\u8b20\0\u8b74\0\u8bc8\0\u8c1c"+ + "\0\u8c70\0\u8cc4\0\u8d18\0\u8d6c\0\u8dc0\0\u8e14\0\u8e68\0\u039c"+ + "\0\u8ebc\0\u039c\0\u8f10\0\u039c\0\u8f64\0\u8fb8\0\u900c\0\u9060"+ + "\0\u90b4\0\u9108\0\u915c\0\u039c\0\u039c\0\u91b0\0\u9204\0\u9258"+ + "\0\u92ac\0\u9300\0\u9354\0\u77c4\0\u93a8\0\u93fc\0\u9450\0\u039c"+ + "\0\u94a4\0\u94f8\0\u039c\0\u039c\0\u954c\0\u95a0\0\u95f4\0\u9648"+ + "\0\u969c\0\u96f0\0\u039c\0\u9744\0\u9798\0\u97ec\0\u9840\0\u9894"+ + "\0\u98e8\0\u993c\0\u039c\0\u9990\0\u99e4\0\u9a38\0\u9a8c\0\u9ae0"+ + "\0\u039c\0\u9b34\0\u039c\0\u039c\0\u9b88\0\u9bdc\0\u9c30\0\u039c"+ + "\0\u9c84\0\u9cd8\0\u9d2c\0\u039c\0\u9d80\0\u039c\0\u039c\0\u9dd4"+ + "\0\u9e28\0\u9e7c\0\u9ed0\0\u039c\0\u9f24\0\u9f78\0\u039c\0\u9fcc"+ + "\0\ua020\0\u039c\0\ua074\0\ua0c8\0\u039c\0\u039c\0\ua11c\0\ua170"+ + "\0\ua1c4\0\ua218\0\ua26c\0\u01f8\0\ua2c0\0\ua314\0\ua368\0\u039c"+ + "\0\u039c\0\ua3bc\0\u039c\0\ua410\0\u039c\0\ua464\0\ua4b8\0\ua50c"+ + "\0\ua560\0\ua5b4\0\ua608\0\u039c\0\ua65c\0\ua6b0\0\ua704\0\ua758"+ + "\0\ua7ac\0\ua800\0\ua854\0\ua8a8\0\ua8fc\0\ua950\0\ua9a4\0\ua9f8"+ + "\0\u039c\0\u039c\0\u039c\0\uaa4c\0\uaaa0\0\uaaf4\0\uab48\0\uab9c"+ + "\0\uabf0\0\uac44\0\u039c\0\uac98\0\uacec\0\uad40\0\uad94\0\u039c"+ + "\0\uade8\0\u039c\0\uae3c\0\uae90\0\uaee4\0\uaf38\0\uaf8c\0\uafe0"+ + "\0\ub034\0\u039c\0\ub088\0\ub0dc\0\ub130\0\ub184\0\u039c\0\ub1d8"+ + "\0\ub22c\0\ub280\0\ub2d4\0\u17a0\0\ub328\0\ub37c\0\u039c\0\u039c"+ + "\0\u039c\0\ub3d0\0\u039c"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[707]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); } + return j; + } - /** - * Translates a state to a row index in the transition table - */ - private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); - private static final String ZZ_ROWMAP_PACKED_0 - = "\0\0\0\124\0\250\0\374\0\u0150\0\u01a4\0\u01f8\0\u024c" - + "\0\u01f8\0\u02a0\0\u02f4\0\u0348\0\u039c\0\u03f0\0\u0444\0\u0498" - + "\0\u04ec\0\u0540\0\u01f8\0\u0594\0\u05e8\0\u063c\0\u01f8\0\u01f8" - + "\0\u0690\0\u06e4\0\u0738\0\u078c\0\u07e0\0\u0834\0\u0888\0\u08dc" - + "\0\u0930\0\u0984\0\u09d8\0\u0a2c\0\u0a80\0\u0ad4\0\u0b28\0\u0b7c" - + "\0\u0bd0\0\u0c24\0\u0c78\0\u0ccc\0\u0d20\0\u0d74\0\u01f8\0\u01f8" - + "\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u0dc8\0\u01f8" - + "\0\u01f8\0\u0e1c\0\u0e70\0\u0ec4\0\u0f18\0\u0f6c\0\u01f8\0\u0fc0" - + "\0\u1014\0\u01f8\0\u01f8\0\u1068\0\u10bc\0\u1110\0\u1164\0\u01f8" - + "\0\u11b8\0\u120c\0\u01f8\0\u1260\0\u01f8\0\u12b4\0\u01f8\0\u1308" - + "\0\u135c\0\u13b0\0\u01f8\0\u1404\0\u1458\0\u01f8\0\u01f8\0\u01f8" - + "\0\u14ac\0\u1500\0\u1554\0\u15a8\0\u15fc\0\u01f8\0\u01f8\0\u1650" - + "\0\u01f8\0\u16a4\0\u16f8\0\u174c\0\u17a0\0\u17f4\0\u1848\0\u189c" - + "\0\u01f8\0\u01f8\0\u18f0\0\u1944\0\u1998\0\u19ec\0\u1a40\0\u1a94" - + "\0\u1ae8\0\u039c\0\u1b3c\0\u1b90\0\u1be4\0\u1c38\0\u1c8c\0\u1ce0" - + "\0\u1d34\0\u1d88\0\u1ddc\0\u1e30\0\u1e84\0\u1ed8\0\u1f2c\0\u1f80" - + "\0\u1fd4\0\u2028\0\u207c\0\u20d0\0\u2124\0\u2178\0\u039c\0\u21cc" - + "\0\u2220\0\u2274\0\u22c8\0\u231c\0\u2370\0\u039c\0\u23c4\0\u2418" - + "\0\u246c\0\u24c0\0\u2514\0\u2568\0\u25bc\0\u2610\0\u2664\0\u26b8" - + "\0\u270c\0\u2760\0\u27b4\0\u2808\0\u285c\0\u28b0\0\u2904\0\u2958" - + "\0\u29ac\0\u2a00\0\u2a54\0\u2aa8\0\u2afc\0\u2b50\0\u2ba4\0\u01f8" - + "\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8" - + "\0\u01f8\0\u2bf8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8\0\u01f8" - + "\0\u2c4c\0\u01f8\0\u2ca0\0\u120c\0\u2cf4\0\u2d48\0\u2d9c\0\u2df0" - + "\0\u2e44\0\u01f8\0\u01f8\0\u2c4c\0\u2ca0\0\u2e98\0\u01f8\0\u2eec" - + "\0\u2f40\0\u01f8\0\u2f94\0\u2fe8\0\u303c\0\u01f8\0\u3090\0\u01f8" - + "\0\u30e4\0\u01f8\0\u01f8\0\u17a0\0\u3138\0\u318c\0\u31e0\0\u31e0" - + "\0\u3234\0\u3288\0\u32dc\0\u3330\0\u3384\0\u33d8\0\u342c\0\u3480" - + "\0\u039c\0\u34d4\0\u3528\0\u357c\0\u35d0\0\u3624\0\u039c\0\u039c" - + "\0\u3678\0\u36cc\0\u3720\0\u3774\0\u37c8\0\u039c\0\u381c\0\u3870" - + "\0\u38c4\0\u3918\0\u396c\0\u39c0\0\u3a14\0\u039c\0\u3a68\0\u3abc" - + "\0\u3b10\0\u3b64\0\u3bb8\0\u3c0c\0\u3c60\0\u3cb4\0\u3d08\0\u3d5c" - + "\0\u039c\0\u3db0\0\u3e04\0\u3e58\0\u3eac\0\u3f00\0\u3f54\0\u3fa8" - + "\0\u3ffc\0\u039c\0\u4050\0\u40a4\0\u40f8\0\u414c\0\u41a0\0\u41f4" - + "\0\u4248\0\u429c\0\u42f0\0\u4344\0\u4398\0\u43ec\0\u4440\0\u4494" - + "\0\u44e8\0\u453c\0\u039c\0\u4590\0\u45e4\0\u4638\0\u468c\0\u039c" - + "\0\u46e0\0\u4734\0\u01f8\0\u4788\0\u47dc\0\u4830\0\u4884\0\u48d8" - + "\0\u492c\0\u4980\0\u49d4\0\u4a28\0\u4a7c\0\u01f8\0\u4ad0\0\u4b24" - + "\0\u4b78\0\u4bcc\0\u4c20\0\u01f8\0\u4c74\0\u4cc8\0\u4d1c\0\u4d70" - + "\0\u4dc4\0\u4e18\0\u039c\0\u039c\0\u039c\0\u4e6c\0\u039c\0\u4ec0" - + "\0\u039c\0\u4f14\0\u4f68\0\u4fbc\0\u5010\0\u5064\0\u50b8\0\u510c" - + "\0\u5160\0\u51b4\0\u5208\0\u525c\0\u52b0\0\u5304\0\u039c\0\u5358" - + "\0\u039c\0\u53ac\0\u5400\0\u5454\0\u54a8\0\u039c\0\u54fc\0\u5550" - + "\0\u55a4\0\u55f8\0\u564c\0\u56a0\0\u56f4\0\u5748\0\u579c\0\u57f0" - + "\0\u5844\0\u5898\0\u58ec\0\u5940\0\u5994\0\u59e8\0\u5a3c\0\u5a90" - + "\0\u039c\0\u5ae4\0\u5b38\0\u5b8c\0\u5be0\0\u5c34\0\u5c88\0\u5cdc" - + "\0\u039c\0\u5d30\0\u5d84\0\u5dd8\0\u5e2c\0\u039c\0\u5e80\0\u5ed4" - + "\0\u5f28\0\u5f7c\0\u5fd0\0\u6024\0\u6078\0\u01f8\0\u2ca0\0\u01f8" - + "\0\u60cc\0\u6120\0\u01f8\0\u6174\0\u61c8\0\u621c\0\u6270\0\u62c4" - + "\0\u6318\0\u636c\0\u63c0\0\u6414\0\u6468\0\u64bc\0\u6510\0\u039c" - + "\0\u6564\0\u65b8\0\u660c\0\u6660\0\u039c\0\u039c\0\u66b4\0\u039c" - + "\0\u6708\0\u675c\0\u67b0\0\u6804\0\u6858\0\u039c\0\u68ac\0\u6900" - + "\0\u6954\0\u69a8\0\u69fc\0\u039c\0\u6a50\0\u6aa4\0\u6af8\0\u039c" - + "\0\u6b4c\0\u6ba0\0\u6bf4\0\u6c48\0\u6c9c\0\u6cf0\0\u6d44\0\u6d98" - + "\0\u6dec\0\u6e40\0\u6e94\0\u6ee8\0\u039c\0\u6f3c\0\u6f90\0\u6fe4" - + "\0\u7038\0\u708c\0\u70e0\0\u039c\0\u7134\0\u7188\0\u71dc\0\u7230" - + "\0\u7284\0\u72d8\0\u039c\0\u732c\0\u039c\0\u7380\0\u73d4\0\u7428" - + "\0\u747c\0\u74d0\0\u7524\0\u7578\0\u75cc\0\u7620\0\u7674\0\u76c8" - + "\0\u771c\0\u7770\0\u77c4\0\u7818\0\u786c\0\u78c0\0\u7914\0\u039c" - + "\0\u7968\0\u039c\0\u79bc\0\u7a10\0\u7a64\0\u039c\0\u7ab8\0\u7b0c" - + "\0\u039c\0\u039c\0\u7b60\0\u7bb4\0\u7c08\0\u7c5c\0\u7cb0\0\u7d04" - + "\0\u7d58\0\u039c\0\u7dac\0\u7e00\0\u7e54\0\u7ea8\0\u039c\0\u7efc" - + "\0\u7f50\0\u7fa4\0\u7ff8\0\u039c\0\u804c\0\u80a0\0\u80f4\0\u8148" - + "\0\u819c\0\u039c\0\u81f0\0\u8244\0\u8298\0\u82ec\0\u8340\0\u8394" - + "\0\u83e8\0\u843c\0\u039c\0\u8490\0\u84e4\0\u039c\0\u8538\0\u858c" - + "\0\u85e0\0\u039c\0\u039c\0\u8634\0\u8688\0\u86dc\0\u636c\0\u8730" - + "\0\u8784\0\u87d8\0\u039c\0\u882c\0\u8880\0\u88d4\0\u8928\0\u897c" - + "\0\u039c\0\u89d0\0\u8a24\0\u8a78\0\u8acc\0\u8b20\0\u8b74\0\u8bc8" - + "\0\u8c1c\0\u8c70\0\u8cc4\0\u8d18\0\u8d6c\0\u039c\0\u8dc0\0\u039c" - + "\0\u8e14\0\u039c\0\u8e68\0\u8ebc\0\u8f10\0\u8f64\0\u8fb8\0\u900c" - + "\0\u9060\0\u039c\0\u039c\0\u90b4\0\u9108\0\u915c\0\u91b0\0\u9204" - + "\0\u9258\0\u76c8\0\u92ac\0\u9300\0\u9354\0\u039c\0\u93a8\0\u93fc" - + "\0\u039c\0\u039c\0\u9450\0\u94a4\0\u94f8\0\u954c\0\u95a0\0\u95f4" - + "\0\u039c\0\u9648\0\u969c\0\u96f0\0\u9744\0\u9798\0\u97ec\0\u9840" - + "\0\u039c\0\u9894\0\u98e8\0\u993c\0\u9990\0\u99e4\0\u039c\0\u9a38" - + "\0\u039c\0\u039c\0\u9a8c\0\u9ae0\0\u9b34\0\u039c\0\u9b88\0\u9bdc" - + "\0\u9c30\0\u039c\0\u9c84\0\u039c\0\u039c\0\u9cd8\0\u9d2c\0\u9d80" - + "\0\u9dd4\0\u039c\0\u9e28\0\u9e7c\0\u039c\0\u9ed0\0\u9f24\0\u039c" - + "\0\u9f78\0\u9fcc\0\u039c\0\u039c\0\ua020\0\ua074\0\ua0c8\0\ua11c" - + "\0\ua170\0\u01f8\0\ua1c4\0\ua218\0\ua26c\0\u039c\0\u039c\0\ua2c0" - + "\0\u039c\0\ua314\0\u039c\0\ua368\0\ua3bc\0\ua410\0\ua464\0\ua4b8" - + "\0\ua50c\0\u039c\0\ua560\0\ua5b4\0\ua608\0\ua65c\0\ua6b0\0\ua704" - + "\0\ua758\0\ua7ac\0\ua800\0\ua854\0\ua8a8\0\ua8fc\0\u039c\0\u039c" - + "\0\u039c\0\ua950\0\ua9a4\0\ua9f8\0\uaa4c\0\uaaa0\0\uaaf4\0\uab48" - + "\0\u039c\0\uab9c\0\uabf0\0\uac44\0\uac98\0\u039c\0\uacec\0\u039c" - + "\0\uad40\0\uad94\0\uade8\0\uae3c\0\uae90\0\uaee4\0\uaf38\0\u039c" - + "\0\uaf8c\0\uafe0\0\ub034\0\ub088\0\u039c\0\ub0dc\0\ub130\0\ub184" - + "\0\ub1d8\0\u174c\0\ub22c\0\ub280\0\u039c\0\u039c\0\u039c\0\ub2d4" - + "\0\u039c"; + private static final String ZZ_TRANS_PACKED_0 = + "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\7"+ + "\1\16\1\17\1\20\1\21\1\12\1\22\1\23\1\24"+ + "\1\25\2\15\2\25\1\15\1\26\1\7\1\27\1\30"+ + "\1\31\1\32\1\33\1\34\1\15\1\35\1\36\1\37"+ + "\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\47"+ + "\1\15\1\50\1\15\1\51\1\52\1\15\1\53\2\15"+ + "\1\54\12\15\1\55\1\56\1\57\1\60\1\61\1\62"+ + "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\72"+ + "\1\73\1\74\1\75\1\76\1\77\1\7\1\12\1\7"+ + "\1\100\1\101\1\102\13\100\1\103\10\100\1\104\74\100"+ + "\1\105\1\101\1\102\24\105\1\106\1\103\73\105\1\7"+ + "\1\107\1\110\1\111\2\7\1\112\4\7\1\113\1\114"+ + "\4\7\2\112\2\7\1\112\4\7\46\112\22\7\1\111"+ + "\1\7\1\115\1\116\1\117\7\115\1\120\111\115\1\121"+ + "\1\101\1\102\24\121\1\122\1\121\1\123\72\121\126\0"+ + "\1\11\124\0\1\12\10\0\1\12\105\0\1\12\5\0"+ + "\1\124\1\125\7\0\1\126\123\0\1\127\114\0\2\15"+ + "\7\0\7\15\4\0\46\15\23\0\1\15\10\0\1\130"+ + "\124\0\1\131\1\132\4\0\2\133\2\0\2\133\105\0"+ + "\1\134\3\0\1\135\1\136\1\0\1\137\3\0\2\134"+ + "\2\0\1\134\4\0\46\134\37\0\1\140\1\0\1\141"+ + "\123\0\1\142\117\0\1\133\5\0\1\143\1\144\1\145"+ + "\1\0\1\146\1\147\1\150\6\0\1\150\22\0\1\145"+ + "\55\0\1\133\5\0\2\25\2\0\2\25\1\150\6\0"+ + "\1\150\104\0\1\151\10\0\1\152\126\0\1\153\100\0"+ + "\2\15\7\0\7\15\4\0\1\15\1\154\44\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\155"+ + "\1\156\42\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\3\15\1\157\12\15\1\160\5\15\1\161\1\162"+ + "\20\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\6\15\1\163\1\15\1\164\35\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\165\3\15\1\166"+ + "\6\15\1\167\1\15\1\170\25\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\171\6\15\1\172"+ + "\1\15\1\173\3\15\1\174\26\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\15\1\175\22\15\1\176"+ + "\21\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\177\1\200\7\15\1\201\32\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\1\15\1\202\1\203"+ + "\1\204\3\15\1\205\10\15\1\206\1\15\1\207\23\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\6\15"+ + "\1\210\1\15\1\211\4\15\1\212\5\15\1\213\22\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\6\15"+ + "\1\214\1\15\1\215\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\216\4\15\1\217\3\15"+ + "\1\220\6\15\1\221\23\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\3\15\1\222\2\15\1\223\1\224"+ + "\2\15\1\225\1\226\32\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\227\4\15\1\230\36\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15"+ + "\1\231\5\15\1\232\25\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\233\1\15\1\234\7\15"+ + "\1\235\2\15\1\236\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\237\45\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\240\3\15\1\241"+ + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\242\4\15\1\243\36\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\244\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\245"+ + "\7\15\1\246\32\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\10\15\1\247\35\15\23\0\1\15\15\0"+ + "\1\250\123\0\1\251\75\0\1\252\25\0\1\253\76\0"+ + "\1\254\24\0\1\255\77\0\1\256\23\0\1\257\123\0"+ + "\1\260\106\0\1\100\2\0\13\100\1\0\10\100\1\0"+ + "\74\100\2\0\1\102\121\0\1\261\2\0\13\261\1\262"+ + "\1\263\3\261\2\263\2\261\1\264\1\265\1\261\1\266"+ + "\1\267\6\261\1\270\1\271\1\261\1\272\1\261\1\273"+ + "\7\261\1\274\41\261\3\0\1\105\2\0\24\105\2\0"+ + "\73\105\1\261\2\0\13\261\1\262\10\261\1\264\1\265"+ + "\1\261\1\266\1\267\6\261\1\270\1\271\1\261\1\272"+ + "\1\261\1\273\7\261\1\274\41\261\5\0\1\110\124\0"+ + "\1\111\10\0\1\111\105\0\1\111\7\0\2\275\1\276"+ + "\3\0\1\277\1\300\1\0\7\275\4\0\46\275\23\0"+ + "\1\275\3\0\1\111\2\0\1\275\5\0\1\114\4\0"+ + "\2\275\2\0\1\275\4\0\46\275\22\0\1\111\3\0"+ + "\1\117\125\0\1\301\1\0\1\302\12\0\2\302\2\0"+ + "\1\302\4\0\46\302\24\0\1\121\2\0\24\121\1\0"+ + "\1\121\1\0\72\121\1\303\2\0\24\303\1\264\1\303"+ + "\1\304\1\266\1\267\6\303\1\270\1\271\1\303\1\305"+ + "\1\303\1\273\7\303\1\306\41\303\3\0\1\124\1\307"+ + "\1\310\121\124\5\311\1\312\116\311\11\0\1\313\120\0"+ + "\1\314\12\0\2\314\2\0\1\314\4\0\46\314\43\0"+ + "\2\133\2\0\2\133\1\150\6\0\1\150\75\0\1\315"+ + "\1\134\1\316\2\0\1\317\1\320\2\0\2\134\2\315"+ + "\2\134\1\315\4\0\46\315\23\0\1\134\15\0\1\321"+ + "\121\0\1\322\1\0\1\323\123\0\1\324\117\0\1\133"+ + "\5\0\1\143\1\144\2\0\1\146\1\147\1\150\6\0"+ + "\1\150\100\0\1\133\5\0\2\144\2\0\2\144\1\150"+ + "\6\0\1\150\106\0\1\325\1\326\1\0\4\326\4\0"+ + "\1\326\1\0\2\326\1\0\1\326\6\0\2\326\12\0"+ + "\1\326\1\0\1\326\5\0\2\326\41\0\1\133\5\0"+ + "\1\147\1\144\2\0\2\147\1\150\6\0\1\150\100\0"+ + "\1\133\5\0\1\327\1\144\2\0\2\327\1\150\6\0"+ + "\1\150\106\0\2\330\2\0\2\330\1\0\1\331\66\0"+ + "\1\331\14\0\1\332\12\0\2\332\2\0\1\332\4\0"+ + "\46\332\32\0\2\15\7\0\7\15\4\0\2\15\1\333"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\334\11\15\1\335\22\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\10\15\1\336\35\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\5\15\1\337"+ + "\40\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\6\15\1\340\37\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\3\15\1\341\42\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\342\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\343"+ + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\6\15\1\344\2\15\1\345\4\15\1\346\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\347"+ + "\35\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\3\15\1\350\42\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\1\15\1\351\44\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\352\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\353"+ + "\3\15\1\354\36\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\1\355\20\15\1\356\24\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\357\33\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15"+ + "\1\360\31\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\361\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\17\15\1\362\5\15\1\363\20\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15"+ + "\1\364\22\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\16\15\1\365\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\3\15\1\366\7\15\1\367\6\15"+ + "\1\370\23\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\16\15\1\371\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\372\44\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\26\15\1\373\17\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15"+ + "\1\374\10\15\1\375\33\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\21\15\1\376\24\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\6\15\1\377\2\15"+ + "\1\u0100\34\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\32\15\1\u0101\13\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\21\15\1\u0102\24\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u0103\43\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15"+ + "\1\u0104\1\15\1\u0105\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\15\15\1\u0106\1\u0107\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\21\15\1\u0108"+ + "\24\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\10\15\1\u0109\35\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\16\15\1\u010a\27\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\5\15\1\u010b\40\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u010c"+ + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\10\15\1\u010d\35\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\10\15\1\u010e\35\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\10\15\1\u010f\35\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0110"+ + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u0111\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u0112\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u0113\4\15\1\u0114"+ + "\2\15\1\u0115\33\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\5\15\1\u0116\40\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\u0117\45\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\3\15\1\u0118\42\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\5\15"+ + "\1\u0119\1\u011a\1\u011b\6\15\1\u011c\27\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\1\15\1\u011d\44\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15"+ + "\1\u011e\33\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\11\15\1\u011f\34\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\11\15\1\u0120\34\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\1\15\1\u0121\44\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\44\15"+ + "\1\u0122\1\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\23\15\1\u0123\22\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\15\15\1\u0124\30\15\23\0\1\15"+ + "\15\0\1\u0125\125\0\1\u0126\3\0\2\u0126\116\0\2\u0127"+ + "\1\0\4\u0127\4\0\1\u0127\1\0\2\u0127\1\0\1\u0127"+ + "\6\0\2\u0127\12\0\1\u0127\1\0\1\u0127\5\0\2\u0127"+ + "\47\0\2\u0128\1\0\4\u0128\4\0\1\u0128\1\0\2\u0128"+ + "\1\0\1\u0128\6\0\2\u0128\12\0\1\u0128\1\0\1\u0128"+ + "\5\0\2\u0128\36\0\1\u0129\12\0\2\u0129\2\0\1\u0129"+ + "\4\0\46\u0129\40\0\1\277\1\300\122\0\1\300\1\0"+ + "\1\u012a\113\0\1\u012b\12\0\2\u012b\2\0\1\u012b\4\0"+ + "\46\u012b\32\0\1\u012c\1\302\1\u012d\2\0\1\115\1\u012e"+ + "\2\0\2\302\2\u012c\2\302\1\u012c\4\0\46\u012c\23\0"+ + "\1\302\2\0\1\310\121\0\5\311\1\u012f\116\311\4\0"+ + "\1\310\1\312\124\0\2\314\3\0\1\u0130\3\0\7\314"+ + "\4\0\46\314\23\0\1\314\6\0\2\315\1\u0131\2\0"+ + "\1\317\1\u0132\1\u0133\1\0\7\315\4\0\46\315\23\0"+ + "\1\315\6\0\1\u0134\12\0\2\u0134\2\0\1\u0134\4\0"+ + "\46\u0134\32\0\1\u0135\5\0\1\320\4\0\2\u0135\2\0"+ + "\1\u0135\4\0\46\u0135\41\0\1\u0136\125\0\2\u0137\1\0"+ + "\4\u0137\4\0\1\u0137\1\0\2\u0137\1\0\1\u0137\6\0"+ + "\2\u0137\12\0\1\u0137\1\0\1\u0137\5\0\2\u0137\41\0"+ + "\1\133\5\0\1\u0138\1\144\2\0\2\u0138\1\150\6\0"+ + "\1\150\106\0\2\330\2\0\2\330\105\0\2\332\7\0"+ + "\7\332\4\0\46\332\23\0\1\332\6\0\2\15\7\0"+ + "\7\15\4\0\3\15\1\u0139\42\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\13\15\1\u013a\32\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\7\15\1\u013b"+ + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\14\15\1\u013c\31\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\20\15\1\u013d\25\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u013e\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u013f"+ + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u0140\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0141\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\5\15\1\u0142\40\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u0143"+ + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\6\15\1\u0144\2\15\1\u0145\34\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u0146\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u0147"+ + "\7\15\1\u0148\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\21\15\1\u0149\24\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u014a\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u014b"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u014c\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\1\15\1\u014d\44\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\16\15\1\u014e\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u014f"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u0150\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\16\15\1\u0151\27\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\5\15\1\u0152\40\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u0153"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\16\15\1\u0154\27\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\26\15\1\u0155\17\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\26\15\1\u0156\17\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\7\15\1\u0157"+ + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\6\15\1\u0158\37\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0159\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\u015a\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u015b"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\1\15\1\u015c\44\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\7\15\1\u015d\6\15\1\u015e\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u015f"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\7\15\1\u0160\36\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\3\15\1\u0161\42\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u0162\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u0163"+ + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\3\15\1\u0164\42\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\6\15\1\u0165\37\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\7\15\1\u0166\36\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0167"+ + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\5\15\1\u0168\40\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\26\15\1\u0169\17\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\14\15\1\u016a\31\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\20\15\1\u016b"+ + "\25\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\16\15\1\u016c\27\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\24\15\1\u016d\21\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\u016e\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\u016f"+ + "\13\15\1\u0170\21\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\4\15\1\u0171\41\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\16\15\1\u0172\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\22\15\1\u0173"+ + "\23\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\20\15\1\u0174\25\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\13\15\1\u0175\32\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\15\1\u0176\44\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u0177"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\14\15\1\u0178\31\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\27\15\1\u0179\3\15\1\u017a\6\15\1\u017b"+ + "\3\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\7\15\1\u017c\36\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u017d\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\u017e\45\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u017f\33\15"+ + "\23\0\1\15\17\0\1\u0180\3\0\2\u0180\116\0\2\u0181"+ + "\1\0\4\u0181\4\0\1\u0181\1\0\2\u0181\1\0\1\u0181"+ + "\6\0\2\u0181\12\0\1\u0181\1\0\1\u0181\5\0\2\u0181"+ + "\47\0\2\u0182\1\0\4\u0182\4\0\1\u0182\1\0\2\u0182"+ + "\1\0\1\u0182\6\0\2\u0182\12\0\1\u0182\1\0\1\u0182"+ + "\5\0\2\u0182\36\0\2\u0129\4\0\1\277\1\300\1\0"+ + "\7\u0129\4\0\46\u0129\23\0\1\u0129\1\u012a\2\0\13\u012a"+ + "\1\u0183\105\u012a\6\0\2\u012b\1\u0184\2\0\1\u0185\3\0"+ + "\7\u012b\4\0\46\u012b\23\0\1\u012b\6\0\2\u012c\1\u0186"+ + "\2\0\1\115\1\u0187\1\u0188\1\0\7\u012c\4\0\46\u012c"+ + "\23\0\1\u012c\6\0\1\u0189\12\0\2\u0189\2\0\1\u0189"+ + "\4\0\46\u0189\32\0\1\u018a\5\0\1\u012e\4\0\2\u018a"+ + "\2\0\1\u018a\4\0\46\u018a\24\0\4\311\1\310\1\u012f"+ + "\116\311\6\0\1\u018b\12\0\2\u018b\2\0\1\u018b\4\0"+ + "\46\u018b\32\0\1\u0135\5\0\1\u0132\1\u0133\3\0\2\u0135"+ + "\2\0\1\u0135\4\0\46\u0135\40\0\1\u0133\1\0\1\u018c"+ + "\113\0\1\u018d\1\u0134\3\0\1\317\1\320\2\0\2\u0134"+ + "\2\u018d\2\u0134\1\u018d\4\0\46\u018d\23\0\1\u0134\6\0"+ + "\2\u0135\1\u018e\3\0\1\u018f\1\u0133\1\0\7\u0135\4\0"+ + "\46\u0135\23\0\1\u0135\17\0\2\u0190\1\0\4\u0190\4\0"+ + "\1\u0190\1\0\2\u0190\1\0\1\u0190\6\0\2\u0190\12\0"+ + "\1\u0190\1\0\1\u0190\5\0\2\u0190\41\0\1\133\5\0"+ + "\1\u0191\1\144\2\0\2\u0191\1\150\6\0\1\150\75\0"+ + "\2\15\7\0\7\15\4\0\4\15\1\u0192\41\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u0193"+ + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\24\15\1\u0194\21\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\7\15\1\u0195\36\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\10\15\1\u0196\35\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\20\15\1\u0197"+ + "\25\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u0198\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u0199\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u019a\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u019b"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\12\15\1\u019c\33\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\30\15\1\u019d\10\15\1\u019e\4\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u019f"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\1\15\1\u01a0\44\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\5\15\1\u01a1\40\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\15\1\u01a2\44\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\12\15\1\u01a3"+ + "\33\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\32\15\1\u01a4\13\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\6\15\1\u01a5\37\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u01a6\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\33\15\1\u01a7"+ + "\12\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u01a8\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\16\15\1\u01a9\27\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\17\15\1\u01aa\26\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\7\15\1\u01ab"+ + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\3\15\1\u01ac\42\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\1\15\1\u01ad\44\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u01ae\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u01af"+ + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u01b0\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\15\15\1\u01b1\30\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u01b2\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u01b3"+ + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u01b4\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u01b5\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\23\15\1\u01b6\22\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u01b7"+ + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\23\15\1\u01b8\22\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\16\15\1\u01b9\27\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\u01ba\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u01bb"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\37\15\1\u01bc\2\15\1\u01bd\3\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u01be\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\32\15\1\u01bf"+ + "\13\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u01c0\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\11\15\1\u01c1\34\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u01c2\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u01c3"+ + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\12\15\1\u01c4\33\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\1\15\1\u01c5\44\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\1\u01c6\45\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u01c7\31\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15"+ + "\1\u01c8\35\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\1\15\1\u01c9\44\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\12\15\1\u01ca\33\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u01cb\43\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\30\15"+ + "\1\u01cc\15\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u01cd\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u01ce\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\10\15\1\u01cf\35\15"+ + "\23\0\1\15\1\u012a\2\0\11\u012a\1\u0183\1\u012a\1\u0183"+ + "\105\u012a\6\0\1\u01d0\12\0\2\u01d0\2\0\1\u01d0\4\0"+ + "\46\u01d0\32\0\1\u01d1\12\0\2\u01d1\2\0\1\u01d1\4\0"+ + "\46\u01d1\32\0\1\u018a\5\0\1\u0187\1\u0188\3\0\2\u018a"+ + "\2\0\1\u018a\4\0\46\u018a\40\0\1\u0188\1\0\1\u01d2"+ + "\113\0\1\u01d3\1\u0189\3\0\1\115\1\u012e\2\0\2\u0189"+ + "\2\u01d3\2\u0189\1\u01d3\4\0\46\u01d3\23\0\1\u0189\6\0"+ + "\2\u018a\1\u01d4\3\0\1\u01d5\1\u0188\1\0\7\u018a\4\0"+ + "\46\u018a\23\0\1\u018a\6\0\1\u018d\1\u018b\3\0\1\317"+ + "\1\u0132\1\u0133\1\0\2\u018b\2\u018d\2\u018b\1\u018d\4\0"+ + "\46\u018d\23\0\1\u018b\1\u018c\2\0\13\u018c\1\u01d6\105\u018c"+ + "\6\0\2\u018d\1\u018e\2\0\1\317\1\u0132\1\u0133\1\0"+ + "\7\u018d\4\0\46\u018d\23\0\1\u018d\6\0\1\u01d7\12\0"+ + "\2\u01d7\2\0\1\u01d7\4\0\46\u01d7\40\0\1\u018f\1\u0133"+ + "\125\0\2\u01d8\1\0\4\u01d8\4\0\1\u01d8\1\0\2\u01d8"+ + "\1\0\1\u01d8\6\0\2\u01d8\12\0\1\u01d8\1\0\1\u01d8"+ + "\5\0\2\u01d8\41\0\1\133\5\0\1\u01d9\1\144\2\0"+ + "\2\u01d9\1\150\6\0\1\150\75\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u01da\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u01db\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u01dc\22\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15"+ + "\1\u01dd\31\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u01de\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\41\15\1\u01df\4\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\5\15\1\u01e0\40\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15"+ + "\1\u01e1\27\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\1\15\1\u01e2\44\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\u01e3\44\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\20\15\1\u01e4\25\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15"+ + "\1\u01e5\33\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u01e6\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\u01e7\44\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\21\15\1\u01e8\24\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\3\15"+ + "\1\u01e9\42\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\11\15\1\u01ea\34\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u01eb\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\15\15\1\u01ec\30\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15"+ + "\1\u01ed\35\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u01ee\4\15\1\u01ef\30\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u01f0\22\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\11\15"+ + "\1\u01f1\34\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\23\15\1\u01f2\22\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\12\15\1\u01f3\33\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u01f4\31\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15"+ + "\1\u01f5\27\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\u01f6\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\5\15\1\u01f7\40\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u01f8\33\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15"+ + "\1\u01f9\22\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\16\15\1\u01fa\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\12\15\1\u01fb\33\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\20\15\1\u01fc\25\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\7\15"+ + "\1\u01fd\36\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\3\15\1\u01fe\42\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\u01ff\44\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\5\15\1\u0200\40\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\30\15"+ + "\1\u0201\13\15\1\u0202\1\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\11\15\1\u0203\34\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\26\15\1\u0204\17\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\5\15"+ + "\1\u0205\40\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\6\15\1\u0206\37\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\26\15\1\u0207\17\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\16\15\1\u0208\27\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15"+ + "\1\u0209\22\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\1\15\1\u020a\44\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\10\15\1\u020b\35\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\26\15\1\u020c\17\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15"+ + "\1\u020d\44\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\12\15\1\u020e\33\15\23\0\1\15\6\0\2\u01d0"+ + "\3\0\1\u0185\3\0\7\u01d0\4\0\46\u01d0\23\0\1\u01d0"+ + "\6\0\1\u01d3\1\u01d1\3\0\1\115\1\u0187\1\u0188\1\0"+ + "\2\u01d1\2\u01d3\2\u01d1\1\u01d3\4\0\46\u01d3\23\0\1\u01d1"+ + "\1\u01d2\2\0\13\u01d2\1\u020f\105\u01d2\6\0\2\u01d3\1\u01d4"+ + "\2\0\1\115\1\u0187\1\u0188\1\0\7\u01d3\4\0\46\u01d3"+ + "\23\0\1\u01d3\6\0\1\u0210\12\0\2\u0210\2\0\1\u0210"+ + "\4\0\46\u0210\40\0\1\u01d5\1\u0188\106\0\1\u018c\2\0"+ + "\10\u018c\1\u0211\1\u01d6\1\u018c\1\u01d6\105\u018c\6\0\2\u01d7"+ + "\4\0\1\u018f\1\u0133\1\0\7\u01d7\4\0\46\u01d7\23\0"+ + "\1\u01d7\17\0\2\u0212\1\0\4\u0212\4\0\1\u0212\1\0"+ + "\2\u0212\1\0\1\u0212\6\0\2\u0212\12\0\1\u0212\1\0"+ + "\1\u0212\5\0\2\u0212\41\0\1\133\5\0\1\u0213\1\144"+ + "\2\0\2\u0213\1\150\6\0\1\150\75\0\2\15\7\0"+ + "\7\15\4\0\37\15\1\u0214\6\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u0215\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u0216"+ + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\1\15\1\u0217\44\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\16\15\1\u0218\27\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u0219\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u021a"+ + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u021b\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\3\15\1\u021c\42\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u021d\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u021e"+ + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\43\15\1\u021f\2\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\34\15\1\u0220\11\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\5\15\1\u0221\40\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0222"+ + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\3\15\1\u0223\42\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0224\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u0225\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\u0226"+ + "\35\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\37\15\1\u0227\6\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\11\15\1\u0228\34\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u0229\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\5\15\1\u022a"+ + "\40\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\3\15\1\u022b\42\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\22\15\1\u022c\23\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\7\15\1\u022d\36\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\24\15\1\u022e"+ + "\21\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\1\15\1\u022f\44\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\3\15\1\u0230\42\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\u0231\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\u0232"+ + "\37\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\13\15\1\u0233\32\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0234\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\2\15\1\u0235\43\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u0236"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u0237\34\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0238\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u0239\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u023a"+ + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\11\15\1\u023b\34\15\23\0\1\15\1\u01d2\2\0\10\u01d2"+ + "\1\u023c\1\u020f\1\u01d2\1\u020f\105\u01d2\6\0\2\u0210\4\0"+ + "\1\u01d5\1\u0188\1\0\7\u0210\4\0\46\u0210\23\0\1\u0210"+ + "\17\0\2\u023d\1\0\4\u023d\4\0\1\u023d\1\0\2\u023d"+ + "\1\0\1\u023d\6\0\2\u023d\12\0\1\u023d\1\0\1\u023d"+ + "\5\0\2\u023d\41\0\1\133\5\0\1\u023e\1\144\2\0"+ + "\2\u023e\1\150\6\0\1\150\75\0\2\15\7\0\7\15"+ + "\4\0\7\15\1\u023f\36\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u0240\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\3\15\1\u0241\42\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\31\15"+ + "\1\u0242\14\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\26\15\1\u0243\17\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u0244\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u0245\22\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\5\15"+ + "\1\u0246\40\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\26\15\1\u0247\17\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\3\15\1\u0248\42\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u0249\33\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15"+ + "\1\u024a\43\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\16\15\1\u024b\27\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\5\15\1\u024c\40\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\36\15\1\u024d\7\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15"+ + "\1\u024e\35\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\u024f\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\7\15\1\u0250\36\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\11\15\1\u0251\34\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15"+ + "\1\u0252\35\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\10\15\1\u0253\35\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\12\15\1\u0254\33\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u0255\33\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15"+ + "\1\u0256\22\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\u0257\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\3\15\1\u0258\3\15\4\0\46\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u0259\22\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15"+ + "\1\u025a\44\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\20\15\1\u025b\25\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\1\15\1\u025c\44\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u025d\33\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\31\15"+ + "\1\u025e\11\15\1\u025f\2\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\22\15\1\u0260\23\15\23\0\1\15"+ + "\17\0\2\u0261\1\0\4\u0261\4\0\1\u0261\1\0\2\u0261"+ + "\1\0\1\u0261\6\0\2\u0261\12\0\1\u0261\1\0\1\u0261"+ + "\5\0\2\u0261\41\0\1\133\5\0\1\u0262\1\144\2\0"+ + "\2\u0262\1\150\6\0\1\150\75\0\2\15\7\0\7\15"+ + "\4\0\24\15\1\u0263\21\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\26\15\1\u0264\17\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\7\15\1\u0265\36\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15"+ + "\1\u0266\43\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\u0267\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u0268\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\11\15\1\u0269\34\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\26\15"+ + "\1\u026a\17\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\7\15\1\u026b\36\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\2\15\1\u026c\43\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\7\15\1\u026d\36\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\11\15"+ + "\1\u026e\34\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\14\15\1\u026f\31\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\24\15\1\u0270\21\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u0271\43\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15"+ + "\1\u0272\31\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\2\15\1\u0273\43\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\3\15\1\u0274\42\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u0275\43\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15"+ + "\1\u0276\31\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\12\15\1\u0277\33\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\12\15\1\u0278\33\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\7\15\1\u0279\36\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\11\15"+ + "\1\u027a\34\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\16\15\1\u027b\27\15\23\0\1\15\17\0\2\u027c"+ + "\1\0\4\u027c\4\0\1\u027c\1\0\2\u027c\1\0\1\u027c"+ + "\6\0\2\u027c\12\0\1\u027c\1\0\1\u027c\5\0\2\u027c"+ + "\41\0\1\133\5\0\1\u027d\1\144\2\0\2\u027d\1\150"+ + "\6\0\1\150\75\0\2\15\7\0\7\15\4\0\12\15"+ + "\1\u027e\33\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\13\15\1\u027f\32\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\11\15\1\u0280\34\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\20\15\1\u0281\25\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\20\15"+ + "\1\u0282\25\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\15\15\1\u0283\30\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\3\15\1\u0284\42\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\6\15\1\u0285\37\15"+ + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15"+ + "\1\u0286\33\15\23\0\1\15\6\0\2\15\7\0\7\15"+ + "\4\0\37\15\1\u0287\6\15\23\0\1\15\6\0\2\15"+ + "\7\0\7\15\4\0\44\15\1\u0288\1\15\23\0\1\15"+ + "\6\0\2\15\7\0\7\15\4\0\1\u0289\45\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u028a"+ + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\10\15\1\u028b\35\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\10\15\1\u028c\35\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\7\15\1\u028d\36\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u028e"+ + "\42\15\23\0\1\15\11\0\1\133\5\0\1\u028f\1\144"+ + "\2\0\2\u028f\1\150\6\0\1\150\75\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0290\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\10\15\1\u0291\35\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\35\15\1\u0292"+ + "\10\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\14\15\1\u0293\31\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u0294\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\7\15\1\u0295\36\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u0296"+ + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\16\15\1\u0297\27\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\23\15\1\u0298\22\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\26\15\1\u0299\17\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\21\15\1\u029a"+ + "\24\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\22\15\1\u029b\23\15\23\0\1\15\11\0\1\133\5\0"+ + "\1\u029c\1\144\2\0\2\u029c\1\150\6\0\1\150\75\0"+ + "\2\15\7\0\7\15\4\0\40\15\1\u029d\5\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u029e"+ + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\13\15\1\u029f\32\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u02a0\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\44\15\1\u02a1\1\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\24\15\1\u02a2"+ + "\21\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\23\15\1\u02a3\22\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\2\15\1\u02a4\43\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u02a5\42\15\23\0"+ + "\1\15\11\0\1\133\5\0\1\u02a6\1\144\2\0\2\u02a6"+ + "\1\150\6\0\1\150\75\0\2\15\7\0\7\15\4\0"+ + "\16\15\1\u02a7\27\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\6\15\1\u02a8\37\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\3\15\1\u02a9\42\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u02aa"+ + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\13\15\1\u02ab\32\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u02ac\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\6\15\1\u02ad\37\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\21\15\1\u02ae"+ + "\24\15\23\0\1\15\11\0\1\133\5\0\1\u02af\1\144"+ + "\2\0\2\u02af\1\150\6\0\1\150\75\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u02b0\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\16\15\1\u02b1\27\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\23\15\1\u02b2"+ + "\22\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\2\15\1\u02b3\43\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\44\15\1\u02b4\1\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\44\15\1\u02b5\1\15\23\0"+ + "\1\15\11\0\1\133\5\0\1\u02b6\1\144\2\0\2\u02b6"+ + "\1\150\6\0\1\150\75\0\2\15\7\0\7\15\4\0"+ + "\21\15\1\u02b7\24\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\12\15\1\u02b8\33\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\40\15\1\u02b9\5\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u02ba"+ + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\13\15\1\u02bb\32\15\23\0\1\15\11\0\1\133\5\0"+ + "\1\u02bc\1\144\2\0\2\u02bc\1\150\6\0\1\150\75\0"+ + "\2\15\7\0\7\15\4\0\11\15\1\u02bd\34\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u02be"+ + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\23\15\1\u02bf\22\15\23\0\1\15\6\0\2\15\7\0"+ + "\7\15\4\0\23\15\1\u02c0\22\15\23\0\1\15\6\0"+ + "\2\15\7\0\7\15\4\0\22\15\1\u02c1\23\15\23\0"+ + "\1\15\6\0\2\15\7\0\7\15\4\0\12\15\1\u02c2"+ + "\33\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0"+ + "\21\15\1\u02c3\24\15\23\0\1\15"; - private static int[] zzUnpackRowMap() { - int[] result = new int[705]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; + private static int [] zzUnpackTrans() { + int [] result = new int[46116]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); } + return j; + } - private static int zzUnpackRowMap(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; - int l = packed.length(); - while (i < l) { - int high = packed.charAt(i++) << 16; - result[j++] = high | packed.charAt(i++); - } - return j; + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\6\0\1\11\1\1\1\11\11\1\1\11\3\1\1\11"+ + "\27\1\10\11\1\1\2\11\5\1\1\11\2\1\2\11"+ + "\4\1\1\11\2\1\1\11\1\1\1\11\1\1\1\11"+ + "\3\1\1\11\1\1\1\0\3\11\2\0\1\1\1\0"+ + "\1\1\2\11\1\1\1\11\3\1\1\0\2\1\1\0"+ + "\2\11\1\0\75\1\12\11\1\1\6\11\1\1\1\11"+ + "\1\1\6\0\2\11\3\1\1\11\2\0\1\11\3\0"+ + "\1\11\1\0\1\11\1\1\2\11\4\1\1\0\113\1"+ + "\1\11\12\0\1\11\5\0\1\11\111\1\1\11\1\0"+ + "\1\11\1\1\1\0\1\11\12\0\100\1\10\0\67\1"+ + "\2\0\153\1\1\11\107\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[707]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); } + return j; + } - /** - * The transition table of the DFA - */ - private static final int[] ZZ_TRANS = zzUnpackTrans(); + /** the input device */ + private java.io.Reader zzReader; - private static final String ZZ_TRANS_PACKED_0 - = "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\7" - + "\1\16\1\17\1\20\1\21\1\12\1\22\1\23\1\24" - + "\1\25\2\15\2\25\1\15\1\26\1\7\1\27\1\30" - + "\1\31\1\32\1\33\1\34\1\15\1\35\1\36\1\37" - + "\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\47" - + "\1\15\1\50\1\15\1\51\1\52\1\15\1\53\2\15" - + "\1\54\12\15\1\55\1\56\1\57\1\60\1\61\1\62" - + "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\72" - + "\1\73\1\74\1\75\1\76\1\77\1\7\1\12\1\7" - + "\1\100\1\101\1\102\13\100\1\103\10\100\1\104\74\100" - + "\1\105\1\101\1\102\24\105\1\106\1\103\73\105\1\7" - + "\1\107\1\110\1\111\2\7\1\112\4\7\1\113\1\114" - + "\4\7\2\112\2\7\1\112\4\7\46\112\22\7\1\111" - + "\1\7\1\115\1\116\1\117\7\115\1\120\111\115\1\121" - + "\1\101\1\102\24\121\1\122\1\121\1\123\72\121\126\0" - + "\1\11\124\0\1\12\10\0\1\12\105\0\1\12\5\0" - + "\1\124\1\125\7\0\1\126\123\0\1\127\114\0\2\15" - + "\7\0\7\15\4\0\46\15\23\0\1\15\10\0\1\130" - + "\124\0\1\131\1\132\4\0\2\133\2\0\2\133\105\0" - + "\1\134\3\0\1\135\1\136\1\0\1\137\3\0\2\134" - + "\2\0\1\134\4\0\46\134\37\0\1\140\1\0\1\141" - + "\123\0\1\142\117\0\1\133\5\0\1\143\1\144\1\145" - + "\1\0\1\146\1\147\1\150\6\0\1\150\22\0\1\145" - + "\55\0\1\133\5\0\2\25\2\0\2\25\1\150\6\0" - + "\1\150\104\0\1\151\10\0\1\152\103\0\2\15\7\0" - + "\7\15\4\0\1\15\1\153\44\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\154\1\155\42\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\3\15" - + "\1\156\12\15\1\157\5\15\1\160\1\161\20\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\162" - + "\1\15\1\163\35\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\164\3\15\1\165\6\15\1\166" - + "\1\15\1\167\25\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\170\6\15\1\171\1\15\1\172" - + "\3\15\1\173\26\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\15\1\174\22\15\1\175\21\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\176" - + "\1\177\7\15\1\200\32\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\1\15\1\201\1\202\1\203\3\15" - + "\1\204\10\15\1\205\1\15\1\206\23\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\6\15\1\207\1\15" - + "\1\210\4\15\1\211\5\15\1\212\22\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\6\15\1\213\1\15" - + "\1\214\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\215\4\15\1\216\3\15\1\217\6\15" - + "\1\220\23\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\3\15\1\221\2\15\1\222\1\223\2\15\1\224" - + "\1\225\32\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\226\4\15\1\227\36\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\12\15\1\230\5\15" - + "\1\231\25\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\232\1\15\1\233\7\15\1\234\2\15" - + "\1\235\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\236\45\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\237\3\15\1\240\36\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\241" - + "\4\15\1\242\36\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\243\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\244\7\15\1\245" - + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\10\15\1\246\35\15\23\0\1\15\15\0\1\247\123\0" - + "\1\250\75\0\1\251\25\0\1\252\76\0\1\253\24\0" - + "\1\254\77\0\1\255\23\0\1\256\123\0\1\257\106\0" - + "\1\100\2\0\13\100\1\0\10\100\1\0\74\100\2\0" - + "\1\102\121\0\1\260\2\0\13\260\1\261\1\262\3\260" - + "\2\262\2\260\1\263\1\264\1\260\1\265\1\266\6\260" - + "\1\267\1\270\1\260\1\271\1\260\1\272\7\260\1\273" - + "\41\260\3\0\1\105\2\0\24\105\2\0\73\105\1\260" - + "\2\0\13\260\1\261\10\260\1\263\1\264\1\260\1\265" - + "\1\266\6\260\1\267\1\270\1\260\1\271\1\260\1\272" - + "\7\260\1\273\41\260\5\0\1\110\124\0\1\111\10\0" - + "\1\111\105\0\1\111\7\0\2\274\1\275\3\0\1\276" - + "\1\277\1\0\7\274\4\0\46\274\23\0\1\274\3\0" - + "\1\111\2\0\1\274\5\0\1\114\4\0\2\274\2\0" - + "\1\274\4\0\46\274\22\0\1\111\3\0\1\117\125\0" - + "\1\300\1\0\1\301\12\0\2\301\2\0\1\301\4\0" - + "\46\301\24\0\1\121\2\0\24\121\1\0\1\121\1\0" - + "\72\121\1\302\2\0\24\302\1\263\1\302\1\303\1\265" - + "\1\266\6\302\1\267\1\270\1\302\1\304\1\302\1\272" - + "\7\302\1\305\41\302\3\0\1\124\1\306\1\307\121\124" - + "\5\310\1\311\116\310\11\0\1\312\120\0\1\313\12\0" - + "\2\313\2\0\1\313\4\0\46\313\43\0\2\133\2\0" - + "\2\133\1\150\6\0\1\150\75\0\1\314\1\134\1\315" - + "\2\0\1\316\1\317\2\0\2\134\2\314\2\134\1\314" - + "\4\0\46\314\23\0\1\134\15\0\1\320\121\0\1\321" - + "\1\0\1\322\123\0\1\323\117\0\1\133\5\0\1\143" - + "\1\144\2\0\1\146\1\147\1\150\6\0\1\150\100\0" - + "\1\133\5\0\2\144\2\0\2\144\1\150\6\0\1\150" - + "\106\0\1\324\1\325\1\0\4\325\4\0\1\325\1\0" - + "\2\325\1\0\1\325\6\0\2\325\12\0\1\325\1\0" - + "\1\325\5\0\2\325\41\0\1\133\5\0\1\147\1\144" - + "\2\0\2\147\1\150\6\0\1\150\100\0\1\133\5\0" - + "\1\326\1\144\2\0\2\326\1\150\6\0\1\150\106\0" - + "\2\327\2\0\2\327\1\0\1\330\66\0\1\330\14\0" - + "\2\15\7\0\7\15\4\0\2\15\1\331\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\332" - + "\11\15\1\333\22\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\10\15\1\334\35\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\5\15\1\335\40\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\336" - + "\37\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\3\15\1\337\42\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\340\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\14\15\1\341\31\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\342" - + "\2\15\1\343\4\15\1\344\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\10\15\1\345\35\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\346" - + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\1\15\1\347\44\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\350\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\351\3\15\1\352" - + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\1\353\20\15\1\354\24\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\355\33\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\14\15\1\356\31\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\357\43\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\17\15\1\360\5\15\1\361\20\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\23\15\1\362\22\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15" - + "\1\363\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\3\15\1\364\7\15\1\365\6\15\1\366\23\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15" - + "\1\367\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\370\44\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\26\15\1\371\17\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\1\15\1\372\10\15" - + "\1\373\33\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\21\15\1\374\24\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\6\15\1\375\2\15\1\376\34\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\32\15" - + "\1\377\13\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\21\15\1\u0100\24\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\2\15\1\u0101\43\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u0102\1\15" - + "\1\u0103\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\15\15\1\u0104\1\u0105\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\21\15\1\u0106\24\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\u0107" - + "\35\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\16\15\1\u0108\27\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\5\15\1\u0109\40\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\1\15\1\u010a\44\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\u010b" - + "\35\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\10\15\1\u010c\35\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\10\15\1\u010d\35\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\u010e\42\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u010f" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u0110\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u0111\4\15\1\u0112\2\15\1\u0113" - + "\33\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\5\15\1\u0114\40\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\u0115\45\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\3\15\1\u0116\42\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\5\15\1\u0117\1\u0118" - + "\1\u0119\6\15\1\u011a\27\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\1\15\1\u011b\44\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u011c\33\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\11\15" - + "\1\u011d\34\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\11\15\1\u011e\34\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\1\15\1\u011f\44\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\44\15\1\u0120\1\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15" - + "\1\u0121\22\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\15\15\1\u0122\30\15\23\0\1\15\15\0\1\u0123" - + "\125\0\1\u0124\3\0\2\u0124\116\0\2\u0125\1\0\4\u0125" - + "\4\0\1\u0125\1\0\2\u0125\1\0\1\u0125\6\0\2\u0125" - + "\12\0\1\u0125\1\0\1\u0125\5\0\2\u0125\47\0\2\u0126" - + "\1\0\4\u0126\4\0\1\u0126\1\0\2\u0126\1\0\1\u0126" - + "\6\0\2\u0126\12\0\1\u0126\1\0\1\u0126\5\0\2\u0126" - + "\36\0\1\u0127\12\0\2\u0127\2\0\1\u0127\4\0\46\u0127" - + "\40\0\1\276\1\277\122\0\1\277\1\0\1\u0128\113\0" - + "\1\u0129\12\0\2\u0129\2\0\1\u0129\4\0\46\u0129\32\0" - + "\1\u012a\1\301\1\u012b\2\0\1\115\1\u012c\2\0\2\301" - + "\2\u012a\2\301\1\u012a\4\0\46\u012a\23\0\1\301\2\0" - + "\1\307\121\0\5\310\1\u012d\116\310\4\0\1\307\1\311" - + "\124\0\2\313\3\0\1\u012e\3\0\7\313\4\0\46\313" - + "\23\0\1\313\6\0\2\314\1\u012f\2\0\1\316\1\u0130" - + "\1\u0131\1\0\7\314\4\0\46\314\23\0\1\314\6\0" - + "\1\u0132\12\0\2\u0132\2\0\1\u0132\4\0\46\u0132\32\0" - + "\1\u0133\5\0\1\317\4\0\2\u0133\2\0\1\u0133\4\0" - + "\46\u0133\41\0\1\u0134\125\0\2\u0135\1\0\4\u0135\4\0" - + "\1\u0135\1\0\2\u0135\1\0\1\u0135\6\0\2\u0135\12\0" - + "\1\u0135\1\0\1\u0135\5\0\2\u0135\41\0\1\133\5\0" - + "\1\u0136\1\144\2\0\2\u0136\1\150\6\0\1\150\106\0" - + "\2\327\2\0\2\327\105\0\2\15\7\0\7\15\4\0" - + "\3\15\1\u0137\42\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\13\15\1\u0138\32\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\7\15\1\u0139\36\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u013a" - + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\20\15\1\u013b\25\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u013c\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\16\15\1\u013d\27\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u013e" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u013f\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\5\15\1\u0140\40\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\16\15\1\u0141\27\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\u0142" - + "\2\15\1\u0143\34\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u0144\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\1\15\1\u0145\7\15\1\u0146" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\21\15\1\u0147\24\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u0148\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u0149\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u014a" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\1\15\1\u014b\44\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\16\15\1\u014c\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u014d\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u014e" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\16\15\1\u014f\27\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\5\15\1\u0150\40\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u0151\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u0152" - + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\26\15\1\u0153\17\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\26\15\1\u0154\17\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\7\15\1\u0155\36\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\6\15\1\u0156" - + "\37\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u0157\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\u0158\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u0159\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u015a" - + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\7\15\1\u015b\6\15\1\u015c\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u015d\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\7\15\1\u015e" - + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\3\15\1\u015f\42\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u0160\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\16\15\1\u0161\27\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0162" - + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\6\15\1\u0163\37\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\7\15\1\u0164\36\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\u0165\42\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\5\15\1\u0166" - + "\40\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\26\15\1\u0167\17\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\14\15\1\u0168\31\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\20\15\1\u0169\25\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u016a" - + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\24\15\1\u016b\21\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\u016c\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\10\15\1\u016d\13\15\1\u016e" - + "\21\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\4\15\1\u016f\41\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\16\15\1\u0170\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\22\15\1\u0171\23\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\20\15\1\u0172" - + "\25\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\13\15\1\u0173\32\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\15\1\u0174\44\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u0175\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u0176" - + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\27\15\1\u0177\3\15\1\u0178\6\15\1\u0179\3\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\7\15\1\u017a" - + "\36\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u017b\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\u017c\45\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\u017d\33\15\23\0\1\15" - + "\17\0\1\u017e\3\0\2\u017e\116\0\2\u017f\1\0\4\u017f" - + "\4\0\1\u017f\1\0\2\u017f\1\0\1\u017f\6\0\2\u017f" - + "\12\0\1\u017f\1\0\1\u017f\5\0\2\u017f\47\0\2\u0180" - + "\1\0\4\u0180\4\0\1\u0180\1\0\2\u0180\1\0\1\u0180" - + "\6\0\2\u0180\12\0\1\u0180\1\0\1\u0180\5\0\2\u0180" - + "\36\0\2\u0127\4\0\1\276\1\277\1\0\7\u0127\4\0" - + "\46\u0127\23\0\1\u0127\1\u0128\2\0\13\u0128\1\u0181\105\u0128" - + "\6\0\2\u0129\1\u0182\2\0\1\u0183\3\0\7\u0129\4\0" - + "\46\u0129\23\0\1\u0129\6\0\2\u012a\1\u0184\2\0\1\115" - + "\1\u0185\1\u0186\1\0\7\u012a\4\0\46\u012a\23\0\1\u012a" - + "\6\0\1\u0187\12\0\2\u0187\2\0\1\u0187\4\0\46\u0187" - + "\32\0\1\u0188\5\0\1\u012c\4\0\2\u0188\2\0\1\u0188" - + "\4\0\46\u0188\24\0\4\310\1\307\1\u012d\116\310\6\0" - + "\1\u0189\12\0\2\u0189\2\0\1\u0189\4\0\46\u0189\32\0" - + "\1\u0133\5\0\1\u0130\1\u0131\3\0\2\u0133\2\0\1\u0133" - + "\4\0\46\u0133\40\0\1\u0131\1\0\1\u018a\113\0\1\u018b" - + "\1\u0132\3\0\1\316\1\317\2\0\2\u0132\2\u018b\2\u0132" - + "\1\u018b\4\0\46\u018b\23\0\1\u0132\6\0\2\u0133\1\u018c" - + "\3\0\1\u018d\1\u0131\1\0\7\u0133\4\0\46\u0133\23\0" - + "\1\u0133\17\0\2\u018e\1\0\4\u018e\4\0\1\u018e\1\0" - + "\2\u018e\1\0\1\u018e\6\0\2\u018e\12\0\1\u018e\1\0" - + "\1\u018e\5\0\2\u018e\41\0\1\133\5\0\1\u018f\1\144" - + "\2\0\2\u018f\1\150\6\0\1\150\75\0\2\15\7\0" - + "\7\15\4\0\4\15\1\u0190\41\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\1\15\1\u0191\44\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\24\15\1\u0192" - + "\21\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\7\15\1\u0193\36\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\10\15\1\u0194\35\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\20\15\1\u0195\25\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u0196" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u0197\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u0198\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u0199\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\12\15\1\u019a" - + "\33\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\30\15\1\u019b\10\15\1\u019c\4\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u019d\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u019e" - + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\5\15\1\u019f\40\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\15\1\u01a0\44\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\12\15\1\u01a1\33\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\32\15\1\u01a2" - + "\13\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\6\15\1\u01a3\37\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u01a4\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\33\15\1\u01a5\12\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u01a6" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\16\15\1\u01a7\27\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\17\15\1\u01a8\26\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\7\15\1\u01a9\36\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u01aa" - + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\1\15\1\u01ab\44\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u01ac\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\1\15\1\u01ad\44\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u01ae" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\15\15\1\u01af\30\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u01b0\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\13\15\1\u01b1\32\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u01b2" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u01b3\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\23\15\1\u01b4\22\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\2\15\1\u01b5\43\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\23\15\1\u01b6" - + "\22\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\16\15\1\u01b7\27\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\u01b8\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u01b9\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\37\15\1\u01ba" - + "\2\15\1\u01bb\3\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u01bc\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\32\15\1\u01bd\13\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u01be" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\11\15\1\u01bf\34\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u01c0\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\u01c1\42\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\12\15\1\u01c2" - + "\33\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\1\15\1\u01c3\44\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\1\u01c4\45\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\14\15\1\u01c5\31\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\10\15\1\u01c6\35\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15" - + "\1\u01c7\44\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\12\15\1\u01c8\33\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\2\15\1\u01c9\43\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\30\15\1\u01ca\15\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u01cb\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u01cc\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\10\15\1\u01cd\35\15\23\0\1\15" - + "\1\u0128\2\0\11\u0128\1\u0181\1\u0128\1\u0181\105\u0128\6\0" - + "\1\u01ce\12\0\2\u01ce\2\0\1\u01ce\4\0\46\u01ce\32\0" - + "\1\u01cf\12\0\2\u01cf\2\0\1\u01cf\4\0\46\u01cf\32\0" - + "\1\u0188\5\0\1\u0185\1\u0186\3\0\2\u0188\2\0\1\u0188" - + "\4\0\46\u0188\40\0\1\u0186\1\0\1\u01d0\113\0\1\u01d1" - + "\1\u0187\3\0\1\115\1\u012c\2\0\2\u0187\2\u01d1\2\u0187" - + "\1\u01d1\4\0\46\u01d1\23\0\1\u0187\6\0\2\u0188\1\u01d2" - + "\3\0\1\u01d3\1\u0186\1\0\7\u0188\4\0\46\u0188\23\0" - + "\1\u0188\6\0\1\u018b\1\u0189\3\0\1\316\1\u0130\1\u0131" - + "\1\0\2\u0189\2\u018b\2\u0189\1\u018b\4\0\46\u018b\23\0" - + "\1\u0189\1\u018a\2\0\13\u018a\1\u01d4\105\u018a\6\0\2\u018b" - + "\1\u018c\2\0\1\316\1\u0130\1\u0131\1\0\7\u018b\4\0" - + "\46\u018b\23\0\1\u018b\6\0\1\u01d5\12\0\2\u01d5\2\0" - + "\1\u01d5\4\0\46\u01d5\40\0\1\u018d\1\u0131\125\0\2\u01d6" - + "\1\0\4\u01d6\4\0\1\u01d6\1\0\2\u01d6\1\0\1\u01d6" - + "\6\0\2\u01d6\12\0\1\u01d6\1\0\1\u01d6\5\0\2\u01d6" - + "\41\0\1\133\5\0\1\u01d7\1\144\2\0\2\u01d7\1\150" - + "\6\0\1\150\75\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u01d8\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u01d9\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\23\15\1\u01da\22\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u01db\31\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u01dc\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\41\15\1\u01dd\4\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\5\15\1\u01de\40\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\16\15\1\u01df\27\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15" - + "\1\u01e0\44\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\u01e1\44\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\20\15\1\u01e2\25\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u01e3\33\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u01e4\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\u01e5\44\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\21\15\1\u01e6\24\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\3\15\1\u01e7\42\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\11\15" - + "\1\u01e8\34\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u01e9\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\15\15\1\u01ea\30\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\10\15\1\u01eb\35\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u01ec\4\15\1\u01ed\30\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\23\15\1\u01ee\22\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\11\15\1\u01ef\34\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\23\15" - + "\1\u01f0\22\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\12\15\1\u01f1\33\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\14\15\1\u01f2\31\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\16\15\1\u01f3\27\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\u01f4\43\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\5\15\1\u01f5\40\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\u01f6\33\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u01f7\22\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15" - + "\1\u01f8\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\12\15\1\u01f9\33\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\20\15\1\u01fa\25\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\7\15\1\u01fb\36\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\3\15" - + "\1\u01fc\42\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\u01fd\44\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\5\15\1\u01fe\40\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\30\15\1\u01ff\13\15" - + "\1\u0200\1\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\11\15\1\u0201\34\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\26\15\1\u0202\17\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\5\15\1\u0203\40\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\6\15" - + "\1\u0204\37\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\26\15\1\u0205\17\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\16\15\1\u0206\27\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u0207\22\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\1\15" - + "\1\u0208\44\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\10\15\1\u0209\35\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\26\15\1\u020a\17\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\1\15\1\u020b\44\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15" - + "\1\u020c\33\15\23\0\1\15\6\0\2\u01ce\3\0\1\u0183" - + "\3\0\7\u01ce\4\0\46\u01ce\23\0\1\u01ce\6\0\1\u01d1" - + "\1\u01cf\3\0\1\115\1\u0185\1\u0186\1\0\2\u01cf\2\u01d1" - + "\2\u01cf\1\u01d1\4\0\46\u01d1\23\0\1\u01cf\1\u01d0\2\0" - + "\13\u01d0\1\u020d\105\u01d0\6\0\2\u01d1\1\u01d2\2\0\1\115" - + "\1\u0185\1\u0186\1\0\7\u01d1\4\0\46\u01d1\23\0\1\u01d1" - + "\6\0\1\u020e\12\0\2\u020e\2\0\1\u020e\4\0\46\u020e" - + "\40\0\1\u01d3\1\u0186\106\0\1\u018a\2\0\10\u018a\1\u020f" - + "\1\u01d4\1\u018a\1\u01d4\105\u018a\6\0\2\u01d5\4\0\1\u018d" - + "\1\u0131\1\0\7\u01d5\4\0\46\u01d5\23\0\1\u01d5\17\0" - + "\2\u0210\1\0\4\u0210\4\0\1\u0210\1\0\2\u0210\1\0" - + "\1\u0210\6\0\2\u0210\12\0\1\u0210\1\0\1\u0210\5\0" - + "\2\u0210\41\0\1\133\5\0\1\u0211\1\144\2\0\2\u0211" - + "\1\150\6\0\1\150\75\0\2\15\7\0\7\15\4\0" - + "\37\15\1\u0212\6\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u0213\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\13\15\1\u0214\32\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u0215" - + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\16\15\1\u0216\27\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u0217\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\14\15\1\u0218\31\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u0219" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\3\15\1\u021a\42\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u021b\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\1\15\1\u021c\44\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\43\15\1\u021d" - + "\2\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\34\15\1\u021e\11\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\5\15\1\u021f\40\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\u0220\42\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0221" - + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u0222\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u0223\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\10\15\1\u0224\35\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\37\15\1\u0225" - + "\6\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\11\15\1\u0226\34\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u0227\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\5\15\1\u0228\40\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\3\15\1\u0229" - + "\42\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\22\15\1\u022a\23\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\7\15\1\u022b\36\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\24\15\1\u022c\21\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\1\15\1\u022d" - + "\44\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\3\15\1\u022e\42\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\11\15\1\u022f\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\6\15\1\u0230\37\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u0231" - + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u0232\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\2\15\1\u0233\43\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u0234\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u0235" - + "\34\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u0236\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u0237\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\14\15\1\u0238\31\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\11\15\1\u0239" - + "\34\15\23\0\1\15\1\u01d0\2\0\10\u01d0\1\u023a\1\u020d" - + "\1\u01d0\1\u020d\105\u01d0\6\0\2\u020e\4\0\1\u01d3\1\u0186" - + "\1\0\7\u020e\4\0\46\u020e\23\0\1\u020e\17\0\2\u023b" - + "\1\0\4\u023b\4\0\1\u023b\1\0\2\u023b\1\0\1\u023b" - + "\6\0\2\u023b\12\0\1\u023b\1\0\1\u023b\5\0\2\u023b" - + "\41\0\1\133\5\0\1\u023c\1\144\2\0\2\u023c\1\150" - + "\6\0\1\150\75\0\2\15\7\0\7\15\4\0\7\15" - + "\1\u023d\36\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u023e\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\3\15\1\u023f\42\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\31\15\1\u0240\14\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\26\15" - + "\1\u0241\17\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u0242\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\23\15\1\u0243\22\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\5\15\1\u0244\40\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\26\15" - + "\1\u0245\17\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\3\15\1\u0246\42\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\u0247\33\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u0248\43\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15" - + "\1\u0249\27\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\5\15\1\u024a\40\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\36\15\1\u024b\7\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\10\15\1\u024c\35\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\u024d\43\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\7\15\1\u024e\36\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\11\15\1\u024f\34\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\10\15\1\u0250\35\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\10\15" - + "\1\u0251\35\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\12\15\1\u0252\33\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\u0253\33\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\23\15\1\u0254\22\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\u0255\43\15\23\0\1\15\6\0\2\15\7\0\3\15" - + "\1\u0256\3\15\4\0\46\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\23\15\1\u0257\22\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\1\15\1\u0258\44\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\20\15" - + "\1\u0259\25\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\1\15\1\u025a\44\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\12\15\1\u025b\33\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\31\15\1\u025c\11\15" - + "\1\u025d\2\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\22\15\1\u025e\23\15\23\0\1\15\17\0\2\u025f" - + "\1\0\4\u025f\4\0\1\u025f\1\0\2\u025f\1\0\1\u025f" - + "\6\0\2\u025f\12\0\1\u025f\1\0\1\u025f\5\0\2\u025f" - + "\41\0\1\133\5\0\1\u0260\1\144\2\0\2\u0260\1\150" - + "\6\0\1\150\75\0\2\15\7\0\7\15\4\0\24\15" - + "\1\u0261\21\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\26\15\1\u0262\17\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\7\15\1\u0263\36\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\2\15\1\u0264\43\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\u0265\43\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u0266\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\11\15\1\u0267\34\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\26\15\1\u0268\17\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\7\15" - + "\1\u0269\36\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\2\15\1\u026a\43\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\7\15\1\u026b\36\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\11\15\1\u026c\34\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\14\15" - + "\1\u026d\31\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\24\15\1\u026e\21\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\2\15\1\u026f\43\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u0270\31\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\2\15" - + "\1\u0271\43\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\3\15\1\u0272\42\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\2\15\1\u0273\43\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\14\15\1\u0274\31\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\12\15" - + "\1\u0275\33\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\12\15\1\u0276\33\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\7\15\1\u0277\36\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\11\15\1\u0278\34\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\16\15" - + "\1\u0279\27\15\23\0\1\15\17\0\2\u027a\1\0\4\u027a" - + "\4\0\1\u027a\1\0\2\u027a\1\0\1\u027a\6\0\2\u027a" - + "\12\0\1\u027a\1\0\1\u027a\5\0\2\u027a\41\0\1\133" - + "\5\0\1\u027b\1\144\2\0\2\u027b\1\150\6\0\1\150" - + "\75\0\2\15\7\0\7\15\4\0\12\15\1\u027c\33\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\13\15" - + "\1\u027d\32\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\11\15\1\u027e\34\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\20\15\1\u027f\25\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\20\15\1\u0280\25\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\15\15" - + "\1\u0281\30\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\3\15\1\u0282\42\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\6\15\1\u0283\37\15\23\0\1\15" - + "\6\0\2\15\7\0\7\15\4\0\12\15\1\u0284\33\15" - + "\23\0\1\15\6\0\2\15\7\0\7\15\4\0\37\15" - + "\1\u0285\6\15\23\0\1\15\6\0\2\15\7\0\7\15" - + "\4\0\44\15\1\u0286\1\15\23\0\1\15\6\0\2\15" - + "\7\0\7\15\4\0\1\u0287\45\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\11\15\1\u0288\34\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\10\15\1\u0289" - + "\35\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\10\15\1\u028a\35\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\7\15\1\u028b\36\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\3\15\1\u028c\42\15\23\0" - + "\1\15\11\0\1\133\5\0\1\u028d\1\144\2\0\2\u028d" - + "\1\150\6\0\1\150\75\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u028e\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\10\15\1\u028f\35\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\35\15\1\u0290\10\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\14\15\1\u0291" - + "\31\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u0292\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\7\15\1\u0293\36\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\13\15\1\u0294\32\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\16\15\1\u0295" - + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\23\15\1\u0296\22\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\26\15\1\u0297\17\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\21\15\1\u0298\24\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\22\15\1\u0299" - + "\23\15\23\0\1\15\11\0\1\133\5\0\1\u029a\1\144" - + "\2\0\2\u029a\1\150\6\0\1\150\75\0\2\15\7\0" - + "\7\15\4\0\40\15\1\u029b\5\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\14\15\1\u029c\31\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u029d" - + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u029e\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\44\15\1\u029f\1\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\24\15\1\u02a0\21\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\23\15\1\u02a1" - + "\22\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\2\15\1\u02a2\43\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u02a3\42\15\23\0\1\15\11\0" - + "\1\133\5\0\1\u02a4\1\144\2\0\2\u02a4\1\150\6\0" - + "\1\150\75\0\2\15\7\0\7\15\4\0\16\15\1\u02a5" - + "\27\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\6\15\1\u02a6\37\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\3\15\1\u02a7\42\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\14\15\1\u02a8\31\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u02a9" - + "\32\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u02aa\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\6\15\1\u02ab\37\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\21\15\1\u02ac\24\15\23\0" - + "\1\15\11\0\1\133\5\0\1\u02ad\1\144\2\0\2\u02ad" - + "\1\150\6\0\1\150\75\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u02ae\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\16\15\1\u02af\27\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\23\15\1\u02b0\22\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\2\15\1\u02b1" - + "\43\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\44\15\1\u02b2\1\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\44\15\1\u02b3\1\15\23\0\1\15\11\0" - + "\1\133\5\0\1\u02b4\1\144\2\0\2\u02b4\1\150\6\0" - + "\1\150\75\0\2\15\7\0\7\15\4\0\21\15\1\u02b5" - + "\24\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\12\15\1\u02b6\33\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\40\15\1\u02b7\5\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\13\15\1\u02b8\32\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\13\15\1\u02b9" - + "\32\15\23\0\1\15\11\0\1\133\5\0\1\u02ba\1\144" - + "\2\0\2\u02ba\1\150\6\0\1\150\75\0\2\15\7\0" - + "\7\15\4\0\11\15\1\u02bb\34\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\16\15\1\u02bc\27\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\23\15\1\u02bd" - + "\22\15\23\0\1\15\6\0\2\15\7\0\7\15\4\0" - + "\23\15\1\u02be\22\15\23\0\1\15\6\0\2\15\7\0" - + "\7\15\4\0\22\15\1\u02bf\23\15\23\0\1\15\6\0" - + "\2\15\7\0\7\15\4\0\12\15\1\u02c0\33\15\23\0" - + "\1\15\6\0\2\15\7\0\7\15\4\0\21\15\1\u02c1" - + "\24\15\23\0\1\15"; + /** the current state of the DFA */ + private int zzState; - private static int[] zzUnpackTrans() { - int[] result = new int[45864]; - int offset = 0; - offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); - return result; - } + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; - private static int zzUnpackTrans(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - int j = offset; /* index in unpacked array */ + /** the textposition at the last accepting state */ + private int zzMarkedPos; - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - value--; - do { - result[j++] = value; - } while (--count > 0); - } - return j; - } + /** the current text position in the buffer */ + private int zzCurrentPos; + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; - private static final int ZZ_NO_MATCH = 1; + /** number of newlines encountered up to the start of the matched text */ + private int yyline; - private static final int ZZ_PUSHBACK_2BIG = 2; + /** the number of characters up to the start of the matched text */ + private int yychar; - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; - /** - * ZZ_ATTRIBUTE[aState] contains the attributes of state aState - */ - private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; - private static final String ZZ_ATTRIBUTE_PACKED_0 - = "\6\0\1\11\1\1\1\11\11\1\1\11\3\1\2\11" - + "\26\1\10\11\1\1\2\11\5\1\1\11\2\1\2\11" - + "\4\1\1\11\2\1\1\11\1\1\1\11\1\1\1\11" - + "\3\1\1\11\1\1\1\0\3\11\2\0\1\1\1\0" - + "\1\1\2\11\1\1\1\11\3\1\1\0\2\1\1\0" - + "\2\11\75\1\12\11\1\1\6\11\1\1\1\11\1\1" - + "\6\0\2\11\3\1\1\11\2\0\1\11\3\0\1\11" - + "\1\0\1\11\1\1\2\11\4\1\1\0\112\1\1\11" - + "\12\0\1\11\5\0\1\11\111\1\1\11\1\0\1\11" - + "\1\1\1\0\1\11\12\0\100\1\10\0\67\1\2\0" - + "\153\1\1\11\107\1"; + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; - private static int[] zzUnpackAttribute() { - int[] result = new int[705]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; - } + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /** + * The number of occupied positions in zzBuffer beyond zzEndRead. + * When a lead/high surrogate has been read from the input stream + * into the final zzBuffer position, this will have a value of 1; + * otherwise, it will have a value of 0. + */ + private int zzFinalHighSurrogate = 0; - private static int zzUnpackAttribute(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ + /* user code: */ - int j = offset; /* index in unpacked array */ - - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do { - result[j++] = value; - } while (--count > 0); - } - return j; - } - - /** - * the input device - */ - private java.io.Reader zzReader; - - /** - * the current state of the DFA - */ - private int zzState; - - /** - * the current lexical state - */ - private int zzLexicalState = YYINITIAL; - - /** - * this buffer contains the current text to be matched and is the source of - * the yytext() string - */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** - * the textposition at the last accepting state - */ - private int zzMarkedPos; - - /** - * the current text position in the buffer - */ - private int zzCurrentPos; - - /** - * startRead marks the beginning of the yytext() string in the buffer - */ - private int zzStartRead; - - /** - * endRead marks the last character in the buffer, that has been read from - * input - */ - private int zzEndRead; - - /** - * number of newlines encountered up to the start of the matched text - */ - private int yyline; - - /** - * the number of characters up to the start of the matched text - */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** - * zzAtEOF == true <=> the scanner is at the EOF - */ - private boolean zzAtEOF; - - /** - * denotes if the user-EOF-code has already been executed - */ - private boolean zzEOFDone; - - /** - * The number of occupied positions in zzBuffer beyond zzEndRead. When a - * lead/high surrogate has been read from the input stream into the final - * zzBuffer position, this will have a value of 1; otherwise, it will have a - * value of 0. - */ - private int zzFinalHighSurrogate = 0; - - /* user code: */ StringBuffer string = new StringBuffer(); private static String xmlTagName = ""; @@ -1280,22 +1234,22 @@ public final class ActionScriptLexer { private final List listeners = new ArrayList<>(); - public void addListener(LexListener listener) { + public void addListener(LexListener listener){ listeners.add(listener); } - public void removeListener(LexListener listener) { + public void removeListener(LexListener listener){ listeners.remove(listener); } - public void informListenersLex(ParsedSymbol s) { - for (LexListener l : listeners) { + public void informListenersLex(ParsedSymbol s){ + for(LexListener l:listeners){ l.onLex(s); } } - public void informListenersPushBack(ParsedSymbol s) { - for (LexListener l : listeners) { + public void informListenersPushBack(ParsedSymbol s){ + for(LexListener l:listeners){ l.onPushBack(s); } } @@ -1307,10 +1261,9 @@ public final class ActionScriptLexer { } ParsedSymbol last; - - public ParsedSymbol lex() throws java.io.IOException, ActionParseException { + public ParsedSymbol lex() throws java.io.IOException, ActionParseException{ ParsedSymbol ret = null; - if (!pushedBack.isEmpty()) { + if (!pushedBack.isEmpty()){ ret = last = pushedBack.pop(); } else { ret = last = yylex(); @@ -1319,1284 +1272,1098 @@ public final class ActionScriptLexer { return ret; } - /** - * Creates a new scanner - * - * @param in the java.io.Reader to read input from. - */ - public ActionScriptLexer(java.io.Reader in) { - this.zzReader = in; + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + public ActionScriptLexer(java.io.Reader in) { + this.zzReader = in; + } + + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x110000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 2916) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; } - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char[] zzUnpackCMap(String packed) { - char[] map = new char[0x110000]; - int i = 0; /* index in packed string */ + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) { + /* if not: blow it up */ + char newBuffer[] = new char[zzBuffer.length*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + } - int j = 0; /* index in unpacked array */ + /* fill the buffer with new input */ + int requested = zzBuffer.length - zzEndRead; + int totalRead = 0; + while (totalRead < requested) { + int numRead = zzReader.read(zzBuffer, zzEndRead + totalRead, requested - totalRead); + if (numRead == -1) { + break; + } + totalRead += numRead; + } - while (i < 2916) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do { - map[j++] = value; - } while (--count > 0); + if (totalRead > 0) { + zzEndRead += totalRead; + if (totalRead == requested) { /* possibly more input available */ + if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { + --zzEndRead; + zzFinalHighSurrogate = 1; } - return map; + } + return false; } - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { + // totalRead = 0: End of stream + return true; + } - /* first: make room (if you can) */ - if (zzStartRead > 0) { - zzEndRead += zzFinalHighSurrogate; - zzFinalHighSurrogate = 0; - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead - zzStartRead); + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ - /* translate stored positions */ - zzEndRead -= zzStartRead; - zzCurrentPos -= zzStartRead; - zzMarkedPos -= zzStartRead; - zzStartRead = 0; - } + if (zzReader != null) + zzReader.close(); + } - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) { - /* if not: blow it up */ - char newBuffer[] = new char[zzBuffer.length * 2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - zzEndRead += zzFinalHighSurrogate; - zzFinalHighSurrogate = 0; - } - /* fill the buffer with new input */ - int requested = zzBuffer.length - zzEndRead; - int totalRead = 0; - while (totalRead < requested) { - int numRead = zzReader.read(zzBuffer, zzEndRead + totalRead, requested - totalRead); - if (numRead == -1) { - break; - } - totalRead += numRead; - } + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to ZZ_INITIAL. + * + * Internal scan buffer is resized down to its initial length, if it has grown. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEOFDone = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + zzFinalHighSurrogate = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + if (zzBuffer.length > ZZ_BUFFERSIZE) + zzBuffer = new char[ZZ_BUFFERSIZE]; + } - if (totalRead > 0) { - zzEndRead += totalRead; - if (totalRead == requested) { /* possibly more input available */ - if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { - --zzEndRead; - zzFinalHighSurrogate = 1; - } - } - return false; - } + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } - // totalRead = 0: End of stream - return true; + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } - /** - * Closes the input stream. - * - * @throws java.io.IOException - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ + throw new Error(message); + } - zzEndRead = zzStartRead; /* invalidate buffer */ - if (zzReader != null) { - zzReader.close(); - } - } + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); - /** - * Resets the scanner to read from a new input stream. Does not close the - * old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). Lexical - * state is set to ZZ_INITIAL. - * - * Internal scan buffer is resized down to its initial length, if it has - * grown. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - zzFinalHighSurrogate = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - if (zzBuffer.length > ZZ_BUFFERSIZE) { - zzBuffer = new char[ZZ_BUFFERSIZE]; - } - } + zzMarkedPos -= number; + } - /** - * Returns the current lexical state. - * - * @return - */ - public final int yystate() { - return zzLexicalState; - } - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public ParsedSymbol yylex() throws java.io.IOException, ActionParseException { + int zzInput; + int zzAction; - /** - * Returns the text matched by the current regular expression. - * - * @return - */ - public final String yytext() { - return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead); - } + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; - /** - * Returns the character at position pos from the matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. A value from 0 to - * yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead + pos]; - } + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; - /** - * Returns the length of the matched text region. - * - * @return - */ - public final int yylength() { - return zzMarkedPos - zzStartRead; - } + while (true) { + zzMarkedPosL = zzMarkedPos; - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of yypushback(int) and - * a match-all fallback rule) this method will only be called with things - * that "Can't Possibly Happen". If this method is called, something is - * seriously wrong (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done in error - * fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } + yychar+= zzMarkedPosL-zzStartRead; - throw new Error(message); - } + zzAction = -1; - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. This number must - * not be greater than yylength()! - */ - public void yypushback(int number) { - if (number > yylength()) { - zzScanError(ZZ_PUSHBACK_2BIG); - } + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; - zzMarkedPos -= number; - } + // set up zzAction for empty match case: + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + } - /** - * Resumes scanning until the next regular expression is matched, the end of - * input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - * @throws com.jpexs.decompiler.flash.action.parser.ActionParseException - */ - public ParsedSymbol yylex() throws java.io.IOException, ActionParseException { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char[] zzBufferL = zzBuffer; - char[] zzCMapL = ZZ_CMAP; - - int[] zzTransL = ZZ_TRANS; - int[] zzRowMapL = ZZ_ROWMAP; - int[] zzAttrL = ZZ_ATTRIBUTE; + zzForAction: { while (true) { - zzMarkedPosL = zzMarkedPos; - - yychar += zzMarkedPosL - zzStartRead; - - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = ZZ_LEXSTATE[zzLexicalState]; - - // set up zzAction for empty match case: - int zzAttributes = zzAttrL[zzState]; - if ((zzAttributes & 1) == 1) { - zzAction = zzState; + + if (zzCurrentPosL < zzEndReadL) { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; } - - zzForAction: - { - while (true) { - - if (zzCurrentPosL < zzEndReadL) { - zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); - zzCurrentPosL += Character.charCount(zzInput); - } else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } else { - zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); - zzCurrentPosL += Character.charCount(zzInput); - } - } - int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]]; - if (zzNext == -1) { - break zzForAction; - } - zzState = zzNext; - - zzAttributes = zzAttrL[zzState]; - if ((zzAttributes & 1) == 1) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ((zzAttributes & 8) == 8) { - break zzForAction; - } - } - - } + else { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; - // store back cached position - zzMarkedPos = zzMarkedPosL; + zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 1: { - } - case 186: - break; - case 2: { - yyline++; - } - case 187: - break; - case 3: { /*ignore*/ - - } - case 188: - break; - case 4: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); - } - case 189: - break; - case 5: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); - } - case 190: - break; - case 6: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - } - case 191: - break; - case 7: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); - } - case 192: - break; - case 8: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); - } - case 193: - break; - case 9: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); - } - case 194: - break; - case 10: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); - } - case 195: - break; - case 11: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); - } - case 196: - break; - case 12: { - string.setLength(0); - yybegin(STRING); - } - case 197: - break; - case 13: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); - } - case 198: - break; - case 14: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); - } - case 199: - break; - case 15: { - string.setLength(0); - yybegin(CHARLITERAL); - } - case 200: - break; - case 16: { - string.setLength(0); - yybegin(OIDENTIFIER); - } - case 201: - break; - case 17: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); - } - case 202: - break; - case 18: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); - } - case 203: - break; - case 19: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); - } - case 204: - break; - case 20: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); - } - case 205: - break; - case 21: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); - } - case 206: - break; - case 22: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); - } - case 207: - break; - case 23: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); - } - case 208: - break; - case 24: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); - } - case 209: - break; - case 25: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); - } - case 210: - break; - case 26: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); - } - case 211: - break; - case 27: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); - } - case 212: - break; - case 28: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); - } - case 213: - break; - case 29: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); - } - case 214: - break; - case 30: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); - } - case 215: - break; - case 31: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); - } - case 216: - break; - case 32: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); - } - case 217: - break; - case 33: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); - } - case 218: - break; - case 34: { - string.append(yytext()); - } - case 219: - break; - case 35: { - yybegin(YYINITIAL); - yyline++; - } - case 220: - break; - case 36: { - yybegin(YYINITIAL); - // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); - } - case 221: - break; - case 37: { - string.append(yytext()); - yyline++; - } - case 222: - break; - case 38: { - yybegin(XML); - string.append(yytext()); - } - case 223: - break; - case 39: { - string.append(yytext()); - yyline++; - } - case 224: - break; - case 40: { - yybegin(YYINITIAL); - // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); - } - case 225: - break; - case 41: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); - } - case 226: - break; - case 42: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); - } - case 227: - break; - case 43: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); - } - case 228: - break; - case 44: { - return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); - } - case 229: - break; - case 45: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); - } - case 230: - break; - case 46: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); - } - case 231: - break; - case 47: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); - } - case 232: - break; - case 48: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); - } - case 233: - break; - case 49: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); - } - case 234: - break; - case 50: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); - } - case 235: - break; - case 51: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); - } - case 236: - break; - case 52: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); - } - case 237: - break; - case 53: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); - } - case 238: - break; - case 54: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); - } - case 239: - break; - case 55: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); - } - case 240: - break; - case 56: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); - } - case 241: - break; - case 57: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); - } - case 242: - break; - case 58: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); - } - case 243: - break; - case 59: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); - } - case 244: - break; - case 60: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); - } - case 245: - break; - case 61: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); - } - case 246: - break; - case 62: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); - } - case 247: - break; - case 63: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); - } - case 248: - break; - case 64: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); - } - case 249: - break; - case 65: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); - } - case 250: - break; - case 66: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); - } - case 251: - break; - case 67: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); - } - case 252: - break; - case 68: { - string.append('\\'); /*illegal escape sequence*/ - - } - case 253: - break; - case 69: { - string.append('\"'); - } - case 254: - break; - case 70: { - string.append('\\'); - } - case 255: - break; - case 71: { - string.append('\''); - } - case 256: - break; - case 72: { - string.append('\b'); - } - case 257: - break; - case 73: { - string.append('\r'); - } - case 258: - break; - case 74: { - string.append('\n'); - } - case 259: - break; - case 75: { - string.append('\t'); - } - case 260: - break; - case 76: { - string.append('\f'); - } - case 261: - break; - case 77: { - throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); - } - case 262: - break; - case 78: { - string.append('\u00A7'); - } - case 263: - break; - case 79: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); - } - case 264: - break; - case 80: { - string.setLength(0); - yybegin(XML); - String s = yytext(); - s = s.substring(1, s.length() - 1); - if (s.contains(" ")) { - s = s.substring(0, s.indexOf(' ')); - } - xmlTagName = s; - string.append(yytext()); - } - case 265: - break; - case 81: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); - } - case 266: - break; - case 82: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); - } - case 267: - break; - case 83: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); - } - case 268: - break; - case 84: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); - } - case 269: - break; - case 85: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); - } - case 270: - break; - case 86: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); - } - case 271: - break; - case 87: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); - } - case 272: - break; - case 88: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SET, yytext()); - } - case 273: - break; - case 89: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); - } - case 274: - break; - case 90: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); - } - case 275: - break; - case 91: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); - } - case 276: - break; - case 92: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); - } - case 277: - break; - case 93: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, yytext()); - } - case 278: - break; - case 94: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); - } - case 279: - break; - case 95: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); - } - case 280: - break; - case 96: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.GET, yytext()); - } - case 281: - break; - case 97: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); - } - case 282: - break; - case 98: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); - } - case 283: - break; - case 99: { - String t = yytext(); - return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, t.substring(2, t.length() - 1)); - } - case 284: - break; - case 100: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); - } - case 285: - break; - case 101: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); - } - case 286: - break; - case 102: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); - } - case 287: - break; - case 103: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); - } - case 288: - break; - case 104: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); - } - case 289: - break; - case 105: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); - } - case 290: - break; - case 106: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); - } - case 291: - break; - case 107: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); - } - case 292: - break; - case 108: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); - } - case 293: - break; - case 109: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); - } - case 294: - break; - case 110: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); - } - case 295: - break; - case 111: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); - } - case 296: - break; - case 112: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); - } - case 297: - break; - case 113: { - char val = (char) Integer.parseInt(yytext().substring(1), 8); - string.append(val); - } - case 298: - break; - case 114: { - char val = (char) Integer.parseInt(yytext().substring(2), 16); - string.append(val); - } - case 299: - break; - case 115: { - string.append(yytext()); - String endtagname = yytext(); - endtagname = endtagname.substring(2, endtagname.length() - 1); - if (endtagname.equals(xmlTagName)) { - yybegin(YYINITIAL); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML, string.toString()); - } - } - case 300: - break; - case 116: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); - } - case 301: - break; - case 117: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); - } - case 302: - break; - case 118: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, yytext()); - } - case 303: - break; - case 119: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); - } - case 304: - break; - case 120: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); - } - case 305: - break; - case 121: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); - } - case 306: - break; - case 122: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); - } - case 307: - break; - case 123: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); - } - case 308: - break; - case 124: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); - } - case 309: - break; - case 125: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); - } - case 310: - break; - case 126: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); - } - case 311: - break; - case 127: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); - } - case 312: - break; - case 128: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); - } - case 313: - break; - case 129: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); - } - case 314: - break; - case 130: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); - } - case 315: - break; - case 131: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); - } - case 316: - break; - case 132: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); - } - case 317: - break; - case 133: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); - } - case 318: - break; - case 134: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); - } - case 319: - break; - case 135: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); - } - case 320: - break; - case 136: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); - } - case 321: - break; - case 137: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); - } - case 322: - break; - case 138: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); - } - case 323: - break; - case 139: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); - } - case 324: - break; - case 140: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); - } - case 325: - break; - case 141: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); - } - case 326: - break; - case 142: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); - } - case 327: - break; - case 143: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); - } - case 328: - break; - case 144: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); - } - case 329: - break; - case 145: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); - } - case 330: - break; - case 146: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); - } - case 331: - break; - case 147: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, yytext()); - } - case 332: - break; - case 148: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); - } - case 333: - break; - case 149: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); - } - case 334: - break; - case 150: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.OVERRIDE, yytext()); - } - case 335: - break; - case 151: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); - } - case 336: - break; - case 152: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); - } - case 337: - break; - case 153: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); - } - case 338: - break; - case 154: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); - } - case 339: - break; - case 155: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); - } - case 340: - break; - case 156: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); - } - case 341: - break; - case 157: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); - } - case 342: - break; - case 158: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); - } - case 343: - break; - case 159: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.NAMESPACE, yytext()); - } - case 344: - break; - case 160: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); - } - case 345: - break; - case 161: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); - } - case 346: - break; - case 162: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); - } - case 347: - break; - case 163: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); - } - case 348: - break; - case 164: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); - } - case 349: - break; - case 165: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, yytext()); - } - case 350: - break; - case 166: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); - } - case 351: - break; - case 167: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); - } - case 352: - break; - case 168: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); - } - case 353: - break; - case 169: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); - } - case 354: - break; - case 170: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); - } - case 355: - break; - case 171: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); - } - case 356: - break; - case 172: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); - } - case 357: - break; - case 173: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); - } - case 358: - break; - case 174: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); - } - case 359: - break; - case 175: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); - } - case 360: - break; - case 176: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); - } - case 361: - break; - case 177: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); - } - case 362: - break; - case 178: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); - } - case 363: - break; - case 179: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); - } - case 364: - break; - case 180: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); - } - case 365: - break; - case 181: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); - } - case 366: - break; - case 182: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); - } - case 367: - break; - case 183: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); - } - case 368: - break; - case 184: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); - } - case 369: - break; - case 185: { - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); - } - case 370: - break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - { - return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); - } - } else { - zzScanError(ZZ_NO_MATCH); - } - } } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: + { + } + case 187: break; + case 2: + { yyline++; + } + case 188: break; + case 3: + { /*ignore*/ + } + case 189: break; + case 4: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); + } + case 190: break; + case 5: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); + } + case 191: break; + case 6: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + } + case 192: break; + case 7: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); + } + case 193: break; + case 8: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); + } + case 194: break; + case 9: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); + } + case 195: break; + case 10: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); + } + case 196: break; + case 11: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); + } + case 197: break; + case 12: + { string.setLength(0); + yybegin(STRING); + } + case 198: break; + case 13: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); + } + case 199: break; + case 14: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); + } + case 200: break; + case 15: + { string.setLength(0); + yybegin(CHARLITERAL); + } + case 201: break; + case 16: + { string.setLength(0); + yybegin(OIDENTIFIER); + } + case 202: break; + case 17: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); + } + case 203: break; + case 18: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); + } + case 204: break; + case 19: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); + } + case 205: break; + case 20: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); + } + case 206: break; + case 21: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); + } + case 207: break; + case 22: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); + } + case 208: break; + case 23: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); + } + case 209: break; + case 24: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); + } + case 210: break; + case 25: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); + } + case 211: break; + case 26: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); + } + case 212: break; + case 27: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); + } + case 213: break; + case 28: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); + } + case 214: break; + case 29: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); + } + case 215: break; + case 30: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); + } + case 216: break; + case 31: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); + } + case 217: break; + case 32: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); + } + case 218: break; + case 33: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); + } + case 219: break; + case 34: + { string.append(yytext()); + } + case 220: break; + case 35: + { yybegin(YYINITIAL); yyline++; + } + case 221: break; + case 36: + { yybegin(YYINITIAL); + // length also includes the trailing quote + return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); + } + case 222: break; + case 37: + { string.append(yytext()); yyline++; + } + case 223: break; + case 38: + { yybegin(XML); string.append(yytext()); + } + case 224: break; + case 39: + { string.append(yytext()); yyline++; + } + case 225: break; + case 40: + { yybegin(YYINITIAL); + // length also includes the trailing quote + return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); + } + case 226: break; + case 41: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); + } + case 227: break; + case 42: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); + } + case 228: break; + case 43: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); + } + case 229: break; + case 44: + { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); + } + case 230: break; + case 45: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); + } + case 231: break; + case 46: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); + } + case 232: break; + case 47: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); + } + case 233: break; + case 48: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); + } + case 234: break; + case 49: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); + } + case 235: break; + case 50: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); + } + case 236: break; + case 51: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); + } + case 237: break; + case 52: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); + } + case 238: break; + case 53: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); + } + case 239: break; + case 54: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); + } + case 240: break; + case 55: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); + } + case 241: break; + case 56: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); + } + case 242: break; + case 57: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); + } + case 243: break; + case 58: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); + } + case 244: break; + case 59: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); + } + case 245: break; + case 60: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); + } + case 246: break; + case 61: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); + } + case 247: break; + case 62: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); + } + case 248: break; + case 63: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); + } + case 249: break; + case 64: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); + } + case 250: break; + case 65: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); + } + case 251: break; + case 66: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); + } + case 252: break; + case 67: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); + } + case 253: break; + case 68: + { string.append('\\'); /*illegal escape sequence*/ + } + case 254: break; + case 69: + { string.append('\"'); + } + case 255: break; + case 70: + { string.append('\\'); + } + case 256: break; + case 71: + { string.append('\''); + } + case 257: break; + case 72: + { string.append('\b'); + } + case 258: break; + case 73: + { string.append('\r'); + } + case 259: break; + case 74: + { string.append('\n'); + } + case 260: break; + case 75: + { string.append('\t'); + } + case 261: break; + case 76: + { string.append('\f'); + } + case 262: break; + case 77: + { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + } + case 263: break; + case 78: + { string.append('\u00A7'); + } + case 264: break; + case 79: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); + } + case 265: break; + case 80: + { string.setLength(0); + yybegin(XML); + String s = yytext(); + s = s.substring(1, s.length() - 1); + if (s.contains(" ")){ + s = s.substring(0, s.indexOf(' ')); + } + xmlTagName = s; + string.append(yytext()); + } + case 266: break; + case 81: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); + } + case 267: break; + case 82: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); + } + case 268: break; + case 83: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); + } + case 269: break; + case 84: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); + } + case 270: break; + case 85: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); + } + case 271: break; + case 86: + { return new ParsedSymbol(SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); + } + case 272: break; + case 87: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); + } + case 273: break; + case 88: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); + } + case 274: break; + case 89: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SET, yytext()); + } + case 275: break; + case 90: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); + } + case 276: break; + case 91: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); + } + case 277: break; + case 92: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); + } + case 278: break; + case 93: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); + } + case 279: break; + case 94: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, yytext()); + } + case 280: break; + case 95: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); + } + case 281: break; + case 96: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); + } + case 282: break; + case 97: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.GET, yytext()); + } + case 283: break; + case 98: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); + } + case 284: break; + case 99: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); + } + case 285: break; + case 100: + { String t = yytext(); return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, t.substring(2, t.length() - 1)); + } + case 286: break; + case 101: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); + } + case 287: break; + case 102: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); + } + case 288: break; + case 103: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); + } + case 289: break; + case 104: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); + } + case 290: break; + case 105: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); + } + case 291: break; + case 106: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); + } + case 292: break; + case 107: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); + } + case 293: break; + case 108: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); + } + case 294: break; + case 109: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); + } + case 295: break; + case 110: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); + } + case 296: break; + case 111: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); + } + case 297: break; + case 112: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); + } + case 298: break; + case 113: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); + } + case 299: break; + case 114: + { char val = (char) Integer.parseInt(yytext().substring(1), 8); + string.append(val); + } + case 300: break; + case 115: + { char val = (char) Integer.parseInt(yytext().substring(2), 16); + string.append(val); + } + case 301: break; + case 116: + { string.append(yytext()); + String endtagname = yytext(); + endtagname = endtagname.substring(2, endtagname.length() - 1); + if (endtagname.equals(xmlTagName)){ + yybegin(YYINITIAL); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML, string.toString()); + } + } + case 302: break; + case 117: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); + } + case 303: break; + case 118: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); + } + case 304: break; + case 119: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, yytext()); + } + case 305: break; + case 120: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); + } + case 306: break; + case 121: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); + } + case 307: break; + case 122: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); + } + case 308: break; + case 123: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); + } + case 309: break; + case 124: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); + } + case 310: break; + case 125: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); + } + case 311: break; + case 126: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); + } + case 312: break; + case 127: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); + } + case 313: break; + case 128: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); + } + case 314: break; + case 129: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); + } + case 315: break; + case 130: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); + } + case 316: break; + case 131: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); + } + case 317: break; + case 132: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); + } + case 318: break; + case 133: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); + } + case 319: break; + case 134: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); + } + case 320: break; + case 135: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); + } + case 321: break; + case 136: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); + } + case 322: break; + case 137: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); + } + case 323: break; + case 138: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); + } + case 324: break; + case 139: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); + } + case 325: break; + case 140: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); + } + case 326: break; + case 141: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); + } + case 327: break; + case 142: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); + } + case 328: break; + case 143: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); + } + case 329: break; + case 144: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); + } + case 330: break; + case 145: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); + } + case 331: break; + case 146: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); + } + case 332: break; + case 147: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); + } + case 333: break; + case 148: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, yytext()); + } + case 334: break; + case 149: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); + } + case 335: break; + case 150: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); + } + case 336: break; + case 151: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.OVERRIDE, yytext()); + } + case 337: break; + case 152: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); + } + case 338: break; + case 153: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); + } + case 339: break; + case 154: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); + } + case 340: break; + case 155: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); + } + case 341: break; + case 156: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); + } + case 342: break; + case 157: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); + } + case 343: break; + case 158: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); + } + case 344: break; + case 159: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); + } + case 345: break; + case 160: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.NAMESPACE, yytext()); + } + case 346: break; + case 161: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); + } + case 347: break; + case 162: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); + } + case 348: break; + case 163: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); + } + case 349: break; + case 164: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); + } + case 350: break; + case 165: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); + } + case 351: break; + case 166: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, yytext()); + } + case 352: break; + case 167: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); + } + case 353: break; + case 168: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); + } + case 354: break; + case 169: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); + } + case 355: break; + case 170: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); + } + case 356: break; + case 171: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); + } + case 357: break; + case 172: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); + } + case 358: break; + case 173: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); + } + case 359: break; + case 174: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); + } + case 360: break; + case 175: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); + } + case 361: break; + case 176: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); + } + case 362: break; + case 177: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); + } + case 363: break; + case 178: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); + } + case 364: break; + case 179: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); + } + case 365: break; + case 180: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); + } + case 366: break; + case 181: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); + } + case 367: break; + case 182: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); + } + case 368: break; + case 183: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); + } + case 369: break; + case 184: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); + } + case 370: break; + case 185: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); + } + case 371: break; + case 186: + { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); + } + case 372: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + { + return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); + } + } + else { + zzScanError(ZZ_NO_MATCH); + } + } } + } + + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index 7b1b6dfae..f8f203340 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -56,12 +56,14 @@ import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.FalseItem; import com.jpexs.decompiler.graph.model.ForItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.NotItem; import com.jpexs.decompiler.graph.model.OrItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.WhileItem; import com.jpexs.helpers.Helper; import java.util.ArrayList; @@ -74,6 +76,16 @@ import java.util.List; */ public class ActionSourceGenerator implements SourceGenerator { + @Override + public List generate(SourceGeneratorLocalData localData, FalseItem item) throws CompilationException { + return GraphTargetItem.toSourceMerge(localData, this, new ActionPush(Boolean.FALSE)); + } + + @Override + public List generate(SourceGeneratorLocalData localData, TrueItem item) throws CompilationException { + return GraphTargetItem.toSourceMerge(localData, this, new ActionPush(Boolean.TRUE)); + } + @Override public List generate(SourceGeneratorLocalData localData, AndItem item) throws CompilationException { List ret = new ArrayList<>(); @@ -122,7 +134,7 @@ public class ActionSourceGenerator implements SourceGenerator { private List generateIf(SourceGeneratorLocalData localData, GraphTargetItem expression, List onTrueCmds, List onFalseCmds, boolean ternar) throws CompilationException { List ret = new ArrayList<>(); if (expression instanceof Inverted) { - ret.addAll(((Inverted) expression).invert().toSource(localData, this)); + ret.addAll(((Inverted) expression).invert(null).toSource(localData, this)); } else { ret.addAll(expression.toSource(localData, this)); ret.add(new ActionNot()); @@ -400,7 +412,7 @@ public class ActionSourceGenerator implements SourceGenerator { @Override public List generate(SourceGeneratorLocalData localData, NotItem item) throws CompilationException { if (item.getOriginal() instanceof Inverted) { - GraphTargetItem norig = ((Inverted) item).invert(); + GraphTargetItem norig = ((Inverted) item).invert(null); return norig.toSource(localData, this); } List ret = new ArrayList<>(); @@ -570,7 +582,7 @@ public class ActionSourceGenerator implements SourceGenerator { } while (item instanceof GetMemberActionItem); if (item instanceof GetVariableActionItem) { GetVariableActionItem v = (GetVariableActionItem) item; - item = new GetMemberActionItem(null, new GetVariableActionItem(null, new DirectValueActionItem(null, 0, "_global", new ArrayList<>())), v.name); + item = new GetMemberActionItem(null, new GetVariableActionItem(null, new DirectValueActionItem(null, 0, "_global", new ArrayList())), v.name); if (mem != null) { mem.object = item; } @@ -670,7 +682,7 @@ public class ActionSourceGenerator implements SourceGenerator { if (constructor == null) { List val = new ArrayList<>(); - val.add(new ActionDefineFunction("", new ArrayList<>(), 0, SWF.DEFAULT_VERSION)); + val.add(new ActionDefineFunction("", new ArrayList(), 0, SWF.DEFAULT_VERSION)); if (!isInterface) { val.add(new ActionStoreRegister(1)); } @@ -722,7 +734,7 @@ public class ActionSourceGenerator implements SourceGenerator { if (constr.isEmpty()) { List val = new ArrayList<>(); - val.add(new ActionDefineFunction("", new ArrayList<>(), 0, SWF.DEFAULT_VERSION)); + val.add(new ActionDefineFunction("", new ArrayList(), 0, SWF.DEFAULT_VERSION)); if (!isInterface) { val.add(new ActionStoreRegister(1)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolGroup.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolGroup.java index 6b162a4fd..afc76fa4f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolGroup.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolGroup.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.parser.script; /** @@ -32,5 +33,6 @@ public enum SymbolGroup { TYPENAME, EOF, GLOBALFUNC, - GLOBALCONST + GLOBALCONST, + PREPROCESSOR } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolType.java index 300251c72..4493f9c3d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/SymbolType.java @@ -185,7 +185,8 @@ public enum SymbolType { PRINTASBITMAPNUM(GraphTargetItem.PRECEDENCE_PRIMARY, false), UNLOADMOVIE(GraphTargetItem.PRECEDENCE_PRIMARY, false), UNLOADMOVIENUM(GraphTargetItem.PRECEDENCE_PRIMARY, false), - FSCOMMAND(GraphTargetItem.PRECEDENCE_PRIMARY, false); + FSCOMMAND(GraphTargetItem.PRECEDENCE_PRIMARY, false), + PREPROCESSOR(GraphTargetItem.PRECEDENCE_PRIMARY, false); private int precedence = GraphTargetItem.NOPRECEDENCE; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java index 93f887a6c..339791567 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.action.Action; @@ -36,6 +37,6 @@ public class ActionNot extends Action { @Override public void translate(TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); - stack.push(new NotItem(this, a)); + stack.push(a.invert(this)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index 4156119da..d95cc43c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.action.Action; @@ -35,13 +36,7 @@ public class ActionPop extends Action { @Override public void translate(TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { - if (stack.isEmpty()) { - return; - } GraphTargetItem val = stack.pop(); - if (val instanceof DirectValueActionItem) { - return; - } output.add(val); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index f58dc1c44..5b7b656da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -37,6 +37,8 @@ import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.FalseItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.helpers.Helper; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -377,18 +379,27 @@ public class ActionPush extends Action { } } }*/ - DirectValueActionItem dvt = new DirectValueActionItem(this, pos, o, constantPool); - - if (o instanceof RegisterNumber) {//TemporaryRegister - dvt.computedRegValue = variables.get("__register" + ((RegisterNumber) o).number); - if (regNames.containsKey(((RegisterNumber) o).number)) { - ((RegisterNumber) o).name = regNames.get(((RegisterNumber) o).number); + if (o instanceof Boolean) { + Boolean b = (Boolean) o; + if (b) { + stack.push(new TrueItem(this)); + } else { + stack.push(new FalseItem(this)); } - } - if (dvt.computedRegValue instanceof TemporaryRegister) { - stack.push(new TemporaryRegister(((RegisterNumber) o).number, ((TemporaryRegister) dvt.computedRegValue).value)); } else { - stack.push(dvt); + DirectValueActionItem dvt = new DirectValueActionItem(this, pos, o, constantPool); + + if (o instanceof RegisterNumber) {//TemporaryRegister + dvt.computedRegValue = variables.get("__register" + ((RegisterNumber) o).number); + if (regNames.containsKey(((RegisterNumber) o).number)) { + ((RegisterNumber) o).name = regNames.get(((RegisterNumber) o).number); + } + } + if (dvt.computedRegValue instanceof TemporaryRegister) { + stack.push(new TemporaryRegister(((RegisterNumber) o).number, ((TemporaryRegister) dvt.computedRegValue).value)); + } else { + stack.push(dvt); + } } pos++; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index d2332ea9d..fb5e7bf96 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.action.Action; @@ -39,7 +40,7 @@ public class ActionEnumerate extends Action { @Override public void translate(TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); - stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList<>())); - stack.push(new EnumerateActionItem(this, object)); + //stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); + output.add(new EnumerateActionItem(this, object)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java index 5ffa6770f..f00e5bc70 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java @@ -12,13 +12,15 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf5; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.graph.GraphSourceItemPos; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.DuplicateItem; import java.util.HashMap; import java.util.List; @@ -36,7 +38,7 @@ public class ActionPushDuplicate extends Action { @Override public void translate(TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.peek(); - stack.push(value); + stack.push(new DuplicateItem(this, value)); value.moreSrc.add(new GraphSourceItemPos(this, 0)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index 52bbb2c5d..9e56b1868 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -37,6 +37,6 @@ public class ActionEnumerate2 extends Action { @Override public void translate(TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); - stack.push(new EnumerateActionItem(this, object)); + output.add(new EnumerateActionItem(this, object)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 861368ca3..6e4435a7e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -91,7 +91,7 @@ public class Configuration { public static final ConfigurationItem autoDeobfuscate = null; @ConfigurationDefaultInt(1) - @ConfigurationCategory("script") + @ConfigurationCategory("") public static final ConfigurationItem deobfuscationMode = null; @ConfigurationDefaultBoolean(false) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java new file mode 100644 index 000000000..b6066cc43 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph; + +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * + * @author JPEXS + */ +public class DottedChain { + + public List parts = new ArrayList<>(); + + public DottedChain(List parts) { + this.parts = new ArrayList<>(parts); + } + + public DottedChain(String... parts) { + for (int i = 0; i < parts.length; i++) { + this.parts.add(parts[i]); + } + } + + public String getLast() { + if (parts.isEmpty()) { + return ""; + } else { + return parts.get(parts.size() - 1); + } + } + + public DottedChain getWithoutLast() { + List nparts = new ArrayList<>(parts); + if (!nparts.isEmpty()) { + nparts.remove(nparts.size() - 1); + } + return new DottedChain(nparts); + } + + public String toPrintableString() { + String ret = ""; + for (int i = 0; i < parts.size(); i++) { + if (i > 0) { + ret += "."; + } + ret += IdentifiersDeobfuscation.printIdentifier(true, parts.get(0)); + } + return ret; + } + + @Override + public String toString() { + String ret = ""; + for (int i = 0; i < parts.size(); i++) { + if (i > 0) { + ret += "."; + } + ret += parts.get(i); + } + return ret; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 89 * hash + Objects.hashCode(this.parts); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof String) { + obj = new DottedChain(((String) obj).split("\\.")); + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final DottedChain other = (DottedChain) obj; + if (!Objects.equals(this.parts, other.parts)) { + return false; + } + return true; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index 620b9dd18..6eb47253a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -16,6 +16,8 @@ */ package com.jpexs.decompiler.graph; +import com.jpexs.decompiler.graph.model.PushItem; +import com.jpexs.decompiler.graph.model.PopItem; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.FinalProcessLocalData; import com.jpexs.decompiler.flash.action.Action; @@ -25,10 +27,14 @@ import com.jpexs.decompiler.graph.model.AndItem; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DoWhileItem; +import com.jpexs.decompiler.graph.model.DuplicateItem; import com.jpexs.decompiler.graph.model.ExitItem; +import com.jpexs.decompiler.graph.model.FalseItem; import com.jpexs.decompiler.graph.model.ForItem; +import com.jpexs.decompiler.graph.model.GotoItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.IntegerValueItem; +import com.jpexs.decompiler.graph.model.LabelItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.LogicalOpItem; import com.jpexs.decompiler.graph.model.LoopItem; @@ -37,8 +43,10 @@ import com.jpexs.decompiler.graph.model.OrItem; import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.UniversalLoopItem; import com.jpexs.decompiler.graph.model.WhileItem; +import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -422,14 +430,15 @@ public class Graph { for (GraphPart head : heads) { populateParts(head, allParts); } - TranslateStack stack = new TranslateStack(); + TranslateStack stack = new TranslateStack(path); List loops = new ArrayList<>(); getLoops(localData, heads.get(0), loops, null); - /*System.out.println(""); + /*1 + System.err.println(""); for (Loop el : loops) { - System.out.println(el); + System.err.println(el); } - System.out.println("");*/ + System.err.println("");*/ getPrecontinues(path, localData, null, heads.get(0), allParts, loops, null); /*System.err.println(""); for (Loop el : loops) { @@ -437,7 +446,7 @@ public class Graph { } System.err.println("");//*/ - List ret = printGraph(localData, stack, allParts, null, heads.get(0), null, loops, staticOperation, path); + List ret = printGraph(new HashMap<>(), new HashMap<>(), localData, stack, allParts, null, heads.get(0), null, loops, staticOperation, path); processIfs(ret); finalProcessStack(stack, ret); finalProcessAll(ret, 0, new FinalProcessLocalData()); @@ -461,8 +470,59 @@ public class Graph { finalProcessAfter(list, level, localData); } - protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData) { + private boolean processSubBlk(Block b, GraphTargetItem replacement) { + boolean allSubPush = true; + boolean atleastOne = false; + for (List sub : b.getSubs()) { + if (!sub.isEmpty()) { + int lastPos = sub.size() - 1; + GraphTargetItem last = sub.get(sub.size() - 1); + GraphTargetItem br = null; + + if ((last instanceof BreakItem) && (sub.size() >= 2)) { + br = last; + lastPos--; + last = sub.get(lastPos); + } + if (last instanceof Block) { + if (!processSubBlk((Block) last, replacement)) { + allSubPush = false; + } else { + atleastOne = true; + } + } else if (last instanceof PushItem) { + if (replacement != null) { + GraphTargetItem e2 = (((GraphTargetItem) replacement).clone()); + e2.value = last.value; + sub.set(lastPos, e2); + if (br != null) { + sub.remove(sub.size() - 1); + } + } + atleastOne = true; + } else if (!(last instanceof ExitItem)) { + allSubPush = false; + } + } + } + return allSubPush && atleastOne; + } + + protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData) { + if (list.size() >= 2) { + if (list.get(list.size() - 1) instanceof ExitItem) { + ExitItem e = (ExitItem) list.get(list.size() - 1); + if (list.get(list.size() - 1).value instanceof PopItem) { + if (list.get(list.size() - 2) instanceof Block) { + Block b = (Block) list.get(list.size() - 2); + if (processSubBlk(b, (GraphTargetItem) e)) { + list.remove(list.size() - 1); + } + } + } + } + } } protected void finalProcess(List list, int level, FinalProcessLocalData localData) { @@ -527,7 +587,7 @@ public class Graph { } private void processIfs(List list) { - //if(true) return; + for (int i = 0; i < list.size(); i++) { GraphTargetItem item = list.get(i); if (item instanceof Block) { @@ -673,7 +733,7 @@ public class Graph { return false; } - protected List check(GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { + protected List check(Map> partCodes, Map partCodePos, GraphSource code, BaseLocalData localData, List allParts, TranslateStack stack, GraphPart parent, GraphPart part, List stopPart, List loops, List output, Loop currentLoop, int staticOperation, String path) throws InterruptedException { return null; } @@ -749,9 +809,9 @@ public class Graph { list.remove(list.size() - 1); } - protected List printGraph(BaseLocalData localData, TranslateStack stack, List allParts, GraphPart parent, GraphPart part, List stopPart, List loops, int staticOperation, String path) throws InterruptedException { + protected List printGraph(Map> partCodes, Map partCodePos, BaseLocalData localData, TranslateStack stack, List allParts, GraphPart parent, GraphPart part, List stopPart, List loops, int staticOperation, String path) throws InterruptedException { List visited = new ArrayList<>(); - return printGraph(visited, localData, stack, allParts, parent, part, stopPart, loops, null, staticOperation, path, 0); + return printGraph(partCodes, partCodePos, visited, localData, stack, allParts, parent, part, stopPart, loops, null, staticOperation, path, 0); } protected GraphTargetItem checkLoop(LoopItem loopItem, BaseLocalData localData, List loops) { @@ -1247,7 +1307,7 @@ public class Graph { } } - protected List printGraph(List visited, BaseLocalData localData, TranslateStack stack, List allParts, GraphPart parent, GraphPart part, List stopPart, List loops, List ret, int staticOperation, String path, int recursionLevel) throws InterruptedException { + protected List printGraph(Map> partCodes, Map partCodePos, List visited, BaseLocalData localData, TranslateStack stack, List allParts, GraphPart parent, GraphPart part, List stopPart, List loops, List ret, int staticOperation, String path, int recursionLevel) throws InterruptedException { if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } @@ -1257,11 +1317,7 @@ public class Graph { if (recursionLevel > allParts.size() + 1) { throw new TranslateException("printGraph max recursion level reached."); } - if (visited.contains(part)) { - //return new ArrayList(); - } else { - visited.add(part); - } + if (ret == null) { ret = new ArrayList<>(); } @@ -1321,7 +1377,7 @@ public class Graph { } if (el.phase != 1) { if (debugMode) { - //System.err.println("ignoring loop "+el); + System.err.println("ignoring loop " + el); } continue; } @@ -1361,18 +1417,9 @@ public class Graph { if (currentLoop != null) { currentLoop.phase = 0; } - /*switch (part.stopPartType) { - case AND_OR: - part.setAndOrStack(stack); //Save stack for later use - break; - - case COMMONPART: - part.setCommonPartStack(stack); //Save stack for later use - break; - - case NONE: - break; - }*/ + if (debugMode) { + System.err.println("Stopped on part " + part); + } return ret; } @@ -1380,9 +1427,30 @@ public class Graph { ret.add(new ScriptEndItem()); return ret; } + + if (visited.contains(part)) { + String labelName = "addr" + part.start; + List firstCode = partCodes.get(part); + int firstCodePos = partCodePos.get(part); + if (firstCode.size() > firstCodePos && (firstCode.get(firstCodePos) instanceof LabelItem)) { + labelName = ((LabelItem) firstCode.get(firstCodePos)).labelName; + } else { + firstCode.add(firstCodePos, new LabelItem(null, labelName)); + } + ret.add(new GotoItem(null, labelName)); + return ret; + } else { + visited.add(part); + partCodes.put(part, ret); + partCodePos.put(part, ret.size()); + } List currentRet = ret; UniversalLoopItem loopItem = null; + TranslateStack sPreLoop = stack; if (isLoop) { + //makeAllCommands(currentRet, stack); + stack = (TranslateStack) stack.clone(); + stack.clear(); loopItem = new UniversalLoopItem(null, currentLoop); //loopItem.commands=printGraph(visited, localData, stack, allParts, parent, part, stopPart, loops); currentRet.add(loopItem); @@ -1412,25 +1480,8 @@ public class Graph { } } - //Assuming part with two nextparts is an IF - - /* //If with both branches empty - if (part.nextParts.size() == 2) { - if (part.nextParts.get(0) == part.nextParts.get(1)) { - if (!stack.isEmpty()) { - GraphTargetItem expr = stack.pop(); - if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); - } else { - expr = new NotItem(null, expr); - } - output.add(new IfItem(null, expr, new ArrayList(), new ArrayList())); - } - part.nextParts.remove(0); - } - }*/ if (parseNext) { - List retCheck = check(code, localData, allParts, stack, parent, part, stopPart, loops, output, currentLoop, staticOperation, path); + List retCheck = check(partCodes, partCodePos, code, localData, allParts, stack, parent, part, stopPart, loops, output, currentLoop, staticOperation, path); if (retCheck != null) { if (!retCheck.isEmpty()) { currentRet.addAll(retCheck); @@ -1441,134 +1492,15 @@ public class Graph { currentRet.addAll(output); } } - - /** - * AND / OR detection - */ - if (parseNext && part.nextParts.size() == 2) { - if ((stack.size() >= 2) && (stack.get(stack.size() - 1) instanceof NotItem) && (((NotItem) (stack.get(stack.size() - 1))).getOriginal().getNotCoerced() == stack.get(stack.size() - 2).getNotCoerced())) { - GraphPart sp0 = getNextNoJump(part.nextParts.get(0), localData); - GraphPart sp1 = getNextNoJump(part.nextParts.get(1), localData); - boolean reversed = false; - loopContinues = getLoopsContinues(loops); - loopContinues.add(part);//??? - if (sp1.leadsTo(localData, this, code, sp0, loops)) { - } else if (sp0.leadsTo(localData, this, code, sp1, loops)) { - reversed = true; - } - GraphPart next = reversed ? sp0 : sp1; - GraphTargetItem ti; - if ((ti = checkLoop(next, stopPart, loops)) != null) { - currentRet.add(ti); - } else { - List stopPart2 = new ArrayList<>(stopPart); - GraphPart andOrStopPart = reversed ? sp1 : sp0; - stopPart2.add(andOrStopPart); - GraphTargetItem first = ((NotItem) stack.pop()).getOriginal(); - stack.pop(); - stack.push(new MarkItem("disposable")); - printGraph(visited, localData, stack, allParts, parent, next, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); - GraphTargetItem second = stack.pop(); - - if (!reversed) { - AndItem a = new AndItem(null, first, second); - stack.push(a); - a.firstPart = part; - if (second instanceof AndItem) { - a.firstPart = ((AndItem) second).firstPart; - } - if (second instanceof OrItem) { - a.firstPart = ((OrItem) second).firstPart; - } - } else { - OrItem o = new OrItem(null, first, second); - stack.push(o); - o.firstPart = part; - if (second instanceof AndItem) { - o.firstPart = ((AndItem) second).firstPart; - } - if (second instanceof OrItem) { - o.firstPart = ((OrItem) second).firstPart; - } - } - next = reversed ? sp1 : sp0; - if ((ti = checkLoop(next, stopPart, loops)) != null) { - currentRet.add(ti); - } else { - currentRet.addAll(printGraph(visited, localData, stack, allParts, parent, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); - } - } - parseNext = false; - //return ret; - } else if ((stack.size() >= 2) && (stack.get(stack.size() - 1).getNotCoerced() == stack.get(stack.size() - 2).getNotCoerced())) { - GraphPart sp0 = getNextNoJump(part.nextParts.get(0), localData); - GraphPart sp1 = getNextNoJump(part.nextParts.get(1), localData); - boolean reversed = false; - loopContinues = getLoopsContinues(loops); - loopContinues.add(part);//??? - if (sp1.leadsTo(localData, this, code, sp0, loops)) { - } else if (sp0.leadsTo(localData, this, code, sp1, loops)) { - reversed = true; - } - GraphPart next = reversed ? sp0 : sp1; - GraphTargetItem ti; - if ((ti = checkLoop(next, stopPart, loops)) != null) { - currentRet.add(ti); - } else { - List stopPart2 = new ArrayList<>(stopPart); - GraphPart andOrStopPart = reversed ? sp1 : sp0; - //andOrStopPart.stopPartType = GraphPart.StopPartType.AND_OR; - stopPart2.add(andOrStopPart); - GraphTargetItem first = stack.pop(); - stack.pop(); - stack.push(new MarkItem("disposable")); - printGraph(visited, localData, stack, allParts, parent, next, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); - //stack = andOrStopPart.andOrStack; // Use stack that was stored upon reaching AND_OR stopPart - GraphTargetItem second = stack.pop(); - //GraphTargetItem first = stack.pop(); - //andOrStopPart.stopPartType = GraphPart.StopPartType.NONE; // Reset stopPartType - - if (reversed) { - AndItem a = new AndItem(null, first, second); - stack.push(a); - a.firstPart = part; - if (second instanceof AndItem) { - a.firstPart = ((AndItem) second).firstPart; - } - if (second instanceof OrItem) { - a.firstPart = ((OrItem) second).firstPart; - } - } else { - OrItem o = new OrItem(null, first, second); - stack.push(o); - o.firstPart = part; - if (second instanceof OrItem) { - o.firstPart = ((OrItem) second).firstPart; - } - if (second instanceof AndItem) { - o.firstPart = ((AndItem) second).firstPart; - } - } - - next = reversed ? sp1 : sp0; - if ((ti = checkLoop(next, stopPart, loops)) != null) { - currentRet.add(ti); - } else { - currentRet.addAll(printGraph(visited, localData, stack, allParts, parent, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); - } - } - parseNext = false; - //return ret; - } - } //********************************END PART DECOMPILING - if (parseNext) { if (part.nextParts.size() > 2) {//direct switch, seen in the wild... GraphPart next = getMostCommonPart(localData, part.nextParts, loops); List vis = new ArrayList<>(); GraphTargetItem switchedItem = stack.pop(); + makeAllCommands(currentRet, stack); + List caseValues = new ArrayList<>(); List> caseCommands = new ArrayList<>(); List defaultCommands = new ArrayList<>(); @@ -1604,10 +1536,15 @@ public class Graph { } } if (next != p) { + //int stackLenBefore = stack.size(); + TranslateStack s2 = (TranslateStack) stack.clone(); + s2.clear(); + List nextCommands = printGraph(partCodes, partCodePos, visited, prepareBranchLocalData(localData), s2, allParts, part, p, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + makeAllCommands(nextCommands, s2); if (first) { - defaultCommands = printGraph(visited, prepareBranchLocalData(localData), stack, allParts, part, p, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + defaultCommands = nextCommands; } else { - caseCommands.add(printGraph(visited, prepareBranchLocalData(localData), stack, allParts, part, p, stopPart2, loops, null, staticOperation, path, recursionLevel + 1)); + caseCommands.add(nextCommands); } vis.add(p); } @@ -1617,107 +1554,93 @@ public class Graph { currentRet.add(sw); swLoop.phase = 2; if (next != null) { - currentRet.addAll(printGraph(visited, localData, stack, allParts, part, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); + currentRet.addAll(printGraph(partCodes, partCodePos, visited, localData, stack, allParts, part, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); } } //else GraphPart nextOnePart = null; if (part.nextParts.size() == 2) { GraphTargetItem expr = stack.pop(); - if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); - } else { - expr = new NotItem(null, expr); - } - if (staticOperation != SOP_USE_STATIC) { - if (expr.isCompileTime()) { - boolean doJump = EcmaScript.toBoolean(expr.getResult()); - if (doJump) { - nextOnePart = part.nextParts.get(0); - } else { - nextOnePart = part.nextParts.get(1); - } - if (staticOperation == SOP_REMOVE_STATIC) { - //TODO - } - } - } + /*if (expr instanceof LogicalOpItem) { + expr = ((LogicalOpItem) expr).invert(); + } else { + expr = new NotItem(null, expr); + }*/ if (nextOnePart == null) { List nps; - /*nps = new ArrayList<>(part.nextParts); - for(int i=0;i onTrue = new ArrayList<>(); - boolean isEmpty = nps.get(0) == nps.get(1); + trueStack.clear(); + falseStack.clear(); if (isEmpty) { next = nps.get(0); } + boolean hasOntrue = nps.get(1) != next; + boolean hasOnFalse = nps.get(0) != next; List stopPart2 = new ArrayList<>(stopPart); - //GraphPart.CommonPartStack commonPartStack = null; + if ((!isEmpty) && (next != null)) { - /*commonPartStack = next.new CommonPartStack(); - if (next.commonPartStacks == null) { - next.commonPartStacks = new ArrayList<>(); - } - next.stopPartType = GraphPart.StopPartType.COMMONPART; - */ stopPart2.add(next); } - if (!isEmpty) { - onTrue = printGraph(visited, prepareBranchLocalData(localData), trueStack, allParts, part, nps.get(1), stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + List onTrue = new ArrayList<>(); + if (!isEmpty && hasOntrue) { + onTrue = printGraph(partCodes, partCodePos, visited, prepareBranchLocalData(localData), trueStack, allParts, part, nps.get(1), stopPart2, loops, null, staticOperation, path, recursionLevel + 1); } List onFalse = new ArrayList<>(); - if (!isEmpty) { - /*if (next != null) { - commonPartStack.isTrueStack = false; //stopPart must know it needs to store falseStack - }*/ - onFalse = printGraph(visited, prepareBranchLocalData(localData), falseStack, allParts, part, nps.get(0), stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + if (!isEmpty && hasOnFalse) { + onFalse = printGraph(partCodes, partCodePos, visited, prepareBranchLocalData(localData), falseStack, allParts, part, nps.get(0), stopPart2, loops, null, staticOperation, path, recursionLevel + 1); } + //List out2 = new ArrayList<>(); + //makeAllCommands(out2, stack); + makeAllCommands(onTrue, trueStack); + makeAllCommands(onFalse, falseStack); - /* if there is a stopPart (next), then Graph will be further analyzed starting from the stopPart: - * trueStack and falseStack must be set equal to corresponding stack that was built upon reaching stopPart. - if ((!isEmpty) && (next != null)) { - if ((commonPartStack.trueStack != null) && (commonPartStack.falseStack != null)) { - trueStack = commonPartStack.trueStack; - falseStack = commonPartStack.falseStack; - } - next.commonPartStacks.remove(next.commonPartStacks.size() - 1); - if (next.commonPartStacks.isEmpty()) { - next.stopPartType = GraphPart.StopPartType.NONE; // reset StopPartType - } - }*/ - if (isEmpty(onTrue) && isEmpty(onFalse) && (trueStack.size() == trueStackSizeBefore + 1) && (falseStack.size() == falseStackSizeBefore + 1)) { - stack.push(new TernarOpItem(null, expr, trueStack.pop(), falseStack.pop())); + if (!isEmpty(onTrue) && !isEmpty(onFalse) && onTrue.size() == 1 && onFalse.size() == 1 && (onTrue.get(0) instanceof PushItem) && (onFalse.get(0) instanceof PushItem)) { + stack.push(new TernarOpItem(null, expr.invert(null), ((PushItem) onTrue.get(0)).value, ((PushItem) onFalse.get(0)).value)); } else { - currentRet.add(new IfItem(null, expr, onTrue, onFalse)); - } - if (next != null) { - if (trueStack.size() != trueStackSizeBefore || falseStack.size() != falseStackSizeBefore) { - // it's a hack, because duplicates all instructions in the next part, but better than EmptyStackException - onTrue = printGraph(visited, localData, trueStack, allParts, part, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1); - onFalse = printGraph(visited, localData, falseStack, allParts, part, next, stopPart, loops, null, staticOperation, path, recursionLevel + 1); - if (isEmpty(onTrue) && isEmpty(onFalse) && (trueStack.size() == trueStackSizeBefore + 1) && (falseStack.size() == falseStackSizeBefore + 1)) { - stack.push(new TernarOpItem(null, expr, trueStack.pop(), falseStack.pop())); + boolean isIf = true; + if (!stack.isEmpty() && onFalse.isEmpty() && onTrue.size() == 2 && (onTrue.get(0) instanceof PopItem) && (onTrue.get(1) instanceof PushItem)) { + GraphTargetItem prevExpr = stack.pop(); + GraphTargetItem leftSide = expr; + + GraphTargetItem rightSide = ((PushItem) onTrue.get(1)).value; + if (leftSide instanceof DuplicateItem) { + isIf = false; + stack.push(new OrItem(null, prevExpr, rightSide)); + } else if (leftSide.invert(null) instanceof DuplicateItem) { + isIf = false; + stack.push(new AndItem(null, prevExpr, rightSide)); + } else if (prevExpr instanceof FalseItem) { + isIf = false; + stack.push(new OrItem(null, leftSide, rightSide)); + } else if (prevExpr instanceof TrueItem) { + isIf = false; + stack.push(new AndItem(null, leftSide, rightSide)); } else { - currentRet.add(new IfItem(null, expr, onTrue, onFalse)); + //:-( } - } else { - printGraph(visited, localData, stack, allParts, part, next, stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); } + + if (isIf) { + makeAllCommands(currentRet, stack); + IfItem b = new IfItem(null, expr.invert(null), onTrue, onFalse); + currentRet.add(b); + if (processSubBlk(b, null)) { + stack.push(new PopItem(null)); + } + } + } + //currentRet.addAll(out2); + if (next != null) { + printGraph(partCodes, partCodePos, visited, localData, stack, allParts, part, next, stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); //currentRet.addAll(); } } @@ -1726,7 +1649,7 @@ public class Graph { nextOnePart = part.nextParts.get(0); } if (nextOnePart != null) { - printGraph(visited, localData, stack, allParts, part, part.nextParts.get(0), stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); + printGraph(partCodes, partCodePos, visited, localData, stack, allParts, part, part.nextParts.get(0), stopPart, loops, currentRet, staticOperation, path, recursionLevel + 1); } } @@ -1751,7 +1674,7 @@ public class Graph { stopContPart.add(currentLoop.loopContinue); GraphPart precoBackup = currentLoop.loopPreContinue; currentLoop.loopPreContinue = null; - loopItem.commands.addAll(printGraph(visited, localData, new TranslateStack(), allParts, null, precoBackup, stopContPart, loops, null, staticOperation, path, recursionLevel + 1)); + loopItem.commands.addAll(printGraph(partCodes, partCodePos, visited, localData, new TranslateStack(path), allParts, null, precoBackup, stopContPart, loops, null, staticOperation, path, recursionLevel + 1)); } } @@ -1777,7 +1700,10 @@ public class Graph { } else if (loopItem.commands.size() == 2 && (loopItem.commands.get(1) instanceof BreakItem)) { BreakItem bi = (BreakItem) loopItem.commands.get(1); if (bi.loopId == currentLoop.id) { - bodyBranch = ifi.onTrue; + if (ifi.onTrue.isEmpty()) { + inverted = true; + } + bodyBranch = inverted ? ifi.onFalse : ifi.onTrue; breakpos2 = true; } } @@ -1788,7 +1714,7 @@ public class Graph { GraphTargetItem expr = ifi.expression; if (inverted) { if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); + expr = ((LogicalOpItem) expr).invert(null); } else { expr = new NotItem(null, expr); } @@ -1808,7 +1734,7 @@ public class Graph { currentLoop.loopPreContinue = null; List stopPart2 = new ArrayList<>(stopPart); stopPart2.add(currentLoop.loopContinue); - finalComm = printGraph(visited, localData, new TranslateStack(), allParts, null, backup, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + finalComm = printGraph(partCodes, partCodePos, visited, localData, new TranslateStack(path), allParts, null, backup, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); currentLoop.loopPreContinue = backup; checkContinueAtTheEnd(finalComm, currentLoop); } @@ -1848,11 +1774,7 @@ public class Graph { List exprList = new ArrayList<>(); GraphTargetItem expr = ifi.expression; if (inverted) { - if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); - } else { - expr = new NotItem(null, expr); - } + expr = expr.invert(null); } checkContinueAtTheEnd(bodyBranch, currentLoop); @@ -1889,7 +1811,7 @@ public class Graph { currentLoop.loopPreContinue = null; List stopPart2 = new ArrayList<>(stopPart); stopPart2.add(currentLoop.loopContinue); - List finalComm = printGraph(visited, localData, new TranslateStack(), allParts, null, backup, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); + List finalComm = printGraph(partCodes, partCodePos, visited, localData, new TranslateStack(path), allParts, null, backup, stopPart2, loops, null, staticOperation, path, recursionLevel + 1); currentLoop.loopPreContinue = backup; checkContinueAtTheEnd(finalComm, currentLoop); @@ -1914,11 +1836,7 @@ public class Graph { List exprList = new ArrayList<>(finalComm); GraphTargetItem expr = ifi.expression; if (invert) { - if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); - } else { - expr = new NotItem(null, expr); - } + expr = expr.invert(null); } exprList.add(expr); ret.add(index, li = new DoWhileItem(null, currentLoop, loopItem.commands, exprList)); @@ -1943,7 +1861,7 @@ public class Graph { } if (currentLoop.loopBreak != null) { - ret.addAll(printGraph(visited, localData, stack, allParts, part, currentLoop.loopBreak, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); + ret.addAll(printGraph(partCodes, partCodePos, visited, localData, sPreLoop, allParts, part, currentLoop.loopBreak, stopPart, loops, null, staticOperation, path, recursionLevel + 1)); } } @@ -2157,4 +2075,35 @@ public class Graph { } while (part != null); return ret; } + + protected static void makeAllStack(List commands, TranslateStack stack) { + int pcnt = 0; + for (int i = commands.size() - 1; i >= 0; i--) { + if (commands.get(i) instanceof PushItem) { + pcnt++; + } else { + break; + } + } + for (int i = commands.size() - pcnt; i < commands.size(); i++) { + stack.push(commands.remove(i).value); + i--; + } + } + + protected static void makeAllCommands(List commands, TranslateStack stack) { + int clen = commands.size(); + BreakItem br = null; + if (!commands.isEmpty()) { + if (commands.get(commands.size() - 1) instanceof BreakItem) { + clen--; + } + } + while (stack.size() > 0) { + GraphTargetItem p = stack.pop(); + if (!(p instanceof PopItem)) { + commands.add(clen, new PushItem(p)); + } + } + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java index 6d7208e92..e01f6a868 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java @@ -1,16 +1,13 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ @@ -24,7 +21,7 @@ import java.util.List; * * @author JPEXS */ -public interface GraphSourceItem extends Serializable { +public interface GraphSourceItem extends Serializable, Cloneable { public void translate(BaseLocalData localData, TranslateStack stack, List output, int staticOperation, String path) throws InterruptedException; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index b5c5aa4b5..0feda2850 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.hilight.HighlightData; import com.jpexs.decompiler.graph.model.BinaryOp; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.decompiler.graph.model.NotItem; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; @@ -33,7 +34,7 @@ import java.util.Set; * * @author JPEXS */ -public abstract class GraphTargetItem implements Serializable { +public abstract class GraphTargetItem implements Serializable, Cloneable { public static final int PRECEDENCE_PRIMARY = 0; @@ -295,4 +296,21 @@ public abstract class GraphTargetItem implements Serializable { } public abstract GraphTargetItem returnType(); + + @Override + protected GraphTargetItem clone() { + try { + return (GraphTargetItem) super.clone(); + } catch (CloneNotSupportedException ex) { + return null; + } + } + + /*public GraphTargetItem invert() { + return invert(null); + }*/ + public GraphTargetItem invert(GraphSourceItem src) { + return new NotItem(src, this); + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ScopeStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ScopeStack.java index af1152907..59f630cfd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ScopeStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ScopeStack.java @@ -16,11 +16,17 @@ */ package com.jpexs.decompiler.graph; -import java.util.Stack; - /** * * @author JPEXS */ -public class ScopeStack extends Stack { +public class ScopeStack extends TranslateStack { + + public ScopeStack(boolean allowEmpty) { + super(allowEmpty ? "scope" : null); + } + + public ScopeStack() { + this(true); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SimpleValue.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SimpleValue.java new file mode 100644 index 000000000..e9bd81880 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SimpleValue.java @@ -0,0 +1,10 @@ +package com.jpexs.decompiler.graph; + +/** + * + * @author JPEXS + */ +public interface SimpleValue { + + public boolean isSimpleValue(); +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java index 7c1694d78..0eb8d34b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/SourceGenerator.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -22,12 +23,14 @@ import com.jpexs.decompiler.graph.model.CommaExpressionItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DoWhileItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import com.jpexs.decompiler.graph.model.FalseItem; import com.jpexs.decompiler.graph.model.ForItem; import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.NotItem; import com.jpexs.decompiler.graph.model.OrItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.TernarOpItem; +import com.jpexs.decompiler.graph.model.TrueItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.util.List; @@ -37,6 +40,10 @@ import java.util.List; */ public interface SourceGenerator { + public List generate(SourceGeneratorLocalData localData, TrueItem item) throws CompilationException; + + public List generate(SourceGeneratorLocalData localData, FalseItem item) throws CompilationException; + public List generate(SourceGeneratorLocalData localData, AndItem item) throws CompilationException; public List generate(SourceGeneratorLocalData localData, OrItem item) throws CompilationException; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java index 647519182..72ca11740 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TranslateStack.java @@ -16,11 +16,62 @@ */ package com.jpexs.decompiler.graph; +import com.jpexs.decompiler.graph.model.PopItem; import java.util.Stack; +import java.util.logging.Level; +import java.util.logging.Logger; /** * * @author JPEXS */ public class TranslateStack extends Stack { + + private static PopItem pop = new PopItem(null); + + private String path; + + public TranslateStack(String path) { + this.path = path; + } + + public String getPath() { + return path; + } + + @Override + public synchronized GraphTargetItem get(int index) { + if (path != null) { + if (index >= this.size() || index < 0) { + Logger.getLogger(TranslateStack.class.getName()).log(Level.FINE, "{0}: Attemp to Get item outside of bounds of stack", path); + return pop; + } + } + return super.get(index); + } + + @Override + public synchronized GraphTargetItem peek() { + if (path != null) { + if (this.isEmpty()) { + Logger.getLogger(TranslateStack.class.getName()).log(Level.FINE, "{0}: Attemp to Peek empty stack", path); + return pop; + } + } + return super.peek(); + } + + @Override + public synchronized GraphTargetItem pop() { + if (path != null) { + if (this.isEmpty()) { + PopItem oldpop = pop; + pop = new PopItem(null); + Logger.getLogger(TranslateStack.class.getName()).log(Level.FINE, "{0}: Attemp to Pop empty stack", path); + return oldpop; + } + } + return super.pop(); + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java index ad27e56ea..9dc3bc898 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java @@ -31,33 +31,37 @@ import java.util.Objects; * @author JPEXS */ public class TypeItem extends GraphTargetItem { - + public static TypeItem BOOLEAN = new TypeItem("Boolean"); - + public static TypeItem STRING = new TypeItem("String"); - + public static TypeItem ARRAY = new TypeItem("Array"); - + public static UnboundedTypeItem UNBOUNDED = new UnboundedTypeItem(); - - public String fullTypeName; - - public TypeItem(String fullTypeName) { + + public DottedChain fullTypeName; + + public TypeItem(String s) { + this(s == null ? new DottedChain() : new DottedChain(s.split("\\."))); + } + + public TypeItem(DottedChain fullTypeName) { this(fullTypeName, new ArrayList()); } - - public TypeItem(String fullTypeName, List subtypes) { + + public TypeItem(DottedChain fullTypeName, List subtypes) { super(null, NOPRECEDENCE); this.fullTypeName = fullTypeName; } - + @Override public int hashCode() { int hash = 7; hash = 83 * hash + Objects.hashCode(this.fullTypeName); return hash; } - + @Override public boolean equals(Object obj) { if (obj == null) { @@ -72,37 +76,33 @@ public class TypeItem extends GraphTargetItem { } return true; } - + @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { if (localData.fullyQualifiedNames.contains(fullTypeName)) { - writer.hilightSpecial(IdentifiersDeobfuscation.printNamespace(localData.constantsAvm2 != null, fullTypeName), HighlightSpecialType.TYPE_NAME, fullTypeName); + writer.hilightSpecial(IdentifiersDeobfuscation.printNamespace(localData.constantsAvm2 != null, fullTypeName.toPrintableString()), HighlightSpecialType.TYPE_NAME, fullTypeName.toPrintableString()); } else { - String simpleName = fullTypeName; - if (simpleName.contains(".")) { - simpleName = simpleName.substring(simpleName.lastIndexOf('.') + 1); - } - writer.hilightSpecial(IdentifiersDeobfuscation.printNamespace(localData.constantsAvm2 != null, simpleName), HighlightSpecialType.TYPE_NAME, fullTypeName); + writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(localData.constantsAvm2 != null, fullTypeName.getLast()), HighlightSpecialType.TYPE_NAME, fullTypeName.toPrintableString()); } - + return writer; } - + @Override public GraphTargetItem returnType() { return this; } - + @Override public boolean hasReturnValue() { return true; } - + @Override public String toString() { - return fullTypeName; + return fullTypeName.toString(); } - + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { return generator.generate(localData, this); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java index c1f8f8f87..3e655bdf3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DuplicateItem.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -20,6 +21,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; @@ -29,7 +31,7 @@ import java.util.Set; * * @author JPEXS */ -public class DuplicateItem extends GraphTargetItem { +public class DuplicateItem extends GraphTargetItem implements SimpleValue { public DuplicateItem(GraphSourceItem src, GraphTargetItem value) { super(src, value.getPrecedence()); @@ -43,7 +45,12 @@ public class DuplicateItem extends GraphTargetItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - return value.toString(writer, localData); + if ((value instanceof SimpleValue) && (((SimpleValue) value).isSimpleValue())) { + return value.appendTo(writer, localData); + } + writer.append("§§dup("); + value.appendTo(writer, localData); + return writer.append(")"); } @Override @@ -89,4 +96,14 @@ public class DuplicateItem extends GraphTargetItem { public GraphTargetItem returnType() { return TypeItem.UNBOUNDED; } + + /*@Override + public GraphTargetItem invert(GraphSourceItem src) { + return //new DuplicateItem(src, value instanceof NotItem ? (value.value) : new NotItem(src, value)); + }*/ + @Override + public boolean isSimpleValue() { + return ((value instanceof SimpleValue) && ((SimpleValue) value).isSimpleValue()); + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ExitItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ExitItem.java index b02e93c69..b1a6fefe6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ExitItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ExitItem.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/FalseItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/FalseItem.java new file mode 100644 index 000000000..58691a0b8 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/FalseItem.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; +import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class FalseItem extends GraphTargetItem implements LogicalOpItem, SimpleValue { + + public FalseItem(GraphSourceItem src) { + super(src, PRECEDENCE_PRIMARY); + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { + return writer.append("false"); + } + + @Override + public boolean hasReturnValue() { + return true; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.BOOLEAN; + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return generator.generate(localData, this); + } + + @Override + public GraphTargetItem invert(GraphSourceItem neqSrc) { + return new TrueItem(null); + } + + @Override + public boolean isSimpleValue() { + return true; + } + + @Override + public boolean isCompileTime() { + return true; + } + + @Override + public Object getResult() { + return Boolean.FALSE; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java new file mode 100644 index 000000000..d2c0a312c --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/GotoItem.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.ecma.Null; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; + +/** + * + * @author JPEXS + */ +public class GotoItem extends GraphTargetItem { + + public String labelName; + + public GotoItem(GraphSourceItem src, String labelName) { + super(src, PRECEDENCE_PRIMARY); + this.labelName = labelName; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + writer.append("§§goto(" + labelName + ")"); + return writer; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + @Override + public Object getResult() { + return null; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java index c3bd312ca..43f9f7caf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java @@ -75,11 +75,7 @@ public class IfItem extends GraphTargetItem implements Block { expr = ((NotItem) expr).getOriginal(); } } else { - if (expr instanceof LogicalOpItem) { - expr = ((LogicalOpItem) expr).invert(); - } else { - expr = new NotItem(null, expr); - } + expr = expr.invert(null); ifBranch = onFalse; elseBranch = onTrue; } @@ -112,7 +108,10 @@ public class IfItem extends GraphTargetItem implements Block { } for (GraphTargetItem ti : elseBranch) { if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); + ti.toStringSemicoloned(writer, localData); + if (!elseIf) { + writer.newLine(); + } } } if (!elseIf) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LabelItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LabelItem.java new file mode 100644 index 000000000..fa61ceafb --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LabelItem.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.ecma.Null; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; + +/** + * + * @author JPEXS + */ +public class LabelItem extends GraphTargetItem { + + public String labelName; + + public LabelItem(GraphSourceItem src, String labelName) { + super(src, PRECEDENCE_PRIMARY); + this.labelName = labelName; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + writer.append(labelName + ":"); + return writer; + } + + @Override + public boolean needsNewLine() { + return false; + } + + @Override + public boolean needsSemicolon() { + return false; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + @Override + public Object getResult() { + return null; + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LogicalOpItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LogicalOpItem.java index 3cfd1eaad..de055b908 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LogicalOpItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LogicalOpItem.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; +import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; /** @@ -23,5 +25,5 @@ import com.jpexs.decompiler.graph.GraphTargetItem; */ public interface LogicalOpItem { - public GraphTargetItem invert(); + public GraphTargetItem invert(GraphSourceItem src); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/NotItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/NotItem.java index a7369764f..5becbe13e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/NotItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/NotItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -57,11 +58,6 @@ public class NotItem extends UnaryOpItem implements LogicalOpItem, Inverted { return value.isCompileTime(dependencies); } - @Override - public GraphTargetItem invert() { - return value; - } - public GraphTargetItem getOriginal() { return value; } @@ -80,4 +76,10 @@ public class NotItem extends UnaryOpItem implements LogicalOpItem, Inverted { public GraphTargetItem returnType() { return TypeItem.BOOLEAN; } + + @Override + public GraphTargetItem invert(GraphSourceItem src) { + return value; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java new file mode 100644 index 000000000..68ed404f5 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PopItem.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.ecma.Null; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; + +/** + * + * @author JPEXS + */ +public class PopItem extends GraphTargetItem { + + public PopItem(GraphSourceItem src) { + super(src, PRECEDENCE_PRIMARY); + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + //Logger.getLogger(PopItem.class.getName()).log(Level.WARNING, "Pop item left in the source code"); + writer.append("§§pop()"); + return writer; + } + + @Override + public boolean hasReturnValue() { + return true; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + @Override + public Object getResult() { + return new Null(); + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java new file mode 100644 index 000000000..a26566786 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/PushItem.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.graph.model; + +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.GraphTargetItem; + +/** + * + * @author JPEXS + */ +public class PushItem extends GraphTargetItem { + + public PushItem(GraphTargetItem val) { + super(val.src, val.getPrecedence()); + this.value = val; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + //Logger.getLogger(PushItem.class.getName()).log(Level.WARNING, "Push item left in the source code"); + writer.append("§§push("); + value.appendTo(writer, localData); + writer.append(")"); + return writer; + } + + @Override + public boolean hasReturnValue() { + return true; + } + + @Override + public GraphTargetItem returnType() { + return value.returnType(); + } + + @Override + public GraphTargetItem getNotCoerced() { + return value.getNotCoerced(); + } + + @Override + public GraphTargetItem getThroughDuplicate() { + return value.getThroughDuplicate(); + } + + @Override + public GraphTargetItem getThroughRegister() { + return value.getThroughRegister(); + } + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TrueItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TrueItem.java index 07ebbbd62..2421816a6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TrueItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/TrueItem.java @@ -1,30 +1,36 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SimpleValue; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; +import java.util.List; /** * * @author JPEXS */ -public class TrueItem extends GraphTargetItem { +public class TrueItem extends GraphTargetItem implements LogicalOpItem, SimpleValue { public TrueItem(GraphSourceItem src) { super(src, PRECEDENCE_PRIMARY); @@ -44,4 +50,30 @@ public class TrueItem extends GraphTargetItem { public GraphTargetItem returnType() { return TypeItem.BOOLEAN; } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return generator.generate(localData, this); + } + + @Override + public GraphTargetItem invert(GraphSourceItem neqSrc) { + return new FalseItem(null); + } + + @Override + public boolean isSimpleValue() { + return true; + } + + @Override + public boolean isCompileTime() { + return true; + } + + @Override + public Object getResult() { + return Boolean.TRUE; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UnaryOpItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UnaryOpItem.java index 9c4d3f434..d9fa93719 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UnaryOpItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UnaryOpItem.java @@ -25,8 +25,6 @@ import java.util.Set; public abstract class UnaryOpItem extends GraphTargetItem implements UnaryOp { - public GraphTargetItem value; - public String operator; public UnaryOpItem(GraphSourceItem instruction, int precedence, GraphTargetItem value, String operator) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java index d5eeea231..b417ea5af 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java @@ -143,8 +143,13 @@ public class Helper { } /** + * <<<<<<< HEAD * Formats specified address to four numbers xxxx (or five numbers when * showing decimal addresses) + * ======= + * Formats specified address to four numbers xxxx + * (or five numbers when showing decimal addresses) + * >>>>>>> v6 * * @param number Address to format * @return String representation of the address @@ -154,8 +159,13 @@ public class Helper { } /** + * <<<<<<< HEAD * Formats specified address to four numbers xxxx (or five numbers when * showing decimal addresses) + * ======= + * Formats specified address to four numbers xxxx + * (or five numbers when showing decimal addresses) + * >>>>>>> v6 * * @param number Address to format * @param decimal Use decimal format @@ -282,7 +292,12 @@ public class Helper { * character. * * + * <<<<<<< HEAD + * * @param st A string optionally containing standard java escape sequences. + * ======= + * @param st A string optionally containing standard java escape sequences. + * >>>>>>> v6 * @return The translated string. */ public static String unescapeJavaString(String st) { @@ -1347,4 +1362,5 @@ public class Helper { } return data; } + } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index ebe1c7c92..afe5c4f7b 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -202,7 +202,7 @@ public class ActionScript2Test extends ActionStript2TestBase { + "{\r\n" + "trace(\"equals strict\");\r\n" + "}\r\n" - + "if(!(i === 5))\r\n" + + "if(i !== 5)\r\n" + "{\r\n" + "trace(\"not equals strict\");\r\n" + "}\r\n" @@ -667,6 +667,7 @@ public class ActionScript2Test extends ActionStript2TestBase { @Test public void frame55_pushTest() { compareSrc(55, "trace(\"pushTest\");\r\n" + + "53;" ); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java new file mode 100644 index 000000000..903fc4da9 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3AssemblerTest.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorJumps; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.DeobfuscatePopIns; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.pcode.ASM3Parser; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import com.jpexs.decompiler.flash.tags.DoABCDefineTag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringReader; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3AssemblerTest extends ActionScriptTestBase { + + private SWF swf; + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + Configuration.autoDeobfuscate.set(true); + Configuration.deobfuscationMode.set(1); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); + } + + private int getBaseAddr() { + return 2; //getlocal_0 + pushscope + } + + private ABC getABC() { + return new ABC(new ABCContainerTag() { + + @Override + public ABC getABC() { + return null; + } + + @Override + public SWF getSwf() { + return swf; + } + + @Override + public int compareTo(ABCContainerTag o) { + return 0; + } + }); + } + + private MethodBody compilePCode(String str) throws IOException, AVM2ParseException, InterruptedException { + str = "code\r\n" + + "getlocal_0\r\n" + + "pushscope\r\n" + + str + + "returnvoid\r\n"; + + MethodBody b = new MethodBody(); + AVM2Code code = ASM3Parser.parse(new StringReader(str), getABC().constants, null, b, new MethodInfo()); + b.setCode(code); + return b; + } + + /*private String codeToStr(AVM2Code code) { + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + code.toASMSource(getABC().constants, null, new MethodInfo(), new MethodBody(), ScriptExportMode.PCODE, writer); + String ret = writer.toString(); + return ret.substring(ret.lastIndexOf("code\r\n") + 6); + }*/ + @Test + public void removeInstruction() throws Exception { + MethodBody b = compilePCode("pushbyte 1\r\n" + + "setlocal_1\r\n" //remove this + + "jump label1\r\n" + + "pushtrue\r\n" + + "pop\r\n" + + "label1:pushfalse\r\n"); + b.getCode().removeInstruction(getBaseAddr() + 1, b); + } + + @Test + public void removeInstruction2() throws Exception { + MethodBody b = compilePCode("pushbyte 1\r\n" + + "setlocal_1\r\n" + + "jump label1\r\n" + + "pushtrue\r\n" + + "pop\r\n" //remove this + + "label1:pushfalse\r\n"); + b.getCode().removeInstruction(getBaseAddr() + 4, b); + } + + @Test + public void replaceIstruction() throws Exception { + MethodBody b = compilePCode("pushbyte 1\r\n" + + "setlocal_1\r\n" + + "jump label1\r\n" //remove this + + "jump label1\r\n" + + "pushtrue\r\n" + + "pop\r\n" + + "label1:pushfalse\r\n"); + b.getCode().replaceInstruction(getBaseAddr() + 2, new AVM2Instruction(0, new DeobfuscatePopIns(), new int[]{}), b); + } + + @Test + public void replaceIstruction2() throws Exception { + MethodBody b = compilePCode("pushbyte 1\r\n" + + "setlocal_1\r\n" + + "jump label1\r\n" + + "pushtrue\r\n" + + "jump label1\r\n" //remove this + + "pop\r\n" + + "label1:pushfalse\r\n"); + b.getCode().replaceInstruction(getBaseAddr() + 4, new AVM2Instruction(0, new DeobfuscatePopIns(), new int[]{}), b); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java new file mode 100644 index 000000000..9e2facc15 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java @@ -0,0 +1,322 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; +import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.deobfuscation.AVM2DeobfuscatorJumps; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.pcode.ASM3Parser; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.ActionScriptParser; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import com.jpexs.decompiler.graph.CompilationException; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.concurrent.TimeoutException; +import org.testng.Assert; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3DeobfuscatorTest extends ActionStript2TestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + Configuration.autoDeobfuscate.set(true); + Configuration.deobfuscationMode.set(1); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); + } + + private String recompilePCode(String str) throws IOException, AVM2ParseException, InterruptedException { + str = "code\r\n" + + "getlocal_0\r\n" + + "pushscope\r\n" + + str + + "returnvoid\r\n"; + final ABC abc = new ABC(new ABCContainerTag() { + + @Override + public ABC getABC() { + return null; + } + + @Override + public SWF getSwf() { + return swf; + } + + @Override + public int compareTo(ABCContainerTag o) { + return 0; + } + }); + MethodBody b = new MethodBody(); + AVM2Code code = ASM3Parser.parse(new StringReader(str), abc.constants, null, b, new MethodInfo()); + b.setCode(code); + new AVM2DeobfuscatorJumps().deobfuscate("test", 0, true, 0, abc, abc.constants, null, new MethodInfo(), b); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + code.toASMSource(abc.constants, null, new MethodInfo(), new MethodBody(), ScriptExportMode.PCODE, writer); + String ret = writer.toString(); + return ret.substring(ret.lastIndexOf("code\r\n") + 6); + } + + private String recompile(String str) throws AVM2ParseException, IOException, CompilationException, InterruptedException { + str = "package { public class Test { public static function trace(s){ } public static function test(){ " + str + " } } }"; + final ABC abc = new ABC(new ABCContainerTag() { + + @Override + public ABC getABC() { + return null; + } + + @Override + public SWF getSwf() { + return swf; + } + + @Override + public int compareTo(ABCContainerTag o) { + return 0; + } + }); + ActionScriptParser par = new ActionScriptParser(abc, new ArrayList<>()); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + par.addScript(str, true, "Test.as", 0); + + abc.script_info.get(0).getPacks(abc, 0, "", new ArrayList<>()).get(0).toSource(writer, abc.script_info.get(0).traits.traits, ScriptExportMode.AS, false); + return writer.toString(); + } + + @DataProvider(name = "provideBasicTrueExpressions") + public Object[][] provideBasicTrueExpressions() { + return new Object[][]{ + {"1!=5"}, {"5==5"}, {"1<4"}, {"5>4"}, {"5*6==30"} + }; + } + + @DataProvider(name = "provideBasicFalseExpressions") + public Object[][] provideBasicFalseExpressions() { + return new Object[][]{ + {"1==5"}, {"5!=5"}, {"1>4"}, {"5<4"}, {"5*7==12"} + }; + } + + @Test(dataProvider = "provideBasicTrueExpressions") + public void testRemoveBasicTrueExpressions(String expression) throws IOException, CompilationException, InterruptedException, TimeoutException, AVM2ParseException { + String res = recompile("if(" + expression + "){" + + "trace(\"OK\");" + + "} else {" + + "trace(\"FAIL\");" + + "}"); + if (res.contains("\"FAIL\"")) { + fail("OnFalse clause was not removed: " + res); + } + if (!res.contains("\"OK\"")) { + fail("OnTrue clause was removed: " + res); + } + } + + @Test(dataProvider = "provideBasicFalseExpressions") + public void testRemoveBasicFalseExpressions(String expression) throws Exception { + String res = recompile("if(" + expression + "){" + + "trace(\"FAIL\");" + + "} else {" + + "trace(\"OK\");" + + "}"); + if (res.contains("\"FAIL\"")) { + fail("OnTrue clause was not removed:" + res); + } + if (!res.contains("\"OK\"")) { + fail("OnFalse clause was removed:" + res); + } + } + + @Test + public void testRemoveKnownVariables() throws Exception { + String res = recompile("var a = true; var b = false;" + + "if(a){" + + "trace(\"OK1\");" + + "}else{" + + "trace(\"FAIL1\");" + + "}" + + "if(b){" + + "trace(\"FAIL2\");" + + "}else{" + + "trace(\"OK2\");" + + "}"); + if (!res.contains("\"OK1\"")) { + fail("if true OnTrue removed"); + } + if (!res.contains("\"OK2\"")) { + fail("if false OnFalse removed" + res); + } + if (res.contains("\"FAIL1\"")) { + fail("if true OnFalse not removed"); + } + if (res.contains("\"FAIL2\"")) { + fail("if false OnTrue not removed"); + } + if (res.contains("var ")) { + fail("variables for obsucation not removed"); + } + if (res.contains("if")) { + fail("if clauses not removed"); + } + } + + @Test + public void testRemoveKnownVariables2() throws Exception { + String res = recompile("var a = true; var b = false;" + + "if(a){" + + "trace(\"OK1\");" + + "}else{" + + "trace(\"OK2\");" + + "}" + + "a = 59;" + + "if(b){" + + "trace(\"FAIL1\");" + + "}else{" + + "trace(\"OK3\");" + + "}"); + if (!res.contains("\"OK1\"")) { + fail("!OK1:" + res); + } + if (!res.contains("\"OK2\"")) { + fail("!OK2"); + } + if (!res.contains("\"OK3\"")) { + fail("!OK3"); + } + if (res.contains("\"FAIL1\"")) { + fail("FAIL1"); + } + } + + @Test + public void testJumps() throws Exception { + String res = recompilePCode("pushbyte 3\r\n" + + "pushbyte 4\r\n" + + "ifeq a\r\n" //should change to ifeq c + + "jump b\r\n" //should not change + + "a:jump c\r\n" + + "c:pushbyte 4\r\n" + + "b:pushbyte 3\r\n"); + Assert.assertEquals(res, "getlocal_0\r\n" + + "pushscope\r\n" + + "pushbyte 3\r\n" + + "pushbyte 4\r\n" + + "ifeq ofs000e\r\n" + + "jump ofs0010\r\n" + + "ofs000e:pushbyte 4\r\n" + + "ofs0010:pushbyte 3\r\n" + + "returnvoid\r\n"); + } + + // TODO: JPEXS @Test + public void testNotRemoveParams() throws Exception { + String res = recompile("function tst(p1,p2){" + + "var a = 2;" + + "var b = 3 * a;" + + "if(b>1){" + + "trace(\"OK1\");" + + "}else{" + + "trace(\"FAIL1\");" + + "}" + + "var c = p1*5;" + + "if(c){" + + "trace(\"OK2\");" + + "}else{" + + "trace(\"OK3\");" + + "}" + + "}"); + if (!res.contains("\"OK1\"")) { + fail("basic if true onTrue removed"); + } + if (res.contains("\"FAIL1\"")) { + fail("basic if true onFalse not removed"); + } + if (!res.contains("\"OK2\"")) { + fail("if parameter onTrue removed"); + } + if (!res.contains("\"OK3\"")) { + fail("if parameter onFalse removed"); + } + } + + //TODO: JPEXS @Test + public void testEvailExpressionAfterWhile() throws Exception { + String res = recompile("var a = 5;" + + "while(true){" + + "if(a==73){" + + "a = 15;" + + "}" + + "if(a==1){" + + "trace(\"FAIL1\");" + + "}" + + "if(a==5){" + + "a=50;" + + "}" + + "if(a == 201){" + + "break;" + + "}" + + "a++;" + + "if(a == 53){" + + "a = a + 20;" + + "}" + + "if(a>500){" + + "trace(\"FAIL2\");" + + "}" + + "if(a==16){" + + "a = 200;" + + "}" + + "}" + + "" + + "if(a == 201){" + + "trace(\"OK\");" + + "}else{" + + "trace(\"FAIL3\");" + + "}"); + if (res.contains("\"FAIL1\"")) { + fail("unreachable if onTrue not removed"); + } + if (res.contains("\"FAIL2\"")) { + fail("unreachable if onTrue 2 not removed"); + } + if (res.contains("\"FAIL3\"")) { + fail("unreachable if onTrue 3 not removed"); + } + if (!res.contains("\"OK\"")) { + fail("reachable of onTrue removed"); + } + } +} diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex index a1760063a..870340e7c 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex @@ -17,8 +17,8 @@ package jsyntaxpane.lexers; import jsyntaxpane.Token; import jsyntaxpane.TokenType; - -%% + +%% %public %class ActionScriptLexer @@ -58,7 +58,7 @@ InputCharacter = [^\r\n] WhiteSpace = {LineTerminator} | [ \t\f]+ /* comments */ -Comment = {TraditionalComment} | {EndOfLineComment} +Comment = {TraditionalComment} | {EndOfLineComment} TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? @@ -92,13 +92,13 @@ HexDigit = [0-9a-fA-F] OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} OctDigit = [0-7] - -/* floating point literals */ + +/* floating point literals */ DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? -FLit1 = [0-9]+ \. [0-9]* -FLit2 = \. [0-9]+ -FLit3 = [0-9]+ +FLit1 = [0-9]+ \. [0-9]* +FLit2 = \. [0-9]+ +FLit3 = [0-9]+ Exponent = [eE] [+-]? [0-9]+ NewVector = "new" {WhiteSpace}* "<" @@ -108,6 +108,7 @@ StringCharacter = [^\r\n\"\\] SingleCharacter = [^\r\n\'\\] OIdentifierCharacter = [^\r\n\u00A7\\] +Preprocessor = \u00A7\u00A7 {Identifier} %state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER @@ -174,114 +175,117 @@ OIdentifierCharacter = [^\r\n\u00A7\\] "}" { return token(TokenType.OPERATOR, -CURLY); } "[" { return token(TokenType.OPERATOR, BRACKET); } "]" { return token(TokenType.OPERATOR, -BRACKET); } - ";" | - "," | - "..." | - "." | - "=" | - ">" | + ";" | + "," | + "..." | + "." | + "=" | + ">" | "<" | - "!" | - "~" | - "?" | - ":" | - "==" | - "<=" | - ">=" | - "!=" | - "&&" | - "||" | - "++" | - "--" | - "+" | - "-" | - "*" | - "/" | - "&" | - "|" | - "^" | - "%" | - "<<" | - ">>" | - ">>>" | - "+=" | - "-=" | - "*=" | - "/=" | - "&=" | - "|=" | - "^=" | - "%=" | - "<<=" | - ">>=" | + "!" | + "~" | + "?" | + ":" | + "==" | + "<=" | + ">=" | + "!=" | + "&&" | + "||" | + "++" | + "--" | + "+" | + "-" | + "*" | + "/" | + "&" | + "|" | + "^" | + "%" | + "<<" | + ">>" | + ">>>" | + "+=" | + "-=" | + "*=" | + "/=" | + "&=" | + "|=" | + "^=" | + "%=" | + "<<=" | + ">>=" | ">>>=" | - "as" | - "delete" | - "instanceof" | - "is" | - "::" | - "new" | - "typeof" | - "void" | + "as" | + "delete" | + "instanceof" | + "is" | + "::" | + "new" | + "typeof" | + "void" | {NewVector} | - "@" { return token(TokenType.OPERATOR); } - + "@" { return token(TokenType.OPERATOR); } + /* string literal */ - \" { - yybegin(STRING); - tokenStart = yychar; - tokenLength = 1; + \" { + yybegin(STRING); + tokenStart = yychar; + tokenLength = 1; } - "\u00A7" { - yybegin(OIDENTIFIER); - tokenStart = yychar; - tokenLength = 1; + {Preprocessor} { + return token(TokenType.REGEX); + } + "\u00A7" { + yybegin(OIDENTIFIER); + tokenStart = yychar; + tokenLength = 1; } /* character literal */ - \' { - yybegin(CHARLITERAL); - tokenStart = yychar; - tokenLength = 1; + \' { + yybegin(CHARLITERAL); + tokenStart = yychar; + tokenLength = 1; } /* numeric literals */ {DecIntegerLiteral} | - + {HexIntegerLiteral} | - + {OctIntegerLiteral} | - + {DoubleLiteral} | {DoubleLiteral}[dD] { return token(TokenType.NUMBER); } - + // JavaDoc comments need a state so that we can highlight the @ controls /* comments */ {Comment} { return token(TokenType.COMMENT); } /* whitespace */ - {WhiteSpace} { } + {WhiteSpace} { } {TypeNameSpec} { return token(TokenType.IDENTIFIER); } - {XMLBeginOneTag} { yybegin(XML); + {XMLBeginOneTag} { yybegin(XML); tokenStart = yychar; - tokenLength = yylength(); - String s=yytext(); + tokenLength = yylength(); + String s=yytext(); s=s.substring(1,s.length()-1); if(s.contains(" ")){ s=s.substring(0,s.indexOf(" ")); } xmlTagName = s; } - /*{XMLBeginTag} { yybegin(XMLSTARTTAG); + /*{XMLBeginTag} { yybegin(XMLSTARTTAG); tokenStart = yychar; - tokenLength = yylength(); - String s=yytext(); + tokenLength = yylength(); + String s=yytext(); xmlTagName = s.substring(1); }*/ - /* identifiers */ - {Identifier} { return token(TokenType.IDENTIFIER); } + /* identifiers */ + {Identifier} { return token(TokenType.IDENTIFIER); } } { @@ -293,7 +297,7 @@ OIdentifierCharacter = [^\r\n\u00A7\\] {XMLBeginOneTag} { tokenLength += yylength();} {XMLEndTag} { tokenLength += yylength(); String endtagname=yytext(); - endtagname=endtagname.substring(2,endtagname.length()-1); + endtagname=endtagname.substring(2,endtagname.length()-1); if(endtagname.equals(xmlTagName)){ yybegin(YYINITIAL); return token(TokenType.STRING, tokenStart, tokenLength); @@ -303,16 +307,16 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \" { - yybegin(YYINITIAL); + \" { + yybegin(YYINITIAL); // length also includes the trailing quote return token(TokenType.STRING, tokenStart, tokenLength + 1); } - + {StringCharacter}+ { tokenLength += yylength(); } \\[0-3]?{OctDigit}?{OctDigit} { tokenLength += yylength(); } - + /* escape sequences */ \\. { tokenLength += 2; } @@ -320,15 +324,15 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - "\u00A7" { - yybegin(YYINITIAL); + "\u00A7" { + yybegin(YYINITIAL); // length also includes the trailing quote return token(TokenType.REGEX, tokenStart, tokenLength + 1); } - + {OIdentifierCharacter}+ { tokenLength += yylength(); } - + /* escape sequences */ \\. { tokenLength += 2; } @@ -336,14 +340,14 @@ OIdentifierCharacter = [^\r\n\u00A7\\] } { - \' { - yybegin(YYINITIAL); + \' { + yybegin(YYINITIAL); // length also includes the trailing quote return token(TokenType.STRING, tokenStart, tokenLength + 1); } - + {SingleCharacter}+ { tokenLength += yylength(); } - + /* escape sequences */ \\. { tokenLength += 2; } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 14d47a7f3..ec23ffd6b 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -806,16 +806,15 @@ public abstract class MainFrameMenu implements MenuBuilder { addMenuItem("/settings/language/setLanguage", translate("menu.settings.language"), "setlanguage32", this::setLanguageActionPerformed, PRIORITY_TOP, null, true); finishMenu("/settings/language"); - addMenuItem("/settings/deobfuscation", translate("menu.deobfuscation"), null, null, 0, null, false); - addToggleMenuItem("/settings/deobfuscation/old", translate("menu.file.deobfuscation.old"), "deobfuscation", "deobfuscateold16", (ActionEvent e) -> { - deobfuscationMode(e, 0); - }, 0); - addToggleMenuItem("/settings/deobfuscation/new", translate("menu.file.deobfuscation.new"), "deobfuscation", "deobfuscatenew16", (ActionEvent e) -> { - deobfuscationMode(e, 1); - }, 0); - - finishMenu("/settings/deobfuscation"); - + /*addMenuItem("/settings/deobfuscation", translate("menu.deobfuscation"), null, null, 0, null, false); + addToggleMenuItem("/settings/deobfuscation/old", translate("menu.file.deobfuscation.old"), "deobfuscation", "deobfuscateold16", (ActionEvent e) -> { + deobfuscationMode(e, 0); + }, 0); + addToggleMenuItem("/settings/deobfuscation/new", translate("menu.file.deobfuscation.new"), "deobfuscation", "deobfuscatenew16", (ActionEvent e) -> { + deobfuscationMode(e, 1); + }, 0); + + finishMenu("/settings/deobfuscation");*/ addMenuItem("/settings/advancedSettings", translate("menu.advancedsettings.advancedsettings"), null, null, 0, null, false); addMenuItem("/settings/advancedSettings/advancedSettings", translate("menu.advancedsettings.advancedsettings"), "settings32", this::advancedSettingsActionPerformed, PRIORITY_TOP, null, true); addMenuItem("/settings/advancedSettings/clearRecentFiles", translate("menu.tools.otherTools.clearRecentFiles"), "clearrecent16", this::clearRecentFilesActionPerformed, PRIORITY_MEDIUM, null, true); @@ -862,16 +861,15 @@ public abstract class MainFrameMenu implements MenuBuilder { setMenuEnabled("/settings/internalViewer", false); } - int deobfuscationMode = Configuration.deobfuscationMode.get(); - switch (deobfuscationMode) { - case 0: - setGroupSelection("deobfuscation", "/settings/deobfuscation/old"); - break; - case 1: - setGroupSelection("deobfuscation", "/settings/deobfuscation/new"); - break; - } - + /*int deobfuscationMode = Configuration.deobfuscationMode.get(); + switch (deobfuscationMode) { + case 0: + setGroupSelection("deobfuscation", "/settings/deobfuscation/old"); + break; + case 1: + setGroupSelection("deobfuscation", "/settings/deobfuscation/new"); + break; + }*/ if (Platform.isWindows()) { setMenuChecked("/settings/associate", ContextMenuTools.isAddedToContextMenu()); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 930916306..6b43093fc 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2933,6 +2933,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } catch (CancellationException ex) { getABCPanel().decompiledTextArea.setText("// " + AppStrings.translate("work.canceled")); } catch (Exception ex) { + Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, "Error", ex); getABCPanel().decompiledTextArea.setText("// " + AppStrings.translate("decompilationError") + ": " + ex); } }); @@ -2940,6 +2941,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se }; worker.execute(); setSourceWorker = worker; + Main.startWork(translate("work.decompiling") + "...", worker); } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 64ff16596..b459941bd 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -741,11 +741,11 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener packs = abc.script_info.get(oldIndex).getPacks(abc, oldIndex, null, pack.allABCs); - if (!packs.isEmpty()) { - oldSp = packs.get(0).getClassPath().toString(); - } + String oldSp = pack.getClassPath().toString(); + /*List packs = abc.script_info.get(oldIndex).getPacks(abc, oldIndex, null, pack.allABCs); + if (!packs.isEmpty()) { + + }*/ String as = decompiledTextArea.getText(); abc.replaceScriptPack(pack, as); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 4880a0d34..0d7e649ff 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -275,7 +275,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL Highlighting ch = Highlighting.searchPos(classHighlights, pos); int cindex = (int) ch.getProperties().index; ABC abc = getABC(); - type.setVal(abc.instance_info.get(cindex).getName(abc.constants).getNameWithNamespace(abc.constants, true)); + type.setVal(abc.instance_info.get(cindex).getName(abc.constants).getNameWithNamespace(abc.constants).toString()); return ch.startPos; } @@ -356,7 +356,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL traitIndex.setVal(j); classTrait.setVal(false); multinameIndex.setVal(tr.name_index); - currentType = ii.getName(a.constants).getNameWithNamespace(a.constants, true); + currentType = ii.getName(a.constants).getNameWithNamespace(a.constants).toString(); found = true; break loopi; } @@ -371,7 +371,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL traitIndex.setVal(j); classTrait.setVal(true); multinameIndex.setVal(tr.name_index); - currentType = ii.getName(a.constants).getNameWithNamespace(a.constants, true); + currentType = ii.getName(a.constants).getNameWithNamespace(a.constants).toString(); found = true; break loopi; } @@ -465,7 +465,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL for (int i = 1; i < abc.constants.constant_multiname.size(); i++) { Multiname m = abc.constants.constant_multiname.get(i); if (m != null) { - if (typeName.equals(m.getNameWithNamespace(abc.constants, true))) { + if (typeName.equals(m.getNameWithNamespace(abc.constants).toString())) { return i; } } @@ -520,7 +520,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL if (tm != null) { String name = ""; if (classIndex > -1) { - name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants, false); + name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants).toPrintableString(); } Trait currentTrait = null; @@ -571,7 +571,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL } currentMethodHighlight = null; currentTrait = null; - String name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants, false); + String name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants).toPrintableString(); currentTrait = getCurrentTrait(); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); if (currentTrait != null) { diff --git a/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java b/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java index 0ddba1125..21a398abd 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java @@ -92,7 +92,7 @@ public class UsageFrame extends AppDialog implements MouseListener { cont.add(new JScrollPane(usageList), BorderLayout.CENTER); cont.add(buttonsPanel, BorderLayout.SOUTH); setSize(400, 300); - setTitle((definitions ? translate("dialog.title.declaration") : translate("dialog.title")) + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(abc.constants, false)); + setTitle((definitions ? translate("dialog.title.declaration") : translate("dialog.title")) + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(abc.constants).toPrintableString()); View.centerScreen(this); View.setWindowIcon(this); } @@ -133,7 +133,7 @@ public class UsageFrame extends AppDialog implements MouseListener { settrait.run(); } else { abcPanel.decompiledTextArea.addScriptListener(settrait); - abcPanel.hilightScript(abcPanel.getSwf(), abcPanel.abc.instance_info.get(icu.classIndex).getName(abcPanel.abc.constants).getNameWithNamespace(abcPanel.abc.constants, false)); + abcPanel.hilightScript(abcPanel.getSwf(), abcPanel.abc.instance_info.get(icu.classIndex).getName(abcPanel.abc.constants).getNameWithNamespace(abcPanel.abc.constants).toPrintableString()); } } } diff --git a/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java b/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java index d519d6808..6a6abcf3f 100644 --- a/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java +++ b/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java @@ -93,7 +93,7 @@ public class DebuggerTools { ABC a = ct.getABC(); for (int i = 1; i < a.constants.constant_multiname.size(); i++) { Multiname m = a.constants.constant_multiname.get(i); - if ("trace".equals(m.getNameWithNamespace(a.constants, true))) { + if ("trace".equals(m.getNameWithNamespace(a.constants).toString())) { m.namespace_index = a.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, a.constants.getStringId(debuggerPkg, true)), 0, true); m.name_index = a.constants.getStringId(fname, true); ((Tag) ct).setModified(true); @@ -116,7 +116,7 @@ public class DebuggerTools { ABC a = ct.getABC(); for (int i = 1; i < a.constants.constant_multiname.size(); i++) { Multiname m = a.constants.constant_multiname.get(i); - String packageStr = m.getNameWithNamespace(a.constants, true); + String packageStr = m.getNameWithNamespace(a.constants).toString(); if (isDebuggerClass(packageStr, "debugTrace") || isDebuggerClass(packageStr, "debugAlert") || isDebuggerClass(packageStr, "debugSocket") diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 123af9953..ea39a2ebc 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -497,7 +497,7 @@ contextmenu.parseABC = Parse ABC contextmenu.parseInstructions = Parse AVM2 Instructions #after version 2.1.3 -menu.deobfuscation = AS1/2 Deobfuscation +menu.deobfuscation = Deobfuscation menu.file.deobfuscation.old = Old style menu.file.deobfuscation.new = New style diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties index 86879963b..83d1aef65 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties @@ -497,7 +497,7 @@ contextmenu.parseABC = Analitza ABC contextmenu.parseInstructions = Analitza les instruccions AVM2 #after version 2.1.3 -menu.deobfuscation = Desofuscaci\u00f3 AS1/2 +menu.deobfuscation = Desofuscaci\u00f3 menu.file.deobfuscation.old = Estil vell menu.file.deobfuscation.new = Estil nou diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index c38a772fc..5c86b17fd 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -496,7 +496,7 @@ contextmenu.parseActions = Naparsovat akce contextmenu.parseABC = Naparsovat ABC contextmenu.parseInstructions = Naparsovat AVM2 instrukce -menu.deobfuscation = AS1/2 Deobfuskace +menu.deobfuscation = Deobfuskace menu.file.deobfuscation.old = Star\u00fd zp\u016fsob menu.file.deobfuscation.new = Nov\u00fd zp\u016fsob diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties index 2f60a4b07..0f9503d1f 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_es.properties @@ -497,7 +497,7 @@ contextmenu.parseABC = Analizar ABC contextmenu.parseInstructions = Analizar instrucciones AVM2 #after version 2.1.3 -menu.deobfuscation = Desofuscaci\u00f3n AS1/2 +menu.deobfuscation = Desofuscaci\u00f3n menu.file.deobfuscation.old = Estilo viejo menu.file.deobfuscation.new = Estilo nuevo diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties index b33b1be20..710801368 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_fr.properties @@ -497,7 +497,7 @@ contextmenu.parseABC = Analyser ABC contextmenu.parseInstructions = Analyser les instructions AVM2 #after version 2.1.3 -menu.deobfuscation = AS1/2 D\u00e9sobfuscation +menu.deobfuscation = D\u00e9sobfuscation menu.file.deobfuscation.old = Ancien style menu.file.deobfuscation.new = Nouveau style diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties index 43d39e24d..9e6a6605f 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties @@ -497,7 +497,7 @@ contextmenu.parseABC = ABC elemz\u00e9se contextmenu.parseInstructions = AVM2 utas\u00edt\u00e1sok elemz\u00e9se #after version 2.1.3 -menu.deobfuscation = AS1/2 Deobfuszk\u00e1l\u00e1s +menu.deobfuscation = Deobfuszk\u00e1l\u00e1s menu.file.deobfuscation.old = R\u00e9gi menu.file.deobfuscation.new = \u00daj diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties index 63ec9aa4e..81bf6231c 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_pl.properties @@ -495,7 +495,7 @@ contextmenu.parseActions = Analizuj akcje contextmenu.parseABC = Analizuj ABC contextmenu.parseInstructions = Analizuj instrukcje AVM2 -menu.deobfuscation = Odkodowanie AS1/2 +menu.deobfuscation = Odkodowanie menu.file.deobfuscation.old = Stary styl menu.file.deobfuscation.new = Nowy styl diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties index 1dc7de3dd..0bbcef832 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ru.properties @@ -1,578 +1,578 @@ -# Copyright (C) 2010-2015 JPEXS -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -menu.file = \u0424\u0430\u0439\u043b -menu.file.open = \u041e\u0442\u043a\u0440\u044b\u0442\u044c... -menu.file.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c -menu.file.saveas = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a... -menu.file.export.fla = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 FLA -menu.file.export.all = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 -menu.file.export.selection = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 -menu.file.exit = \u0412\u044b\u0439\u0442\u0438 - -menu.tools = \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b -menu.tools.searchas = \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0432\u0441\u0435\u043c\u0443 ActionScript... -menu.tools.proxy = \u041f\u0440\u043e\u043a\u0441\u0438 -menu.tools.deobfuscation = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f -menu.tools.deobfuscation.pcode = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f P-code... -menu.tools.deobfuscation.globalrename = \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 -menu.tools.deobfuscation.renameinvalid = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b -menu.tools.gotoDocumentClass = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 - -menu.settings = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -menu.settings.autodeobfuscation = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f -menu.settings.internalflashviewer = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c Flash -menu.settings.parallelspeedup = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c (\u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) -menu.settings.disabledecompilation = \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c) -menu.settings.addtocontextmenu = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c FFDec \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e SWF \u0444\u0430\u0439\u043b\u043e\u0432 -menu.settings.language = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044f\u0437\u044b\u043a -menu.settings.cacheOnDisk = \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a -menu.settings.gotoMainClassOnStartup = \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 - -menu.help = \u041f\u043e\u043c\u043e\u0449\u044c -menu.help.checkupdates = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f... -menu.help.helpus = \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u043d\u0430\u0441! -menu.help.homepage = \u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 -menu.help.about = \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435... - -contextmenu.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c - -button.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c -button.edit = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c -button.cancel = \u041e\u0442\u043c\u0435\u043d\u0430 -button.replace = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c... - -notavailonthisplatform = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Windows). - -swfpreview = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 SWF -swfpreview.internal = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 SWF (\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c) - -parameters = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b - -rename.enternew = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f: - -rename.finished.identifier = \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d. -rename.finished.multiname = %count% multiname \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043e. - -node.texts = \u0442\u0435\u043a\u0441\u0442\u044b -node.images = \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f -node.movies = \u0432\u0438\u0434\u0435\u043e -node.sounds = \u0437\u0432\u0443\u043a\u0438 -node.binaryData = \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 -node.fonts = \u0448\u0440\u0438\u0444\u0442\u044b -node.sprites = \u0441\u043f\u0440\u0430\u0439\u0442\u044b -node.shapes = \u0444\u043e\u0440\u043c\u044b -node.morphshapes = morphshapes -node.buttons = \u043a\u043d\u043e\u043f\u043a\u0438 -node.frames = \u043a\u0430\u0434\u0440\u044b -node.scripts = \u0441\u043a\u0440\u0438\u043f\u0442\u044b - -message.warning = \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 -message.confirm.experimental = \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c SWF \u0444\u0430\u0439\u043b \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0438\u043c.\r\n\u0418\u0421\u041f\u041e\u041b\u042c\u0417\u0423\u0419\u0422\u0415 \u041d\u0410 \u0421\u0412\u041e\u0419 \u0421\u0422\u0420\u0410\u0425 \u0418 \u0420\u0418\u0421\u041a! \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? -message.confirm.parallel = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e, \u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. -message.confirm.on = \u0412\u041a\u041b\u044e\u0447\u0438\u0442\u044c? -message.confirm.off = \u0412\u042b\u041a\u041b\u044e\u0447\u0438\u0442\u044c? -message.confirm = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c - -message.confirm.autodeobfuscate = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.\r\n\u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \"\u043c\u0451\u0440\u0442\u0432\u043e\u0433\u043e\" \u043a\u043e\u0434\u0430.\r\n\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u043d\u0435 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d. - -message.parallel = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c -message.trait.saved = Trait \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d - -message.constant.new.string = \u0421\u0442\u0440\u043e\u043a\u0430 (String) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? -message.constant.new.string.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 (String) -message.constant.new.integer = \u0426\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Integer) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? -message.constant.new.integer.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Integer) -message.constant.new.unsignedinteger = \u0411\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Unsigned integer) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? -message.constant.new.unsignedinteger.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Unsigned integer) -message.constant.new.double = \u0414\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Double) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? -message.constant.new.double.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Double) - -work.buffering = \u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f -work.waitingfordissasembly = \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f -work.gettinghilights = \u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 -work.disassembling = \u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 -work.exporting = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 -work.searching = \u041f\u043e\u0438\u0441\u043a -work.renaming = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 -work.exporting.fla = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 FLA -work.renaming.identifiers = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 -work.deobfuscating = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f -work.decompiling = \u0414\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f -work.gettingvariables = \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 -work.reading.swf = \u0427\u0442\u0435\u043d\u0438\u0435 SWF -work.creatingwindow = \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 -work.buildingscripttree = \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 - -work.deobfuscating.complete = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 - -message.search.notfound = \u0422\u0435\u043a\u0441\u0442 "%searchtext%" \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. -message.search.notfound.title = \u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e - -message.rename.notfound.multiname = \u041f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c multiname -message.rename.notfound.identifier = \u041f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 -message.rename.notfound.title = \u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e -message.rename.renamed = \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043e: %count% - -filter.images = \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (*.jpg,*.gif,*.png,*.bmp) -filter.fla = \u041f\u0440\u043e\u0435\u043a\u0442 %version% (*.fla) -filter.xfl = \u041d\u0435\u0441\u0436\u0430\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 %version% (*.xfl) -filter.swf = SWF \u0444\u0430\u0439\u043b\u044b (*.swf) - -error = \u041e\u0448\u0438\u0431\u043a\u0430 -error.image.invalid = \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. - -error.text.invalid = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442: %text% \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 %line% -error.file.save = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b -error.file.write = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b -error.export = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 - -export.select.directory = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 -export.finishedin = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0437\u0430 %time% - -update.check.title = \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 -update.check.nonewversion = \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0435\u0442. - -message.helpus = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\r\n%url%\r\n\u0434\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439. -message.homepage = \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443: \r\n%url% - -proxy = \u041f\u0440\u043e\u043a\u0441\u0438 -proxy.start = \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 -proxy.stop = \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 -proxy.show = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 -exit = \u0412\u044b\u0439\u0442\u0438 - -panel.disassembled = P-\u043a\u043e\u0434 -panel.decompiled = ActionScript - -search.info = \u041f\u043e\u0438\u0441\u043a "%text%": -search.script = \u0421\u043a\u0440\u0438\u043f\u0442 - -constants = Constants -traits = Traits - -pleasewait = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 - -abc.detail.methodtrait = Method/Getter/Setter Trait -abc.detail.unsupported = - -abc.detail.slotconsttrait = Slot/Const Trait -abc.detail.traitname = \u0418\u043c\u044f: - -abc.detail.body.params.maxstack = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0435\u043a\u0430: -abc.detail.body.params.localregcount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432: -abc.detail.body.params.minscope = \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438: -abc.detail.body.params.maxscope = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438: -abc.detail.body.params.autofill = \u0410\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 (\u0413\u041b\u041e\u0411\u0410\u041b\u042c\u041d\u0410\u042f \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410) -abc.detail.body.params.autofill.experimental = ...\u042d\u041a\u0421\u041f\u0415\u0420\u0418\u041c\u0415\u041d\u0422\u0410\u041b\u042c\u041d\u041e - -abc.detail.methodinfo.methodindex = \u0418\u043d\u0434\u0435\u043a\u0441 \u043c\u0435\u0442\u043e\u0434\u0430: -abc.detail.methodinfo.parameters = \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b: -abc.detail.methodinfo.returnvalue = \u0422\u0438\u043f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: - -error.methodinfo.params = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 MethodInfo -error.methodinfo.returnvalue = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0442\u0438\u043f\u0435 \u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f MethodInfo - -abc.detail.methodinfo = MethodInfo -abc.detail.body.code = \u041a\u043e\u0434 MethodBody -abc.detail.body.params = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b MethodBody - -abc.detail.slotconst.typevalue = \u0422\u0438\u043f \u0438 \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: - -error.slotconst.typevalue = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0442\u0438\u043f\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f SlotConst - -message.autofill.failed = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.\r\n\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. -info.selecttrait = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 trait \u0432 ActionScript \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. - -button.viewgraph = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0413\u0440\u0430\u0444\u0430 -button.viewhex = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 Hex - -abc.traitslist.instanceinitializer = \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 -abc.traitslist.classinitializer = \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 - -action.edit.experimental = (\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e) - -message.action.saved = \u041a\u043e\u0434 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d - -error.action.save = %error% \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 %line% - -message.confirm.remove = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 %item%\n \u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u043d\u0435\u0433\u043e? - -#after version 1.6.5u1: - -button.ok = OK -button.cancel = \u041e\u0442\u043c\u0435\u043d\u0430 - -font.name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430: -font.isbold = \u0416\u0438\u0440\u043d\u044b\u0439: -font.isitalic = \u041a\u0443\u0440\u0441\u0438\u0432: -font.ascent = \u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0432\u044b\u043d\u043e\u0441: -font.descent = \u041d\u0438\u0436\u043d\u0438\u0439 \u0432\u044b\u043d\u043e\u0441: -font.leading = \u0418\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u044c\u044f\u0436: -font.characters = \u0421\u0438\u043c\u0432\u043e\u043b\u044b: -font.characters.add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b: -value.unknown = ? - -yes = \u0434\u0430 -no = \u043d\u0435\u0442 - -errors.present = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u041e\u0428\u0418\u0411\u041a\u0418. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. -errors.none = \u0412 \u043b\u043e\u0433\u0435 \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a. - -#after version 1.6.6: - -dialog.message.title = \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 -dialog.select.title = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - -button.yes = \u0414\u0430 -button.no = \u041d\u0435\u0442 - -FileChooser.openButtonText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c -FileChooser.openButtonToolTipText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c -FileChooser.lookInLabelText = \u0418\u0441\u043a\u0430\u0442\u044c \u0432: -FileChooser.acceptAllFileFilterText = \u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b -FileChooser.filesOfTypeLabelText = \u0422\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432: -FileChooser.fileNameLabelText = \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430: -FileChooser.listViewButtonToolTipText = \u0421\u043f\u0438\u0441\u043e\u043a -FileChooser.listViewButtonAccessibleName = \u0421\u043f\u0438\u0441\u043e\u043a -FileChooser.detailsViewButtonToolTipText = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 -FileChooser.detailsViewButtonAccessibleName = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 -FileChooser.upFolderToolTipText = \u0412\u0432\u0435\u0440\u0445 -FileChooser.upFolderAccessibleName = \u0412\u0432\u0435\u0440\u0445 -FileChooser.homeFolderToolTipText = \u0414\u043e\u043c\u043e\u0439 -FileChooser.homeFolderAccessibleName = \u0414\u043e\u043c\u043e\u0439 -FileChooser.fileNameHeaderText = \u0418\u043c\u044f -FileChooser.fileSizeHeaderText = \u0420\u0430\u0437\u043c\u0435\u0440 -FileChooser.fileTypeHeaderText = \u0422\u0438\u043f -FileChooser.fileDateHeaderText = \u0414\u0430\u0442\u0430 -FileChooser.fileAttrHeaderText = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b -FileChooser.openDialogTitleText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c -FileChooser.directoryDescriptionText = \u041f\u0430\u043f\u043a\u0430 -FileChooser.directoryOpenButtonText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c -FileChooser.directoryOpenButtonToolTipText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 -FileChooser.fileDescriptionText = \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b -FileChooser.helpButtonText = \u041f\u043e\u043c\u043e\u0449\u044c -FileChooser.helpButtonToolTipText = \u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 -FileChooser.newFolderAccessibleName = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 -FileChooser.newFolderErrorText = \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 -FileChooser.newFolderToolTipText = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 -FileChooser.other.newFolder = \u041d\u043e\u0432\u0430\u044f\u041f\u0430\u043f\u043a\u0430 -FileChooser.other.newFolder.subsequent = \u041d\u043e\u0432\u0430\u044f\u041f\u0430\u043f\u043a\u0430.{0} -FileChooser.win32.newFolder = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 -FileChooser.win32.newFolder.subsequent = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 ({0}) -FileChooser.saveButtonText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c -FileChooser.saveButtonToolTipText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b -FileChooser.saveDialogTitleText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c -FileChooser.saveInLabelText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432: -FileChooser.updateButtonText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c -FileChooser.updateButtonToolTipText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043f\u043a\u0438 - -#after version 1.6.6u2: - -FileChooser.detailsViewActionLabel.textAndMnemonic = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 -FileChooser.detailsViewButtonToolTip.textAndMnemonic = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 -FileChooser.fileAttrHeader.textAndMnemonic = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b -FileChooser.fileDateHeader.textAndMnemonic = \u0418\u0437\u043c\u0435\u043d\u0435\u043d -FileChooser.fileNameHeader.textAndMnemonic = \u0418\u043c\u044f -FileChooser.fileNameLabel.textAndMnemonic = \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430: -FileChooser.fileSizeHeader.textAndMnemonic = \u0420\u0430\u0437\u043c\u0435\u0440 -FileChooser.fileTypeHeader.textAndMnemonic = \u0422\u0438\u043f -FileChooser.filesOfTypeLabel.textAndMnemonic = \u0424\u0430\u0439\u043b\u044b \u0442\u0438\u043f\u0430: -FileChooser.folderNameLabel.textAndMnemonic = \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438: -FileChooser.homeFolderToolTip.textAndMnemonic = \u0414\u043e\u043c\u043e\u0439 -FileChooser.listViewActionLabel.textAndMnemonic = \u0421\u043f\u0438\u0441\u043e\u043a -FileChooser.listViewButtonToolTip.textAndMnemonic = \u0421\u043f\u0438\u0441\u043e\u043a -FileChooser.lookInLabel.textAndMnemonic = \u0418\u0441\u043a\u0430\u0442\u044c \u0432: -FileChooser.newFolderActionLabel.textAndMnemonic = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 -FileChooser.newFolderToolTip.textAndMnemonic = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 -FileChooser.refreshActionLabel.textAndMnemonic = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c -FileChooser.saveInLabel.textAndMnemonic = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432: -FileChooser.upFolderToolTip.textAndMnemonic = \u0412\u0432\u0435\u0440\u0445 -FileChooser.viewMenuButtonAccessibleName = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u041c\u0435\u043d\u044e -FileChooser.viewMenuButtonToolTipText = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u041c\u0435\u043d\u044e -FileChooser.viewMenuLabel.textAndMnemonic = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -FileChooser.newFolderActionLabelText = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 -FileChooser.listViewActionLabelText = \u0421\u043f\u0438\u0441\u043e\u043a -FileChooser.detailsViewActionLabelText = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 -FileChooser.refreshActionLabelText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c -FileChooser.sortMenuLabelText = \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u043a\u0438 -FileChooser.viewMenuLabelText = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -FileChooser.fileSizeKiloBytes = {0} \u041a\u0411 -FileChooser.fileSizeMegaBytes = {0} \u041c\u0411 -FileChooser.fileSizeGigaBytes = {0} \u0413\u0411 -FileChooser.folderNameLabelText = \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438: - -error.occured = \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430: %error% -button.abort = \u041f\u0440\u0435\u0440\u0432\u0430\u0442\u044c -button.retry = \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c -button.ignore = \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c - -font.source = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430: - -#after version 1.6.7: - -menu.export = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 -menu.general = \u041e\u0431\u0449\u0438\u0435 -menu.language = \u042f\u0437\u044b\u043a - -startup.welcometo = \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 -startup.selectopen = \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u043e\u043a "\u041e\u0442\u043a\u0440\u044b\u0442\u044c" \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 SWF \u0444\u0430\u0439\u043b \u0432 \u044d\u0442\u043e \u043e\u043a\u043d\u043e. - -error.font.nocharacter = \u0421\u0438\u043c\u0432\u043e\u043b "%char%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0448\u0440\u0438\u0444\u0442\u0435. - -warning.initializers = \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u0445.\n\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c, \u043d\u043e \u0438 \u0442\u0430\u043c! - -#after version 1.7.0u1: - -menu.tools.searchMemory = \u0418\u0441\u043a\u0430\u0442\u044c SWF \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 -menu.file.reload = \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c -message.confirm.reload = \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 SWF \u0444\u0430\u0439\u043b.\n \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? - -dialog.selectbkcolor.title = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 SWF -button.selectbkcolor.hint = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 - -ColorChooser.okText = \u041e\u041a -ColorChooser.cancelText = \u041e\u0442\u043c\u0435\u043d\u0430 -ColorChooser.resetText = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c -ColorChooser.previewText = \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -ColorChooser.swatchesNameText = \u041e\u0431\u0440\u0430\u0437\u0446\u044b -ColorChooser.swatchesRecentText = \u041d\u0435\u0434\u0430\u0432\u043d\u0435\u0435: -ColorChooser.sampleText = \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0434\u043f\u0438\u0441\u0438 \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0434\u043f\u0438\u0441\u0438 - -#after version 1.7.1: - -preview.play = \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 -preview.pause = \u041f\u0430\u0443\u0437\u0430 -preview.stop = \u0421\u0442\u043e\u043f - -message.confirm.removemultiple = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435: %count%\n \u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u043d\u0438\u0445? - -menu.tools.searchCache = \u041f\u043e\u0438\u0441\u043a \u0432 \u043a\u044d\u0448\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 - -#after version 1.7.2u2 - -error.trait.exists = Trait \u0441 \u0438\u043c\u0435\u043d\u0435\u043c "%name%" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. -button.addtrait = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c trait -button.font.embed = \u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c... -button.yes.all = \u0414\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 -button.no.all = \u041d\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 -message.font.add.exists = \u0421\u0438\u043c\u0432\u043e\u043b %char% \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u044d\u0433\u0435 \u0448\u0440\u0438\u0444\u0442\u0430.\n\u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0412\u044b \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c? - -filter.gfx = GFx \u0444\u0430\u0439\u043b\u044b ScaleForm (*.gfx) -filter.supported = \u0412\u0441\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b -work.canceled = \u041e\u0442\u043c\u0435\u043d\u0435\u043d\u043e -work.restoringControlFlow = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 -menu.advancedsettings.advancedsettings = \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -menu.recentFiles = \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b - -#after version 1.7.4 -work.restoringControlFlow.complete = \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d -message.confirm.recentFileNotFound = \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432? -contextmenu.closeSwf = \u0417\u0430\u043a\u0440\u044b\u0442\u044c SWF -menu.settings.autoRenameIdentifiers = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b -menu.file.saveasexe = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a Exe... -filter.exe = \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (*.exe) - -#after version 1.8.0 -font.updateTexts = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0434\u043f\u0438\u0441\u0438 - -#after version 1.8.0u1 -menu.file.close = \u0417\u0430\u043a\u0440\u044b\u0442\u044c -menu.file.closeAll = \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 -menu.tools.otherTools = \u0414\u0440\u0443\u0433\u043e\u0435 -menu.tools.otherTools.clearRecentFiles = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 -fontName.name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430: -fontName.copyright = \u0410\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u043e: -button.preview = \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -button.reset = \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c -errors.info = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. -errors.warning = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f! \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. - -decompilationError = \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 - -disassemblingProgress.toString = \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a -disassemblingProgress.reading = \u0427\u0442\u0435\u043d\u0438\u0435 -disassemblingProgress.deobfuscating = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f - -contextmenu.moveTag = \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u044d\u0433 - -filter.swc = SWC \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (*.swc) -filter.zip = ZIP \u0430\u0440\u0445\u0438\u0432\u044b (*.zip) -filter.binary = \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a - \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b (*.*) - -open.error = \u041e\u0448\u0438\u0431\u043a\u0430 -open.error.fileNotFound = \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d -open.error.cannotOpen = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b - -node.others = \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 - -#after version 1.8.1 -menu.tools.search = \u041f\u043e\u0438\u0441\u043a \u0442\u0435\u043a\u0441\u0442\u0430 - -#after version 1.8.1u1 -menu.tools.timeline = Timeline - -dialog.selectcolor.title = \u0412\u044b\u0431\u043e\u0440 \u0446\u0432\u0435\u0442\u0430 -button.selectcolor.hint = \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0446\u0432\u0435\u0442\u0430 - -#default item name, will be used in following sentences -generictag.array.item = \u044d\u043b\u0435\u043c\u0435\u043d\u0442 -generictag.array.insertbeginning = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u0432 \u043d\u0430\u0447\u0430\u043b\u043e -generictag.array.insertbefore = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u043f\u0435\u0440\u0435\u0434 -generictag.array.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c %item% -generictag.array.insertafter = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u043f\u043e\u0441\u043b\u0435 -generictag.array.insertend = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u0432 \u043a\u043e\u043d\u0435\u0446 - -#after version 2.0.0 -contextmenu.expandAll = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 - -filter.sounds = \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b (*.wav,*.mp3) -filter.sounds.wav = Wave \u0444\u043e\u0440\u043c\u0430\u0442 (*.wav) -filter.sounds.mp3 = MP3 \u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 (*.mp3) - -error.sound.invalid = \u041d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0437\u0432\u0443\u043a. - -button.prev = \u041d\u0430\u0437\u0430\u0434 -button.next = \u0414\u0430\u043b\u0435\u0435 - -#after version 2.1.0 -message.action.playerglobal.title = \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 PlayerGlobal -message.action.playerglobal.needed = \u0414\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ActionScript 3 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 "PlayerGlobal.swc" \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Adobe.\r\n%adobehomepage%\r\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 OK, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044e. -message.action.playerglobal.place = \u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PlayerGlobal(.swc), \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0435\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435\r\n%libpath%\r\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 OK \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. - -message.confirm.experimental.function = \u042d\u0442\u043e \u042d\u041a\u0421\u041f\u0415\u0420\u0418\u041c\u0415\u041d\u0422\u0410\u041b\u042c\u041d\u0410\u042f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 swf \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. -message.confirm.donotshowagain = \u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 - -menu.import = \u0418\u043d\u043f\u043e\u0440\u0442 -menu.file.import.text = \u0418\u043c\u043f\u043e\u0440\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 -import.select.directory = \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 -error.text.import = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? - -#after version 2.1.1 -contextmenu.removeWithDependencies = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 - -abc.action.find-usages = \u041d\u0430\u0439\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f -abc.action.find-declaration = \u041d\u0430\u0439\u0442\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 - -contextmenu.rawEdit = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b -contextmenu.jumpToCharacter = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u0438\u043c\u0432\u043e\u043b\u0443 - -menu.settings.dumpView = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 - -menu.view = \u0412\u0438\u0434 -menu.file.view.resources = \u0420\u0435\u0441\u0443\u0440\u0441\u044b -menu.file.view.hex = Hex \u043e\u0431\u0440\u0430\u0437 - -node.header = \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a - -header.signature = \u041f\u043e\u0434\u043f\u0438\u0441\u044c: -header.compression = \u0421\u0436\u0430\u0442\u0438\u0435: -header.compression.lzma = LZMA -header.compression.zlib = ZLIB -header.compression.none = \u0411\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044f -header.version = \u0412\u0435\u0440\u0441\u0438\u044f SWF: -header.gfx = GFX: -header.filesize = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430: -header.framerate = \u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432: -header.framecount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432: -header.displayrect = \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430: -header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% \u0442\u0432\u0438\u043f\u043e\u0432 -header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 - -#after version 2.1.2 -contextmenu.saveToFile = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b -contextmenu.parseActions = \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 -contextmenu.parseABC = \u041f\u0430\u0440\u0441\u0438\u043d\u0433 ABC -contextmenu.parseInstructions = \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 AVM2 - -#after version 2.1.3 -menu.deobfuscation = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f AS1/2 -menu.file.deobfuscation.old = \u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 -menu.file.deobfuscation.new = \u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 - -#after version 2.1.4 -contextmenu.openswfinside = \u041e\u0442\u043a\u0440\u044b\u0442\u044c SWF \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u044d\u0433\u0430 -binarydata.swfInside = \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c binary data \u0442\u044d\u0433\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f SWF. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0442\u0443\u0442 \u0434\u043b\u044f \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. - -#after version 3.0.0 -button.zoomin.hint = \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c -button.zoomout.hint = \u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c -button.zoomfit.hint = \u0412\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043e\u043a\u043d\u043e -button.zoomnone.hint = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 1:1 -button.snapshot.hint = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 - -editorTruncateWarning = \u0412 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u0435\u043a\u0441\u0442 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043d\u043e\u043c\u0435\u0440 %chars%. - -#Font name which is presented in the SWF Font tag -font.name.intag = \u0418\u043c\u044f \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0442\u044d\u0433\u0435: - -menu.debugger = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a -menu.debugger.switch = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a -menu.debugger.replacetrace = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b trace -menu.debugger.showlog = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u043e\u0433 - -message.debugger = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a SWF \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u043a\u043d\u043e \u043b\u043e\u0433\u0430, \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439.\r\n\u041e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a\u0430\u043a \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0442.\u0434. - -contextmenu.addTag = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u044d\u0433 - -deobfuscation.comment.tryenable = \u0421\u043e\u0432\u0435\u0442: \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e" \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 -deobfuscation.comment.failed = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043d\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u041d\u0415 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e" \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. - -#after version 4.0.2 -preview.nextframe = \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 -preview.prevframe = \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 -preview.gotoframe = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u0430\u0434\u0440\u0443... - -preview.gotoframe.dialog.title = \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043a\u0430\u0434\u0440\u0443 -preview.gotoframe.dialog.message = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u043a\u0430\u0434\u0440\u0430 (%min% - %max%) -preview.gotoframe.dialog.frame.error = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043a\u0430\u0434\u0440\u0430. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 %min% \u0434\u043e %max%. - -error.text.invalid.continue = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442: %text% \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 %line%. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? - -#after version 4.0.5 -contextmenu.copyTag = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433 \u0432 -fit = fit -button.setAdvanceValues = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - -menu.tools.replace = \u0417\u0430\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 - -message.confirm.close = \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c {swfName}? -message.confirm.closeAll = \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 SWF? - -contextmenu.exportJavaSource = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Java -contextmenu.exportSwfXml = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF \u043a\u0430\u043a XML -contextmenu.importSwfXml = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML - -filter.xml = XML - -#after version 4.1.0 -contextmenu.undo = \u041e\u0442\u043c\u0435\u043d\u0430 - -text.align.left = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e -text.align.right = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e -text.align.center = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 -text.align.justify = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 - -text.undo = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f - -menu.file.import.xml = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML -menu.file.export.xml = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML - -#after version 4.1.1 -text.align.translatex.decrease = \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c TranslateX -text.align.translatex.increase = \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c TranslateX -selectPreviousTag = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u044d\u0433 -selectNextTag = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u044d\u0433 -button.ignoreAll = \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 -menu.file.import.symbolClass = \u041a\u043b\u0430\u0441\u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 +# Copyright (C) 2010-2015 JPEXS +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +menu.file = \u0424\u0430\u0439\u043b +menu.file.open = \u041e\u0442\u043a\u0440\u044b\u0442\u044c... +menu.file.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +menu.file.saveas = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a... +menu.file.export.fla = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 FLA +menu.file.export.all = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 +menu.file.export.selection = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +menu.file.exit = \u0412\u044b\u0439\u0442\u0438 + +menu.tools = \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b +menu.tools.searchas = \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0432\u0441\u0435\u043c\u0443 ActionScript... +menu.tools.proxy = \u041f\u0440\u043e\u043a\u0441\u0438 +menu.tools.deobfuscation = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f +menu.tools.deobfuscation.pcode = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f P-code... +menu.tools.deobfuscation.globalrename = \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +menu.tools.deobfuscation.renameinvalid = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b +menu.tools.gotoDocumentClass = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 + +menu.settings = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +menu.settings.autodeobfuscation = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f +menu.settings.internalflashviewer = \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c Flash +menu.settings.parallelspeedup = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c (\u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) +menu.settings.disabledecompilation = \u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c) +menu.settings.addtocontextmenu = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c FFDec \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e SWF \u0444\u0430\u0439\u043b\u043e\u0432 +menu.settings.language = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044f\u0437\u044b\u043a +menu.settings.cacheOnDisk = \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a +menu.settings.gotoMainClassOnStartup = \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 + +menu.help = \u041f\u043e\u043c\u043e\u0449\u044c +menu.help.checkupdates = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f... +menu.help.helpus = \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u043d\u0430\u0441! +menu.help.homepage = \u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 +menu.help.about = \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435... + +contextmenu.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c + +button.save = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +button.edit = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c +button.cancel = \u041e\u0442\u043c\u0435\u043d\u0430 +button.replace = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c... + +notavailonthisplatform = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Windows). + +swfpreview = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 SWF +swfpreview.internal = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 SWF (\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c) + +parameters = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b + +rename.enternew = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f: + +rename.finished.identifier = \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d. +rename.finished.multiname = %count% multiname \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043e. + +node.texts = \u0442\u0435\u043a\u0441\u0442\u044b +node.images = \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f +node.movies = \u0432\u0438\u0434\u0435\u043e +node.sounds = \u0437\u0432\u0443\u043a\u0438 +node.binaryData = \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 +node.fonts = \u0448\u0440\u0438\u0444\u0442\u044b +node.sprites = \u0441\u043f\u0440\u0430\u0439\u0442\u044b +node.shapes = \u0444\u043e\u0440\u043c\u044b +node.morphshapes = morphshapes +node.buttons = \u043a\u043d\u043e\u043f\u043a\u0438 +node.frames = \u043a\u0430\u0434\u0440\u044b +node.scripts = \u0441\u043a\u0440\u0438\u043f\u0442\u044b + +message.warning = \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 +message.confirm.experimental = \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c SWF \u0444\u0430\u0439\u043b \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0438\u043c.\r\n\u0418\u0421\u041f\u041e\u041b\u042c\u0417\u0423\u0419\u0422\u0415 \u041d\u0410 \u0421\u0412\u041e\u0419 \u0421\u0422\u0420\u0410\u0425 \u0418 \u0420\u0418\u0421\u041a! \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? +message.confirm.parallel = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e, \u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. +message.confirm.on = \u0412\u041a\u041b\u044e\u0447\u0438\u0442\u044c? +message.confirm.off = \u0412\u042b\u041a\u041b\u044e\u0447\u0438\u0442\u044c? +message.confirm = \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c + +message.confirm.autodeobfuscate = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.\r\n\u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \"\u043c\u0451\u0440\u0442\u0432\u043e\u0433\u043e\" \u043a\u043e\u0434\u0430.\r\n\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u043d\u0435 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d. + +message.parallel = \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c +message.trait.saved = Trait \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d + +message.constant.new.string = \u0421\u0442\u0440\u043e\u043a\u0430 (String) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? +message.constant.new.string.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 (String) +message.constant.new.integer = \u0426\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Integer) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? +message.constant.new.integer.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Integer) +message.constant.new.unsignedinteger = \u0411\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Unsigned integer) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? +message.constant.new.unsignedinteger.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Unsigned integer) +message.constant.new.double = \u0414\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Double) "%value%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c? +message.constant.new.double.title = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (Double) + +work.buffering = \u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f +work.waitingfordissasembly = \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f +work.gettinghilights = \u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 +work.disassembling = \u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 +work.exporting = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 +work.searching = \u041f\u043e\u0438\u0441\u043a +work.renaming = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 +work.exporting.fla = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 FLA +work.renaming.identifiers = \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 +work.deobfuscating = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f +work.decompiling = \u0414\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f +work.gettingvariables = \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 +work.reading.swf = \u0427\u0442\u0435\u043d\u0438\u0435 SWF +work.creatingwindow = \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 +work.buildingscripttree = \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 + +work.deobfuscating.complete = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 + +message.search.notfound = \u0422\u0435\u043a\u0441\u0442 "%searchtext%" \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. +message.search.notfound.title = \u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e + +message.rename.notfound.multiname = \u041f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c multiname +message.rename.notfound.identifier = \u041f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 +message.rename.notfound.title = \u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e +message.rename.renamed = \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043e: %count% + +filter.images = \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (*.jpg,*.gif,*.png,*.bmp) +filter.fla = \u041f\u0440\u043e\u0435\u043a\u0442 %version% (*.fla) +filter.xfl = \u041d\u0435\u0441\u0436\u0430\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 %version% (*.xfl) +filter.swf = SWF \u0444\u0430\u0439\u043b\u044b (*.swf) + +error = \u041e\u0448\u0438\u0431\u043a\u0430 +error.image.invalid = \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. + +error.text.invalid = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442: %text% \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 %line% +error.file.save = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b +error.file.write = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b +error.export = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 + +export.select.directory = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 +export.finishedin = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0437\u0430 %time% + +update.check.title = \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 +update.check.nonewversion = \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0435\u0442. + +message.helpus = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\r\n%url%\r\n\u0434\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439. +message.homepage = \u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443: \r\n%url% + +proxy = \u041f\u0440\u043e\u043a\u0441\u0438 +proxy.start = \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 +proxy.stop = \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 +proxy.show = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 +exit = \u0412\u044b\u0439\u0442\u0438 + +panel.disassembled = P-\u043a\u043e\u0434 +panel.decompiled = ActionScript + +search.info = \u041f\u043e\u0438\u0441\u043a "%text%": +search.script = \u0421\u043a\u0440\u0438\u043f\u0442 + +constants = Constants +traits = Traits + +pleasewait = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 + +abc.detail.methodtrait = Method/Getter/Setter Trait +abc.detail.unsupported = - +abc.detail.slotconsttrait = Slot/Const Trait +abc.detail.traitname = \u0418\u043c\u044f: + +abc.detail.body.params.maxstack = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0435\u043a\u0430: +abc.detail.body.params.localregcount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432: +abc.detail.body.params.minscope = \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438: +abc.detail.body.params.maxscope = \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438: +abc.detail.body.params.autofill = \u0410\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 (\u0413\u041b\u041e\u0411\u0410\u041b\u042c\u041d\u0410\u042f \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410) +abc.detail.body.params.autofill.experimental = ...\u042d\u041a\u0421\u041f\u0415\u0420\u0418\u041c\u0415\u041d\u0422\u0410\u041b\u042c\u041d\u041e + +abc.detail.methodinfo.methodindex = \u0418\u043d\u0434\u0435\u043a\u0441 \u043c\u0435\u0442\u043e\u0434\u0430: +abc.detail.methodinfo.parameters = \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b: +abc.detail.methodinfo.returnvalue = \u0422\u0438\u043f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: + +error.methodinfo.params = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 MethodInfo +error.methodinfo.returnvalue = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0442\u0438\u043f\u0435 \u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f MethodInfo + +abc.detail.methodinfo = MethodInfo +abc.detail.body.code = \u041a\u043e\u0434 MethodBody +abc.detail.body.params = \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b MethodBody + +abc.detail.slotconst.typevalue = \u0422\u0438\u043f \u0438 \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: + +error.slotconst.typevalue = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0442\u0438\u043f\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f SlotConst + +message.autofill.failed = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.\r\n\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. +info.selecttrait = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 trait \u0432 ActionScript \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. + +button.viewgraph = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0413\u0440\u0430\u0444\u0430 +button.viewhex = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 Hex + +abc.traitslist.instanceinitializer = \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 +abc.traitslist.classinitializer = \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 + +action.edit.experimental = (\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e) + +message.action.saved = \u041a\u043e\u0434 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d + +error.action.save = %error% \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 %line% + +message.confirm.remove = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 %item%\n \u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u043d\u0435\u0433\u043e? + +#after version 1.6.5u1: + +button.ok = OK +button.cancel = \u041e\u0442\u043c\u0435\u043d\u0430 + +font.name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430: +font.isbold = \u0416\u0438\u0440\u043d\u044b\u0439: +font.isitalic = \u041a\u0443\u0440\u0441\u0438\u0432: +font.ascent = \u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0432\u044b\u043d\u043e\u0441: +font.descent = \u041d\u0438\u0436\u043d\u0438\u0439 \u0432\u044b\u043d\u043e\u0441: +font.leading = \u0418\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u044c\u044f\u0436: +font.characters = \u0421\u0438\u043c\u0432\u043e\u043b\u044b: +font.characters.add = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b: +value.unknown = ? + +yes = \u0434\u0430 +no = \u043d\u0435\u0442 + +errors.present = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u041e\u0428\u0418\u0411\u041a\u0418. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. +errors.none = \u0412 \u043b\u043e\u0433\u0435 \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a. + +#after version 1.6.6: + +dialog.message.title = \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 +dialog.select.title = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 + +button.yes = \u0414\u0430 +button.no = \u041d\u0435\u0442 + +FileChooser.openButtonText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c +FileChooser.openButtonToolTipText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c +FileChooser.lookInLabelText = \u0418\u0441\u043a\u0430\u0442\u044c \u0432: +FileChooser.acceptAllFileFilterText = \u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b +FileChooser.filesOfTypeLabelText = \u0422\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432: +FileChooser.fileNameLabelText = \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430: +FileChooser.listViewButtonToolTipText = \u0421\u043f\u0438\u0441\u043e\u043a +FileChooser.listViewButtonAccessibleName = \u0421\u043f\u0438\u0441\u043e\u043a +FileChooser.detailsViewButtonToolTipText = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 +FileChooser.detailsViewButtonAccessibleName = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 +FileChooser.upFolderToolTipText = \u0412\u0432\u0435\u0440\u0445 +FileChooser.upFolderAccessibleName = \u0412\u0432\u0435\u0440\u0445 +FileChooser.homeFolderToolTipText = \u0414\u043e\u043c\u043e\u0439 +FileChooser.homeFolderAccessibleName = \u0414\u043e\u043c\u043e\u0439 +FileChooser.fileNameHeaderText = \u0418\u043c\u044f +FileChooser.fileSizeHeaderText = \u0420\u0430\u0437\u043c\u0435\u0440 +FileChooser.fileTypeHeaderText = \u0422\u0438\u043f +FileChooser.fileDateHeaderText = \u0414\u0430\u0442\u0430 +FileChooser.fileAttrHeaderText = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b +FileChooser.openDialogTitleText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c +FileChooser.directoryDescriptionText = \u041f\u0430\u043f\u043a\u0430 +FileChooser.directoryOpenButtonText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c +FileChooser.directoryOpenButtonToolTipText = \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 +FileChooser.fileDescriptionText = \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b +FileChooser.helpButtonText = \u041f\u043e\u043c\u043e\u0449\u044c +FileChooser.helpButtonToolTipText = \u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 +FileChooser.newFolderAccessibleName = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +FileChooser.newFolderErrorText = \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 +FileChooser.newFolderToolTipText = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 +FileChooser.other.newFolder = \u041d\u043e\u0432\u0430\u044f\u041f\u0430\u043f\u043a\u0430 +FileChooser.other.newFolder.subsequent = \u041d\u043e\u0432\u0430\u044f\u041f\u0430\u043f\u043a\u0430.{0} +FileChooser.win32.newFolder = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +FileChooser.win32.newFolder.subsequent = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 ({0}) +FileChooser.saveButtonText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +FileChooser.saveButtonToolTipText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b +FileChooser.saveDialogTitleText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +FileChooser.saveInLabelText = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432: +FileChooser.updateButtonText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +FileChooser.updateButtonToolTipText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043f\u043a\u0438 + +#after version 1.6.6u2: + +FileChooser.detailsViewActionLabel.textAndMnemonic = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 +FileChooser.detailsViewButtonToolTip.textAndMnemonic = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 +FileChooser.fileAttrHeader.textAndMnemonic = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b +FileChooser.fileDateHeader.textAndMnemonic = \u0418\u0437\u043c\u0435\u043d\u0435\u043d +FileChooser.fileNameHeader.textAndMnemonic = \u0418\u043c\u044f +FileChooser.fileNameLabel.textAndMnemonic = \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430: +FileChooser.fileSizeHeader.textAndMnemonic = \u0420\u0430\u0437\u043c\u0435\u0440 +FileChooser.fileTypeHeader.textAndMnemonic = \u0422\u0438\u043f +FileChooser.filesOfTypeLabel.textAndMnemonic = \u0424\u0430\u0439\u043b\u044b \u0442\u0438\u043f\u0430: +FileChooser.folderNameLabel.textAndMnemonic = \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438: +FileChooser.homeFolderToolTip.textAndMnemonic = \u0414\u043e\u043c\u043e\u0439 +FileChooser.listViewActionLabel.textAndMnemonic = \u0421\u043f\u0438\u0441\u043e\u043a +FileChooser.listViewButtonToolTip.textAndMnemonic = \u0421\u043f\u0438\u0441\u043e\u043a +FileChooser.lookInLabel.textAndMnemonic = \u0418\u0441\u043a\u0430\u0442\u044c \u0432: +FileChooser.newFolderActionLabel.textAndMnemonic = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +FileChooser.newFolderToolTip.textAndMnemonic = \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 +FileChooser.refreshActionLabel.textAndMnemonic = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +FileChooser.saveInLabel.textAndMnemonic = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432: +FileChooser.upFolderToolTip.textAndMnemonic = \u0412\u0432\u0435\u0440\u0445 +FileChooser.viewMenuButtonAccessibleName = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u041c\u0435\u043d\u044e +FileChooser.viewMenuButtonToolTipText = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u041c\u0435\u043d\u044e +FileChooser.viewMenuLabel.textAndMnemonic = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 +FileChooser.newFolderActionLabelText = \u041d\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430 +FileChooser.listViewActionLabelText = \u0421\u043f\u0438\u0441\u043e\u043a +FileChooser.detailsViewActionLabelText = \u0422\u0430\u0431\u043b\u0438\u0446\u0430 +FileChooser.refreshActionLabelText = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c +FileChooser.sortMenuLabelText = \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u043a\u0438 +FileChooser.viewMenuLabelText = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 +FileChooser.fileSizeKiloBytes = {0} \u041a\u0411 +FileChooser.fileSizeMegaBytes = {0} \u041c\u0411 +FileChooser.fileSizeGigaBytes = {0} \u0413\u0411 +FileChooser.folderNameLabelText = \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438: + +error.occured = \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430: %error% +button.abort = \u041f\u0440\u0435\u0440\u0432\u0430\u0442\u044c +button.retry = \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c +button.ignore = \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c + +font.source = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430: + +#after version 1.6.7: + +menu.export = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 +menu.general = \u041e\u0431\u0449\u0438\u0435 +menu.language = \u042f\u0437\u044b\u043a + +startup.welcometo = \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 +startup.selectopen = \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u043e\u043a "\u041e\u0442\u043a\u0440\u044b\u0442\u044c" \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 SWF \u0444\u0430\u0439\u043b \u0432 \u044d\u0442\u043e \u043e\u043a\u043d\u043e. + +error.font.nocharacter = \u0421\u0438\u043c\u0432\u043e\u043b "%char%" \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0448\u0440\u0438\u0444\u0442\u0435. + +warning.initializers = \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u0445.\n\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c, \u043d\u043e \u0438 \u0442\u0430\u043c! + +#after version 1.7.0u1: + +menu.tools.searchMemory = \u0418\u0441\u043a\u0430\u0442\u044c SWF \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 +menu.file.reload = \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c +message.confirm.reload = \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 SWF \u0444\u0430\u0439\u043b.\n \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? + +dialog.selectbkcolor.title = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 SWF +button.selectbkcolor.hint = \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 + +ColorChooser.okText = \u041e\u041a +ColorChooser.cancelText = \u041e\u0442\u043c\u0435\u043d\u0430 +ColorChooser.resetText = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c +ColorChooser.previewText = \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 +ColorChooser.swatchesNameText = \u041e\u0431\u0440\u0430\u0437\u0446\u044b +ColorChooser.swatchesRecentText = \u041d\u0435\u0434\u0430\u0432\u043d\u0435\u0435: +ColorChooser.sampleText = \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0434\u043f\u0438\u0441\u0438 \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0434\u043f\u0438\u0441\u0438 + +#after version 1.7.1: + +preview.play = \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 +preview.pause = \u041f\u0430\u0443\u0437\u0430 +preview.stop = \u0421\u0442\u043e\u043f + +message.confirm.removemultiple = \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435: %count%\n \u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u043d\u0438\u0445? + +menu.tools.searchCache = \u041f\u043e\u0438\u0441\u043a \u0432 \u043a\u044d\u0448\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 + +#after version 1.7.2u2 + +error.trait.exists = Trait \u0441 \u0438\u043c\u0435\u043d\u0435\u043c "%name%" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. +button.addtrait = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c trait +button.font.embed = \u0412\u0441\u0442\u0440\u043e\u0438\u0442\u044c... +button.yes.all = \u0414\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 +button.no.all = \u041d\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 +message.font.add.exists = \u0421\u0438\u043c\u0432\u043e\u043b %char% \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0442\u044d\u0433\u0435 \u0448\u0440\u0438\u0444\u0442\u0430.\n\u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043b\u0438 \u0412\u044b \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c? + +filter.gfx = GFx \u0444\u0430\u0439\u043b\u044b ScaleForm (*.gfx) +filter.supported = \u0412\u0441\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b +work.canceled = \u041e\u0442\u043c\u0435\u043d\u0435\u043d\u043e +work.restoringControlFlow = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 +menu.advancedsettings.advancedsettings = \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +menu.recentFiles = \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b + +#after version 1.7.4 +work.restoringControlFlow.complete = \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d +message.confirm.recentFileNotFound = \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432? +contextmenu.closeSwf = \u0417\u0430\u043a\u0440\u044b\u0442\u044c SWF +menu.settings.autoRenameIdentifiers = \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b +menu.file.saveasexe = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a Exe... +filter.exe = \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (*.exe) + +#after version 1.8.0 +font.updateTexts = \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0434\u043f\u0438\u0441\u0438 + +#after version 1.8.0u1 +menu.file.close = \u0417\u0430\u043a\u0440\u044b\u0442\u044c +menu.file.closeAll = \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 +menu.tools.otherTools = \u0414\u0440\u0443\u0433\u043e\u0435 +menu.tools.otherTools.clearRecentFiles = \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 +fontName.name = \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430: +fontName.copyright = \u0410\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u043e: +button.preview = \u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 +button.reset = \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c +errors.info = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. +errors.warning = \u0412 \u043b\u043e\u0433\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f! \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. + +decompilationError = \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 + +disassemblingProgress.toString = \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a +disassemblingProgress.reading = \u0427\u0442\u0435\u043d\u0438\u0435 +disassemblingProgress.deobfuscating = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f + +contextmenu.moveTag = \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u044d\u0433 + +filter.swc = SWC \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (*.swc) +filter.zip = ZIP \u0430\u0440\u0445\u0438\u0432\u044b (*.zip) +filter.binary = \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a - \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b (*.*) + +open.error = \u041e\u0448\u0438\u0431\u043a\u0430 +open.error.fileNotFound = \u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d +open.error.cannotOpen = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b + +node.others = \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 + +#after version 1.8.1 +menu.tools.search = \u041f\u043e\u0438\u0441\u043a \u0442\u0435\u043a\u0441\u0442\u0430 + +#after version 1.8.1u1 +menu.tools.timeline = Timeline + +dialog.selectcolor.title = \u0412\u044b\u0431\u043e\u0440 \u0446\u0432\u0435\u0442\u0430 +button.selectcolor.hint = \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0446\u0432\u0435\u0442\u0430 + +#default item name, will be used in following sentences +generictag.array.item = \u044d\u043b\u0435\u043c\u0435\u043d\u0442 +generictag.array.insertbeginning = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u0432 \u043d\u0430\u0447\u0430\u043b\u043e +generictag.array.insertbefore = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u043f\u0435\u0440\u0435\u0434 +generictag.array.remove = \u0423\u0434\u0430\u043b\u0438\u0442\u044c %item% +generictag.array.insertafter = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u043f\u043e\u0441\u043b\u0435 +generictag.array.insertend = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c %item% \u0432 \u043a\u043e\u043d\u0435\u0446 + +#after version 2.0.0 +contextmenu.expandAll = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 + +filter.sounds = \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b (*.wav,*.mp3) +filter.sounds.wav = Wave \u0444\u043e\u0440\u043c\u0430\u0442 (*.wav) +filter.sounds.mp3 = MP3 \u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 (*.mp3) + +error.sound.invalid = \u041d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0437\u0432\u0443\u043a. + +button.prev = \u041d\u0430\u0437\u0430\u0434 +button.next = \u0414\u0430\u043b\u0435\u0435 + +#after version 2.1.0 +message.action.playerglobal.title = \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 PlayerGlobal +message.action.playerglobal.needed = \u0414\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ActionScript 3 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 "PlayerGlobal.swc" \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Adobe.\r\n%adobehomepage%\r\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 OK, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044e. +message.action.playerglobal.place = \u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PlayerGlobal(.swc), \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0435\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435\r\n%libpath%\r\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 OK \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. + +message.confirm.experimental.function = \u042d\u0442\u043e \u042d\u041a\u0421\u041f\u0415\u0420\u0418\u041c\u0415\u041d\u0422\u0410\u041b\u042c\u041d\u0410\u042f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 swf \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. +message.confirm.donotshowagain = \u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 + +menu.import = \u0418\u043d\u043f\u043e\u0440\u0442 +menu.file.import.text = \u0418\u043c\u043f\u043e\u0440\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 +import.select.directory = \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 +error.text.import = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? + +#after version 2.1.1 +contextmenu.removeWithDependencies = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 + +abc.action.find-usages = \u041d\u0430\u0439\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f +abc.action.find-declaration = \u041d\u0430\u0439\u0442\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 + +contextmenu.rawEdit = \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b +contextmenu.jumpToCharacter = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u0438\u043c\u0432\u043e\u043b\u0443 + +menu.settings.dumpView = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 + +menu.view = \u0412\u0438\u0434 +menu.file.view.resources = \u0420\u0435\u0441\u0443\u0440\u0441\u044b +menu.file.view.hex = Hex \u043e\u0431\u0440\u0430\u0437 + +node.header = \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + +header.signature = \u041f\u043e\u0434\u043f\u0438\u0441\u044c: +header.compression = \u0421\u0436\u0430\u0442\u0438\u0435: +header.compression.lzma = LZMA +header.compression.zlib = ZLIB +header.compression.none = \u0411\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044f +header.version = \u0412\u0435\u0440\u0441\u0438\u044f SWF: +header.gfx = GFX: +header.filesize = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430: +header.framerate = \u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u0430\u0434\u0440\u043e\u0432: +header.framecount = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432: +header.displayrect = \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430: +header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% \u0442\u0432\u0438\u043f\u043e\u0432 +header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 + +#after version 2.1.2 +contextmenu.saveToFile = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b +contextmenu.parseActions = \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 +contextmenu.parseABC = \u041f\u0430\u0440\u0441\u0438\u043d\u0433 ABC +contextmenu.parseInstructions = \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 AVM2 + +#after version 2.1.3 +menu.deobfuscation = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f +menu.file.deobfuscation.old = \u0421\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 +menu.file.deobfuscation.new = \u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 + +#after version 2.1.4 +contextmenu.openswfinside = \u041e\u0442\u043a\u0440\u044b\u0442\u044c SWF \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u044d\u0433\u0430 +binarydata.swfInside = \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c binary data \u0442\u044d\u0433\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f SWF. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0442\u0443\u0442 \u0434\u043b\u044f \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0434\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438. + +#after version 3.0.0 +button.zoomin.hint = \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c +button.zoomout.hint = \u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c +button.zoomfit.hint = \u0412\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043e\u043a\u043d\u043e +button.zoomnone.hint = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 1:1 +button.snapshot.hint = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 + +editorTruncateWarning = \u0412 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0442\u0435\u043a\u0441\u0442 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043d\u043e\u043c\u0435\u0440 %chars%. + +#Font name which is presented in the SWF Font tag +font.name.intag = \u0418\u043c\u044f \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0442\u044d\u0433\u0435: + +menu.debugger = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a +menu.debugger.switch = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a +menu.debugger.replacetrace = \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b trace +menu.debugger.showlog = \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u043e\u0433 + +message.debugger = \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a SWF \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u043a\u043d\u043e \u043b\u043e\u0433\u0430, \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439.\r\n\u041e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a\u0430\u043a \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0442.\u0434. + +contextmenu.addTag = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u044d\u0433 + +deobfuscation.comment.tryenable = \u0421\u043e\u0432\u0435\u0442: \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e" \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 +deobfuscation.comment.failed = \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043d\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u041d\u0415 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e" \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. + +#after version 4.0.2 +preview.nextframe = \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 +preview.prevframe = \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 +preview.gotoframe = \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u0430\u0434\u0440\u0443... + +preview.gotoframe.dialog.title = \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043a\u0430\u0434\u0440\u0443 +preview.gotoframe.dialog.message = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u043a\u0430\u0434\u0440\u0430 (%min% - %max%) +preview.gotoframe.dialog.frame.error = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043a\u0430\u0434\u0440\u0430. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 %min% \u0434\u043e %max%. + +error.text.invalid.continue = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442: %text% \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 %line%. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? + +#after version 4.0.5 +contextmenu.copyTag = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433 \u0432 +fit = fit +button.setAdvanceValues = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f + +menu.tools.replace = \u0417\u0430\u043c\u0435\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 + +message.confirm.close = \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c {swfName}? +message.confirm.closeAll = \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 SWF? + +contextmenu.exportJavaSource = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Java +contextmenu.exportSwfXml = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF \u043a\u0430\u043a XML +contextmenu.importSwfXml = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML + +filter.xml = XML + +#after version 4.1.0 +contextmenu.undo = \u041e\u0442\u043c\u0435\u043d\u0430 + +text.align.left = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e +text.align.right = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e +text.align.center = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 +text.align.justify = \u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 + +text.undo = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f + +menu.file.import.xml = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML +menu.file.export.xml = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c SWF XML + +#after version 4.1.1 +text.align.translatex.decrease = \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c TranslateX +text.align.translatex.increase = \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c TranslateX +selectPreviousTag = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u044d\u0433 +selectNextTag = \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u044d\u0433 +button.ignoreAll = \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 +menu.file.import.symbolClass = \u041a\u043b\u0430\u0441\u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties index df9083949..cfaa65488 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties @@ -1,616 +1,616 @@ -# Copyright (C) 2010-2015 JPEXS -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -menu.file = Fil -menu.file.open = \u00d6ppna... -menu.file.save = Spara -menu.file.saveas = Spara som... -menu.file.export.fla = Exportera till FLA -menu.file.export.all = Exportera alla delar -menu.file.export.selection = Exportera markering -menu.file.exit = St\u00e4ng - -menu.tools = Verktyg -menu.tools.searchas = S\u00f6k igenom alla ActionSkript... -menu.tools.proxy = Proxy -menu.tools.deobfuscation = Avl\u00e4gsna obfuskering -menu.tools.deobfuscation.pcode = Avl\u00e4gsna obfuskerad Bytekod... -menu.tools.deobfuscation.globalrename = Byt namn p\u00e5 global identifierare -menu.tools.deobfuscation.renameinvalid = Byt namn p\u00e5 felaktiga identifierare -menu.tools.gotoDocumentClass = G\u00e5 till dokumentklass - -menu.settings = Inst\u00e4llningar -menu.settings.autodeobfuscation = Automatiskt avl\u00e4gsning av obfuskering -menu.settings.internalflashviewer = Anv\u00e4nd egen Flash-spelare -menu.settings.parallelspeedup = Parallell uppsnabbning -menu.settings.disabledecompilation = Inaktivera dekompilering (Demontera endast) -menu.settings.addtocontextmenu = L\u00e4gg till FFDec till SWF-filernas snabbmeny -menu.settings.language = Byt spr\u00e5k -menu.settings.cacheOnDisk = Anv\u00e4nd cachelagring p\u00e5 h\u00e5rddisken -menu.settings.gotoMainClassOnStartup = Markera dokumentklass vid uppstart - -menu.help = Hj\u00e4lp -menu.help.checkupdates = Leta efter uppdateringar... -menu.help.helpus = Hj\u00e4lp oss! -menu.help.homepage = Bes\u00f6k hemsidan -menu.help.about = Om... - -contextmenu.remove = Ta bort - -button.save = Spara -button.edit = \u00c4ndra -button.cancel = \u00c5ngra -button.replace = Ers\u00e4tt... - -notavailonthisplatform = F\u00f6rhandsgranskning av detta objekt \u00e4r inte tillg\u00e4nglig p\u00e5 denna plattform. (Windows bara) - -swfpreview = SWF f\u00f6rhandsvisning -swfpreview.internal = SWF f\u00f6rhandsvisning (Intern f\u00f6rhandsvisning) - -parameters = Parametrar - -rename.enternew = Ange det nya namnet: - -rename.finished.identifier = Identifierare omd\u00f6pt. -rename.finished.multiname = %count% multiname har blivit omd\u00f6pt(a). - -node.texts = texter -node.images = bilder -node.movies = filmer -node.sounds = ljud -node.binaryData = bin\u00e4rData -node.fonts = teckensnitt -node.sprites = sprites -node.shapes = former -node.morphshapes = morphform -node.buttons = knappar -node.frames = ramar -node.scripts = skript - -message.warning = Varning -message.confirm.experimental = F\u00f6ljande tillv\u00e4gag\u00e5ngss\u00e4tt kan skada SWF-filen som kan d\u00e4refter bli ospelbar.\r\nANV\u00c4ND DEN P\u00c5 DIN EGEN RISK. Vill du forts\u00e4tta? -message.confirm.parallel = Parallellitet kan snabba upp laddning och dekompilering, men anv\u00e4nda mera minne. -message.confirm.on = Vill du aktivera detta? -message.confirm.off = Vill du avaktivera detta? -message.confirm = Bekr\u00e4fta - -message.confirm.autodeobfuscate = Automatiskt avl\u00e4gsning av obfuskering \u00e4r ett s\u00e4tt till att dekompilera obfuskerad kod.\r\nAvl\u00e4gsna obfuskerad kod leder till sl\u00f6are dekompilering och n\u00e5gon d\u00f6d kod kan bli borttagen..\r\nOm koden inte \u00e4r obfuskerad, s\u00e5 \u00e4r det b\u00e4ttre att st\u00e4nga av automatisk borttagning av obfuskering. - -message.parallel = parallellitet -message.trait.saved = Egenskap har sparats - -message.constant.new.string = Str\u00e4ng "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? -message.constant.new.string.title = L\u00e4gg till Str\u00e4ng -message.constant.new.integer = Heltal v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? -message.constant.new.integer.title = L\u00e4gg till Heltal -message.constant.new.unsignedinteger = Osignerat heltal v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? -message.constant.new.unsignedinteger.title = L\u00e4gg till Osignerat heltal -message.constant.new.double = Dubbelt v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? -message.constant.new.double.title = L\u00e4gg till Dubbel - -work.buffering = Buffrar -work.waitingfordissasembly = V\u00e4ntar p\u00e5 demontering -work.gettinghilights = Getting hilights -work.disassembling = Demonterar -work.exporting = Exporterar -work.searching = S\u00f6ker -work.renaming = \u00c4ndrar namn -work.exporting.fla = Exporterar FLA -work.renaming.identifiers = \u00c4ndrar namn p\u00e5 identifierare -work.deobfuscating = Avl\u00e4gsning utav obfuskering -work.decompiling = Dekompilering -work.gettingvariables = Tar variablar -work.reading.swf = L\u00e4ser SWF -work.creatingwindow = Skapar f\u00f6nster -work.buildingscripttree = Bygger skript tr\u00e4 - -work.deobfuscating.complete = Avl\u00e4gsning utav obfuskering \u00e4r nu f\u00e4rdig - -message.search.notfound = Str\u00e4ng "%searchtext%" hittades inte. -message.search.notfound.title = Hittades inte - -message.rename.notfound.multiname = Ingen multiname hittades under mark\u00f6ren -message.rename.notfound.identifier = ingen identifiering hittades under mark\u00f6ren -message.rename.notfound.title = Hittades inte -message.rename.renamed = Identifierare som har \u00e4ndrat namn: %count% - -filter.images = Bilder (*.jpg,*.gif,*.png,*.bmp) -filter.fla = %version% Dokument (*.fla) -filter.xfl = %version% Okomprimerat Dokument (*.xfl) -filter.swf = SWF filer (*.swf) - -error = Fel -error.image.invalid = Ogiltig bild. - -error.text.invalid = Ogiltig text: %text% p\u00e5 rad %line% -error.file.save = Kan inte spara filen -error.file.write = Kan inte skriva till filen -error.export = Fel under loppet av exporteringen - -export.select.directory = V\u00e4lj s\u00f6kv\u00e4g till katalog att exportera -export.finishedin = Exporterades i %time% - -update.check.title = Uppdaterings koll -update.check.nonewversion = Ingen ny version finns tillg\u00e4nglig. - -message.helpus = V\u00e4nligen bes\u00f6k\r\n%url%\r\nf\u00f6r mer detaljer. -message.homepage = Bes\u00f6k hemsidan: \r\n%url% - -proxy = Proxy -proxy.start = Starta proxy -proxy.stop = Stoppa proxy -proxy.show = Visa proxy -exit = St\u00e4ng - -panel.disassembled = P-code k\u00e4llkod -panel.decompiled = ActionSkript k\u00e4llkod - -search.info = S\u00f6k efter "%text%" : -search.script = Skript - -constants = Konstanter -traits = Egenskaper - -pleasewait = V\u00e4nligen v\u00e4nta - -abc.detail.methodtrait = Metod/F\u00e5ngare/Egenskap s\u00e4ttare -abc.detail.unsupported = - -abc.detail.slotconsttrait = Slot/Const Egenskap -abc.detail.traitname = Namn: - -abc.detail.body.params.maxstack = Maximal stapling: -abc.detail.body.params.localregcount = Lokala register r\u00e4knade: -abc.detail.body.params.minscope = Minsta omfattnings djup: -abc.detail.body.params.maxscope = Maximal omfattnings djup: -abc.detail.body.params.autofill = Automatisk utfyllnad n\u00e4r koden sparas (GLOBAL INST\u00c4LLNING) -abc.detail.body.params.autofill.experimental = ...EXPERIMENTELL - -abc.detail.methodinfo.methodindex = Metod register: -abc.detail.methodinfo.parameters = Parametrar: -abc.detail.methodinfo.returnvalue = \u00c5terl\u00e4mna v\u00e4rde: - -error.methodinfo.params = MetodInfo Parameter fel -error.methodinfo.returnvalue = MetodInfo \u00e5terl\u00e4mmnings typ Fel - -abc.detail.methodinfo = MetodInfo -abc.detail.body.code = MetodInfo Kod -abc.detail.body.params = MetodKropp parametrar - -abc.detail.slotconst.typevalue = Typ och V\u00e4rde: - -error.slotconst.typevalue = SlotConst typv\u00e4rde felaktighet - -message.autofill.failed = Kan inte f\u00e5 statistik koden f\u00f6r automatisk kropps-parametrar.\r\nAvmarkera automatisk ifyllnad f\u00f6r att undvika det h\u00e4r meddelandet. -info.selecttrait = V\u00e4lj klass och klicka p\u00e5 en egenskap i Actionskript k\u00e4llan f\u00f6r att redigera den. - -button.viewgraph = Visa Diagram -button.viewhex = Visa Hex - -abc.traitslist.instanceinitializer = instans initierare -abc.traitslist.classinitializer = klass initierare - -action.edit.experimental = (experimentellt) - -message.action.saved = Koden har sparats - -error.action.save = %error% p\u00e5 rad %line% - -message.confirm.remove = \u00c4r du s\u00e4ker p\u00e5 att du vill ta bort %item% \n och alla objekt som \u00e4r beroende av den? - -#after version 1.6.5u1: - -button.ok = Godk\u00e4nn -button.cancel = Avbryt - -font.name = Typsnitts namn: -font.isbold = \u00c4r fet: -font.isitalic = \u00c4r kursiv: -font.ascent = Stigande: -font.descent = Nedstigande: -font.leading = Ledande: -font.characters = Bokst\u00e4ver: -font.characters.add = L\u00e4gg till bokst\u00e4ver: -value.unknown = ? - -yes = ja -no = nej - -errors.present = Det finns FEL i loggen. Klicka f\u00f6r att visa loggen. -errors.none = Det finns inga fel i loggen - -#after version 1.6.6: - -dialog.message.title = Meddelande -dialog.select.title = V\u00e4lj ett alternativ - -button.yes = Ja -button.no = Nej - -FileChooser.openButtonText = \u00d6ppna -FileChooser.openButtonToolTipText = \u00d6ppna -FileChooser.lookInLabelText = Alla Filer -FileChooser.acceptAllFileFilterText = Kolla i: -FileChooser.filesOfTypeLabelText = Filformat: -FileChooser.fileNameLabelText = Filnamn: -FileChooser.listViewButtonToolTipText = Lista -FileChooser.listViewButtonAccessibleName = Lista -FileChooser.detailsViewButtonToolTipText = Detaljer -FileChooser.detailsViewButtonAccessibleName = Detaljer -FileChooser.upFolderToolTipText = Upp en niv\u00e5 -FileChooser.upFolderAccessibleName = Upp en niv\u00e5 -FileChooser.homeFolderToolTipText = Hem -FileChooser.homeFolderAccessibleName = Hem -FileChooser.fileNameHeaderText = Namn -FileChooser.fileSizeHeaderText = Storlek -FileChooser.fileTypeHeaderText = Typ -FileChooser.fileDateHeaderText = Datum -FileChooser.fileAttrHeaderText = Egenskaper -FileChooser.openDialogTitleText = \u00d6ppna -FileChooser.directoryDescriptionText = Katalog -FileChooser.directoryOpenButtonText = \u00d6ppna -FileChooser.directoryOpenButtonToolTipText = \u00d6ppna vald katalog -FileChooser.fileDescriptionText = Generic File -FileChooser.helpButtonText = Hj\u00e4lp -FileChooser.helpButtonToolTipText = FileChooser help -FileChooser.newFolderAccessibleName = Ny mapp -FileChooser.newFolderErrorText = N\u00e5got gick fel n\u00e4r den f\u00f6rs\u00f6kta skapa en ny mapp -FileChooser.newFolderToolTipText = Skapa ny mapp -FileChooser.other.newFolder = NyMapp -FileChooser.other.newFolder.subsequent = NyMapp.{0} -FileChooser.win32.newFolder = Ny mapp -FileChooser.win32.newFolder.subsequent = Ny mapp ({0}) -FileChooser.saveButtonText = Spara -FileChooser.saveButtonToolTipText = Spara vald fil -FileChooser.saveDialogTitleText = Spara -FileChooser.saveInLabelText = Spara i: -FileChooser.updateButtonText = Uppdatera -FileChooser.updateButtonToolTipText = Uppdatera kataloglistning - -#after version 1.6.6u2: - -FileChooser.detailsViewActionLabel.textAndMnemonic = Detaljer -FileChooser.detailsViewButtonToolTip.textAndMnemonic = Detaljer -FileChooser.fileAttrHeader.textAndMnemonic = Egenskaper -FileChooser.fileDateHeader.textAndMnemonic = Modifierad -FileChooser.fileNameHeader.textAndMnemonic = Namn -FileChooser.fileNameLabel.textAndMnemonic = Filnamn: -FileChooser.fileSizeHeader.textAndMnemonic = Storlek -FileChooser.fileTypeHeader.textAndMnemonic = Typ -FileChooser.filesOfTypeLabel.textAndMnemonic = Filformat: -FileChooser.folderNameLabel.textAndMnemonic = Mappnamn: -FileChooser.homeFolderToolTip.textAndMnemonic = Hem -FileChooser.listViewActionLabel.textAndMnemonic = Lista -FileChooser.listViewButtonToolTip.textAndMnemonic = Lista -FileChooser.lookInLabel.textAndMnemonic = Kolla i: -FileChooser.newFolderActionLabel.textAndMnemonic = Ny mapp -FileChooser.newFolderToolTip.textAndMnemonic = Skapa Ny Mapp -FileChooser.refreshActionLabel.textAndMnemonic = Refresh -FileChooser.saveInLabel.textAndMnemonic = Spara i: -FileChooser.upFolderToolTip.textAndMnemonic = Upp en niv\u00e5 -FileChooser.viewMenuButtonAccessibleName = Visa meny -FileChooser.viewMenuButtonToolTipText = Visa meny -FileChooser.viewMenuLabel.textAndMnemonic = Visa -FileChooser.newFolderActionLabelText = Ny mapp -FileChooser.listViewActionLabelText = Lista -FileChooser.detailsViewActionLabelText = Detaljer -FileChooser.refreshActionLabelText = Uppdatera -FileChooser.sortMenuLabelText = Ordna ikoner efter -FileChooser.viewMenuLabelText = Visa -FileChooser.fileSizeKiloBytes = {0} KB -FileChooser.fileSizeMegaBytes = {0} MB -FileChooser.fileSizeGigaBytes = {0} GB -FileChooser.folderNameLabelText = Mappnamn: - -error.occured = Ett fel uppstod : %error% -button.abort = Avbryt -button.retry = F\u00f6rs\u00f6k igen -button.ignore = Ignorera - -font.source = Typsnitts k\u00e4lla: - -#after version 1.6.7: - -menu.export = Exportera -menu.general = Allm\u00e4nt -menu.language = Spr\u00e5k start. - -startup.welcometo = V\u00e4lkommen till -startup.selectopen = Klicka p\u00e5 ikonen \u00d6ppna p\u00e5 den \u00f6vre panelen eller dra SWF-filen till f\u00f6nstret f\u00f6r att starta. - -error.font.nocharacter = Vald teckensnitt-k\u00e4lla inneh\u00e5ller inte bokstav "%char%". - -warning.initializers = Statiska f\u00e4lt och consts initieras i initierare ofta.\nRedigera v\u00e4rdet h\u00e4r \u00e4r oftast inte tillr\u00e4ckligt! - -#after version 1.7.0u1: - -menu.tools.searchMemory = S\u00f6k efter SWFs i minnet -menu.file.reload = Ladda om -message.confirm.reload = Denna \u00e5tg\u00e4rd avbryter alla \u00e4ndringar som inte sparats och laddar om SWF filen igen.\nVill du forts\u00e4tta? - -dialog.selectbkcolor.title = V\u00e4lj bakgrundsf\u00e4rg f\u00f6r SWF display -button.selectbkcolor.hint = V\u00e4lj bakgrundsf\u00e4rg - -ColorChooser.okText = Acceptera -ColorChooser.cancelText = Avbryt -ColorChooser.resetText = \u00c5terst\u00e4ll -ColorChooser.previewText = F\u00f6rhandsvisning -ColorChooser.swatchesNameText = F\u00e4rgrutor -ColorChooser.swatchesRecentText = Nyligen: -ColorChooser.sampleText=Exempel Text Exempel Text - -#after version 1.7.1: - -preview.play = Spela -preview.pause = Pausa -preview.stop = Stoppa - -message.confirm.removemultiple = \u00c4r du s\u00e4ker p\u00e5 att du vill ta bort %count% objekt\noch alla andra objekt som \u00e4r beroende av objektet? - -menu.tools.searchCache = S\u00f6k i webbl\u00e4sarens cache - -#after version 1.7.2u2 - -error.trait.exists = Egenskap med namnet "%name%" finns redan. -button.addtrait = L\u00e4gg till egenskap -button.font.embed = Inb\u00e4dda... -button.yes.all = Ja till alla -button.no.all = Nej till alla -message.font.add.exists = Tecken %char% finns redan i typsnitts tag:en.\nVill du ers\u00e4tta den? - -filter.gfx = ScaleForm GFx filer (*.gfx) -filter.supported = Alla filtyper som st\u00f6ds -work.canceled = Avbruten -work.restoringControlFlow = \u00c5terst\u00e4llande fl\u00f6deskontroll -menu.advancedsettings.advancedsettings = Avancerade Inst\u00e4llningar -menu.recentFiles = Senaste Filerna - -#after version 1.7.4 -work.restoringControlFlow.complete = Reglerings fl\u00f6de \u00e5terst\u00e4llt -message.confirm.recentFileNotFound = Filen hittades inte. Vill du ta bort den fr\u00e5n senaste filer? -contextmenu.closeSwf = St\u00e4ng SWF -menu.settings.autoRenameIdentifiers = byt namn Automatisk p\u00e5 identifierare -menu.file.saveasexe = Spara som Exe... -filter.exe = K\u00f6rbara filer (*.exe) - -#after version 1.8.0 -font.updateTexts = Uppdatera texter - -#after version 1.8.0u1 -menu.file.close = St\u00e4ng -menu.file.closeAll = St\u00e4ng alla -menu.tools.otherTools = Annat -menu.tools.otherTools.clearRecentFiles = Rensa senaste filer -fontName.name = Typsnitt visningsnamn: -fontName.copyright = Typsnitt Upphovsr\u00e4tt: -button.preview = F\u00f6rhandsgranska -button.reset = \u00c5terst\u00e4ll -errors.info = Det \u00e4r information i loggen. Klicka f\u00f6r att visa. -errors.warning = Det \u00e4r varningar i loggen. Klicka f\u00f6r att visa.. - -decompilationError = Dekompilering felmeddelande - -disassemblingProgress.toString = toString -disassemblingProgress.reading = L\u00e4ser -disassemblingProgress.deobfuscating = Deobfuskering - -contextmenu.moveTag = Flytta tag till - -filter.swc = SWC komponent filer (*.swc) -filter.zip = ZIP komprimerade filer (*.zip) -filter.binary = Bin\u00e4r s\u00f6kning - alla filer (*.*) - -open.error = Fel -open.error.fileNotFound = Filen hittades inte -open.error.cannotOpen = Kan inte \u00f6ppna filen - -node.others = andra - -#after version 1.8.1 -menu.tools.search = Text S\u00f6kning - -#after version 1.8.1u1 -menu.tools.timeline = Tidslinje - -dialog.selectcolor.title = V\u00e4lj f\u00e4rg -button.selectcolor.hint = Klicka f\u00f6r att v\u00e4lja f\u00e4rg - -#default item name, will be used in following sentences -generictag.array.item = artikel -generictag.array.insertbeginning = Infoga %item% vid b\u00f6rjan -generictag.array.insertbefore = Infoga %item% f\u00f6re -generictag.array.remove = Tabort %item% -generictag.array.insertafter = Infoga %item% efter -generictag.array.insertend = Infoga %item% vid slutet - -#after version 2.0.0 -contextmenu.expandAll = Expandera alla -binaryData.truncateWarning = %count% bytes truncated. -filter.sounds = St\u00f6djande ljudformat (*.wav, *.mp3) -filter.sounds.wav = Wave filformat (*.wav) -filter.sounds.mp3 = MP3 komprimerat format (*.mp3) - -error.sound.invalid = Ogiltigt ljud. - -button.prev = F\u00f6reg\u00e5ende -button.next = N\u00e4sta - -#after version 2.1.0 -message.action.playerglobal.title = PlayerGlobal bibliotek beh\u00f6vs -message.action.playerglobal.needed = F\u00f6r ActionScript 3 direkt redigering, beh\u00f6vs ett bibliotek som kallas "PlayerGlobal.swc" det beh\u00f6vs laddas ned fr\u00e5n Adobe's hemsida.\r\n%adobehomepage%\r\nKlicka p\u00e5 okej f\u00f6r att g\u00e5 till nerladdningssidan. -message.action.playerglobal.place = Ladda ned biblioteket som kallas PlayerGlobal(.swc), och placera det i katalogen\r\n%libpath%\r\n Klica okej f\u00f6r att forts\u00e4tta. - -message.confirm.experimental.function = Denna funktion \u00e4r experimenterande. Det menas att du inte ska lita p\u00e5 resultaten och SWF-filen kan bli ej fungerande efter sparning. -message.confirm.donotshowagain = Visa inte igen - -menu.import = Importera -menu.file.import.text = Importera text -import.select.directory = V\u00e4lj kategori som du vill importera -error.text.import = Fel uppstod under text importering. Vill du forts\u00e4tta? - -#after version 2.1.1 -contextmenu.removeWithDependencies = Bort med beroenden - -abc.action.find-usages = Hitta anv\u00e4ndningar -abc.action.find-declaration = Hitta f\u00f6rklaring - -contextmenu.rawEdit = Raw \u00e4ndring -contextmenu.jumpToCharacter = Hoppa till tecken - -menu.settings.dumpView = Dump vy - -menu.view = Vy -menu.file.view.resources = Resurser -menu.file.view.hex = Hex dumpning - -node.header = header - -header.signature = Signature: -header.compression = Kompression: -header.compression.lzma = LZMA -header.compression.zlib = ZLIB -header.compression.none = Ingen kompression -header.version = SWF Version: -header.gfx = GFX: -header.filesize = Fil storlek: -header.framerate = Ram hastighet: -header.framecount = Ram r\u00e4knare: -header.displayrect = Visa rect: -header.displayrect.value.twips = %xmin%,%ymin% = > %xmax%,%ymax% twips -header.displayrect.value.pixels = %xmin%,%ymin% = > %xmax%,%ymax% pixlar - -#after version 2.1.2 -contextmenu.saveToFile = Spara till Fil -contextmenu.parseActions = Parse actions -contextmenu.parseABC = Parse ABC -contextmenu.parseInstructions = Parse AVM2 Instruktioner - -#after version 2.1.3 -menu.deobfuscation = AS1/2 Deobfuskering -menu.file.deobfuscation.old = Gammal stil -menu.file.deobfuscation.new = Ny stil - -#after version 2.1.4 -contextmenu.openswfinside = \u00d6ppna SWF inuti -binarydata.swfInside = Det ser ut som om det \u00e4r en SWF inuti denna bin\u00e4ra data tagg. Klicka h\u00e4r f\u00f6r att ladda det som subtree. - -#after version 3.0.0 -button.zoomin.hint = Zooma in -button.zoomout.hint = Zooma ut -button.zoomfit.hint = Zooma f\u00f6r att passa -button.zoomnone.hint = Zooma till 1:1 -button.snapshot.hint = Ta snapshot intill clipboard - -editorTruncateWarning = Text trunkerad vid position %chars% i debugg mode. - -#Font name which is presented in the SWF Font tag -font.name.intag = Typsnittsnamn i tagg: - -menu.debugger = Debugger -menu.debugger.switch = Debugger -menu.debugger.replacetrace = Ers\u00e4tt sp\u00e5rsamtal -menu.debugger.showlog = Visa Logg - -message.debugger = Denna SWF Debugger kan bara anv\u00e4ndas till att skriva ut meddelanden till logg f\u00f6nstret, webbl\u00e4sare konsol eller larm. Den \u00e4r INTE designad f\u00f6r egenskaper som step code, breakpoints och s\u00e5 vidare. - -contextmenu.addTag = L\u00e4gg till tagg - -deobfuscation.comment.tryenable = Tips: Du kan testa att aktivera "Automatisk deobfuskering" i Inst\u00e4llningar -deobfuscation.comment.failed = Deobfuskering \u00e4r aktiverad men dekompileringen slutf\u00f6rdes inte. Om filen INTE \u00e4r obfuskerad, inaktivera "Automatisk Deobfuskering" f\u00f6r ett b\u00e4ttre resultat. - -#after version 4.0.2 -preview.nextframe = N\u00e4sta ram -preview.prevframe = F\u00f6reg\u00e5ende ram -preview.gotoframe = G\u00e5 till ram... - -preview.gotoframe.dialog.title = G\u00e5 till ram -preview.gotoframe.dialog.message = Skriv in ram nummer (%min% - %max%) -preview.gotoframe.dialog.frame.error = Ogiltigt ram nummer. Det m\u00e5ste vara ett nummer mellan %min% och %max%. - -error.text.invalid.continue = Ogiltig text: %text% p\u00e5 rad %line%. Vill du forts\u00e4tta? - -#after version 4.0.5 -contextmenu.copyTag = Kopiera tagg till -fit = passa -button.setAdvanceValues = S\u00e4tt avancerade v\u00e4rden - -menu.tools.replace = Ers\u00e4tt text - -message.confirm.close = Det finns osparade f\u00f6r\u00e4ndringar. Vill du verkligen st\u00e4nga {swfName}? -message.confirm.closeAll = Det finns osparade f\u00f6r\u00e4ndringar. Vill du verkligen st\u00e4nga alla SWFs? - -contextmenu.exportJavaSource = Exportera Java K\u00e4lla -contextmenu.exportSwfXml = Exportera SWF som XML -contextmenu.importSwfXml = Importera SWF XML - -filter.xml = XML - -#after version 4.1.0 -contextmenu.undo = \u00c5ngra - -text.align.left = V\u00e4nster justering -text.align.right = H\u00f6ger justering -text.align.center = Mitt justering -text.align.justify = R\u00e4ttf\u00e4rdiga justering - -text.undo = \u00c5ngra f\u00f6r\u00e4ndringar - -menu.file.import.xml = Importera SWF XML -menu.file.export.xml = Exportera SWF XML - -#after version 4.1.1 -text.align.translatex.decrease = Minska TranslateX -text.align.translatex.increase = \u00d6ka TranslateX -selectPreviousTag = V\u00e4lj f\u00f6reg\u00e5ende tagg -selectNextTag = V\u00e4lj n\u00e4sta tagg -button.ignoreAll = Ignorera Allt -menu.file.import.symbolClass = Symbol Klass -text.toggleCase = S\u00e4tter p\u00e5 eller st\u00e4nger av fallet - -#after version 5.0.2 -preview.loop = Repetera -menu.file.import.script = Importera skript -contextmenu.copyTagWithDependencies = Kopiera tag med beroenden till -button.replaceWithTag = Ers\u00e4tt med andra tecken tag -button.resolveConstants = L\u00f6sa constants - -#after version 5.1.0 -button.viewConstants = Granska Constants -work.exported = Exporterad -button.replaceAlphaChannel = Ers\u00e4tt alfakanal... - -tagInfo.header.name = Namn -tagInfo.header.value = V\u00e4rde -tagInfo.tagType = Tag Typ -tagInfo.characterId = Tecken Id -tagInfo.offset = Offset -tagInfo.length = L\u00e4ngd -tagInfo.bounds = Gr\u00e4nser -tagInfo.width = Bredd -tagInfo.height = H\u00f6jd -tagInfo.neededCharacters = Beh\u00f6vande Tecken - -button.viewhexpcode = Granska Hex med instruktioner -taginfo.header = Grundl\u00e4ggande tag information - -tagInfo.dependentCharacters = Beroende Tecken - -#after version 5.3.0 -header.uncompressed = Okomprimerad -header.warning.unsupportedGfxCompression = GFX st\u00f6der endast okomprimerat eller Zlib komprimerad inneh\u00e5ll. -header.warning.minimumZlibVersion = Zlib kompression beh\u00f6ver SWF version 6 eller st\u00f6rre. -header.warning.minimumLzmaVersion = LZMA kompression beh\u00f6ver SWF version 13 eller st\u00f6rre. - -filter.dmg = Mac K\u00f6rbara filer (*.dmg) -filter.linuxExe = Linux K\u00f6rbara filer +# Copyright (C) 2010-2015 JPEXS +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +menu.file = Fil +menu.file.open = \u00d6ppna... +menu.file.save = Spara +menu.file.saveas = Spara som... +menu.file.export.fla = Exportera till FLA +menu.file.export.all = Exportera alla delar +menu.file.export.selection = Exportera markering +menu.file.exit = St\u00e4ng + +menu.tools = Verktyg +menu.tools.searchas = S\u00f6k igenom alla ActionSkript... +menu.tools.proxy = Proxy +menu.tools.deobfuscation = Avl\u00e4gsna obfuskering +menu.tools.deobfuscation.pcode = Avl\u00e4gsna obfuskerad Bytekod... +menu.tools.deobfuscation.globalrename = Byt namn p\u00e5 global identifierare +menu.tools.deobfuscation.renameinvalid = Byt namn p\u00e5 felaktiga identifierare +menu.tools.gotoDocumentClass = G\u00e5 till dokumentklass + +menu.settings = Inst\u00e4llningar +menu.settings.autodeobfuscation = Automatiskt avl\u00e4gsning av obfuskering +menu.settings.internalflashviewer = Anv\u00e4nd egen Flash-spelare +menu.settings.parallelspeedup = Parallell uppsnabbning +menu.settings.disabledecompilation = Inaktivera dekompilering (Demontera endast) +menu.settings.addtocontextmenu = L\u00e4gg till FFDec till SWF-filernas snabbmeny +menu.settings.language = Byt spr\u00e5k +menu.settings.cacheOnDisk = Anv\u00e4nd cachelagring p\u00e5 h\u00e5rddisken +menu.settings.gotoMainClassOnStartup = Markera dokumentklass vid uppstart + +menu.help = Hj\u00e4lp +menu.help.checkupdates = Leta efter uppdateringar... +menu.help.helpus = Hj\u00e4lp oss! +menu.help.homepage = Bes\u00f6k hemsidan +menu.help.about = Om... + +contextmenu.remove = Ta bort + +button.save = Spara +button.edit = \u00c4ndra +button.cancel = \u00c5ngra +button.replace = Ers\u00e4tt... + +notavailonthisplatform = F\u00f6rhandsgranskning av detta objekt \u00e4r inte tillg\u00e4nglig p\u00e5 denna plattform. (Windows bara) + +swfpreview = SWF f\u00f6rhandsvisning +swfpreview.internal = SWF f\u00f6rhandsvisning (Intern f\u00f6rhandsvisning) + +parameters = Parametrar + +rename.enternew = Ange det nya namnet: + +rename.finished.identifier = Identifierare omd\u00f6pt. +rename.finished.multiname = %count% multiname har blivit omd\u00f6pt(a). + +node.texts = texter +node.images = bilder +node.movies = filmer +node.sounds = ljud +node.binaryData = bin\u00e4rData +node.fonts = teckensnitt +node.sprites = sprites +node.shapes = former +node.morphshapes = morphform +node.buttons = knappar +node.frames = ramar +node.scripts = skript + +message.warning = Varning +message.confirm.experimental = F\u00f6ljande tillv\u00e4gag\u00e5ngss\u00e4tt kan skada SWF-filen som kan d\u00e4refter bli ospelbar.\r\nANV\u00c4ND DEN P\u00c5 DIN EGEN RISK. Vill du forts\u00e4tta? +message.confirm.parallel = Parallellitet kan snabba upp laddning och dekompilering, men anv\u00e4nda mera minne. +message.confirm.on = Vill du aktivera detta? +message.confirm.off = Vill du avaktivera detta? +message.confirm = Bekr\u00e4fta + +message.confirm.autodeobfuscate = Automatiskt avl\u00e4gsning av obfuskering \u00e4r ett s\u00e4tt till att dekompilera obfuskerad kod.\r\nAvl\u00e4gsna obfuskerad kod leder till sl\u00f6are dekompilering och n\u00e5gon d\u00f6d kod kan bli borttagen..\r\nOm koden inte \u00e4r obfuskerad, s\u00e5 \u00e4r det b\u00e4ttre att st\u00e4nga av automatisk borttagning av obfuskering. + +message.parallel = parallellitet +message.trait.saved = Egenskap har sparats + +message.constant.new.string = Str\u00e4ng "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? +message.constant.new.string.title = L\u00e4gg till Str\u00e4ng +message.constant.new.integer = Heltal v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? +message.constant.new.integer.title = L\u00e4gg till Heltal +message.constant.new.unsignedinteger = Osignerat heltal v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? +message.constant.new.unsignedinteger.title = L\u00e4gg till Osignerat heltal +message.constant.new.double = Dubbelt v\u00e4rde "%value%" finns inte i konstant tabellen. Vill du l\u00e4gga till det? +message.constant.new.double.title = L\u00e4gg till Dubbel + +work.buffering = Buffrar +work.waitingfordissasembly = V\u00e4ntar p\u00e5 demontering +work.gettinghilights = Getting hilights +work.disassembling = Demonterar +work.exporting = Exporterar +work.searching = S\u00f6ker +work.renaming = \u00c4ndrar namn +work.exporting.fla = Exporterar FLA +work.renaming.identifiers = \u00c4ndrar namn p\u00e5 identifierare +work.deobfuscating = Avl\u00e4gsning utav obfuskering +work.decompiling = Dekompilering +work.gettingvariables = Tar variablar +work.reading.swf = L\u00e4ser SWF +work.creatingwindow = Skapar f\u00f6nster +work.buildingscripttree = Bygger skript tr\u00e4 + +work.deobfuscating.complete = Avl\u00e4gsning utav obfuskering \u00e4r nu f\u00e4rdig + +message.search.notfound = Str\u00e4ng "%searchtext%" hittades inte. +message.search.notfound.title = Hittades inte + +message.rename.notfound.multiname = Ingen multiname hittades under mark\u00f6ren +message.rename.notfound.identifier = ingen identifiering hittades under mark\u00f6ren +message.rename.notfound.title = Hittades inte +message.rename.renamed = Identifierare som har \u00e4ndrat namn: %count% + +filter.images = Bilder (*.jpg,*.gif,*.png,*.bmp) +filter.fla = %version% Dokument (*.fla) +filter.xfl = %version% Okomprimerat Dokument (*.xfl) +filter.swf = SWF filer (*.swf) + +error = Fel +error.image.invalid = Ogiltig bild. + +error.text.invalid = Ogiltig text: %text% p\u00e5 rad %line% +error.file.save = Kan inte spara filen +error.file.write = Kan inte skriva till filen +error.export = Fel under loppet av exporteringen + +export.select.directory = V\u00e4lj s\u00f6kv\u00e4g till katalog att exportera +export.finishedin = Exporterades i %time% + +update.check.title = Uppdaterings koll +update.check.nonewversion = Ingen ny version finns tillg\u00e4nglig. + +message.helpus = V\u00e4nligen bes\u00f6k\r\n%url%\r\nf\u00f6r mer detaljer. +message.homepage = Bes\u00f6k hemsidan: \r\n%url% + +proxy = Proxy +proxy.start = Starta proxy +proxy.stop = Stoppa proxy +proxy.show = Visa proxy +exit = St\u00e4ng + +panel.disassembled = P-code k\u00e4llkod +panel.decompiled = ActionSkript k\u00e4llkod + +search.info = S\u00f6k efter "%text%" : +search.script = Skript + +constants = Konstanter +traits = Egenskaper + +pleasewait = V\u00e4nligen v\u00e4nta + +abc.detail.methodtrait = Metod/F\u00e5ngare/Egenskap s\u00e4ttare +abc.detail.unsupported = - +abc.detail.slotconsttrait = Slot/Const Egenskap +abc.detail.traitname = Namn: + +abc.detail.body.params.maxstack = Maximal stapling: +abc.detail.body.params.localregcount = Lokala register r\u00e4knade: +abc.detail.body.params.minscope = Minsta omfattnings djup: +abc.detail.body.params.maxscope = Maximal omfattnings djup: +abc.detail.body.params.autofill = Automatisk utfyllnad n\u00e4r koden sparas (GLOBAL INST\u00c4LLNING) +abc.detail.body.params.autofill.experimental = ...EXPERIMENTELL + +abc.detail.methodinfo.methodindex = Metod register: +abc.detail.methodinfo.parameters = Parametrar: +abc.detail.methodinfo.returnvalue = \u00c5terl\u00e4mna v\u00e4rde: + +error.methodinfo.params = MetodInfo Parameter fel +error.methodinfo.returnvalue = MetodInfo \u00e5terl\u00e4mmnings typ Fel + +abc.detail.methodinfo = MetodInfo +abc.detail.body.code = MetodInfo Kod +abc.detail.body.params = MetodKropp parametrar + +abc.detail.slotconst.typevalue = Typ och V\u00e4rde: + +error.slotconst.typevalue = SlotConst typv\u00e4rde felaktighet + +message.autofill.failed = Kan inte f\u00e5 statistik koden f\u00f6r automatisk kropps-parametrar.\r\nAvmarkera automatisk ifyllnad f\u00f6r att undvika det h\u00e4r meddelandet. +info.selecttrait = V\u00e4lj klass och klicka p\u00e5 en egenskap i Actionskript k\u00e4llan f\u00f6r att redigera den. + +button.viewgraph = Visa Diagram +button.viewhex = Visa Hex + +abc.traitslist.instanceinitializer = instans initierare +abc.traitslist.classinitializer = klass initierare + +action.edit.experimental = (experimentellt) + +message.action.saved = Koden har sparats + +error.action.save = %error% p\u00e5 rad %line% + +message.confirm.remove = \u00c4r du s\u00e4ker p\u00e5 att du vill ta bort %item% \n och alla objekt som \u00e4r beroende av den? + +#after version 1.6.5u1: + +button.ok = Godk\u00e4nn +button.cancel = Avbryt + +font.name = Typsnitts namn: +font.isbold = \u00c4r fet: +font.isitalic = \u00c4r kursiv: +font.ascent = Stigande: +font.descent = Nedstigande: +font.leading = Ledande: +font.characters = Bokst\u00e4ver: +font.characters.add = L\u00e4gg till bokst\u00e4ver: +value.unknown = ? + +yes = ja +no = nej + +errors.present = Det finns FEL i loggen. Klicka f\u00f6r att visa loggen. +errors.none = Det finns inga fel i loggen + +#after version 1.6.6: + +dialog.message.title = Meddelande +dialog.select.title = V\u00e4lj ett alternativ + +button.yes = Ja +button.no = Nej + +FileChooser.openButtonText = \u00d6ppna +FileChooser.openButtonToolTipText = \u00d6ppna +FileChooser.lookInLabelText = Alla Filer +FileChooser.acceptAllFileFilterText = Kolla i: +FileChooser.filesOfTypeLabelText = Filformat: +FileChooser.fileNameLabelText = Filnamn: +FileChooser.listViewButtonToolTipText = Lista +FileChooser.listViewButtonAccessibleName = Lista +FileChooser.detailsViewButtonToolTipText = Detaljer +FileChooser.detailsViewButtonAccessibleName = Detaljer +FileChooser.upFolderToolTipText = Upp en niv\u00e5 +FileChooser.upFolderAccessibleName = Upp en niv\u00e5 +FileChooser.homeFolderToolTipText = Hem +FileChooser.homeFolderAccessibleName = Hem +FileChooser.fileNameHeaderText = Namn +FileChooser.fileSizeHeaderText = Storlek +FileChooser.fileTypeHeaderText = Typ +FileChooser.fileDateHeaderText = Datum +FileChooser.fileAttrHeaderText = Egenskaper +FileChooser.openDialogTitleText = \u00d6ppna +FileChooser.directoryDescriptionText = Katalog +FileChooser.directoryOpenButtonText = \u00d6ppna +FileChooser.directoryOpenButtonToolTipText = \u00d6ppna vald katalog +FileChooser.fileDescriptionText = Generic File +FileChooser.helpButtonText = Hj\u00e4lp +FileChooser.helpButtonToolTipText = FileChooser help +FileChooser.newFolderAccessibleName = Ny mapp +FileChooser.newFolderErrorText = N\u00e5got gick fel n\u00e4r den f\u00f6rs\u00f6kta skapa en ny mapp +FileChooser.newFolderToolTipText = Skapa ny mapp +FileChooser.other.newFolder = NyMapp +FileChooser.other.newFolder.subsequent = NyMapp.{0} +FileChooser.win32.newFolder = Ny mapp +FileChooser.win32.newFolder.subsequent = Ny mapp ({0}) +FileChooser.saveButtonText = Spara +FileChooser.saveButtonToolTipText = Spara vald fil +FileChooser.saveDialogTitleText = Spara +FileChooser.saveInLabelText = Spara i: +FileChooser.updateButtonText = Uppdatera +FileChooser.updateButtonToolTipText = Uppdatera kataloglistning + +#after version 1.6.6u2: + +FileChooser.detailsViewActionLabel.textAndMnemonic = Detaljer +FileChooser.detailsViewButtonToolTip.textAndMnemonic = Detaljer +FileChooser.fileAttrHeader.textAndMnemonic = Egenskaper +FileChooser.fileDateHeader.textAndMnemonic = Modifierad +FileChooser.fileNameHeader.textAndMnemonic = Namn +FileChooser.fileNameLabel.textAndMnemonic = Filnamn: +FileChooser.fileSizeHeader.textAndMnemonic = Storlek +FileChooser.fileTypeHeader.textAndMnemonic = Typ +FileChooser.filesOfTypeLabel.textAndMnemonic = Filformat: +FileChooser.folderNameLabel.textAndMnemonic = Mappnamn: +FileChooser.homeFolderToolTip.textAndMnemonic = Hem +FileChooser.listViewActionLabel.textAndMnemonic = Lista +FileChooser.listViewButtonToolTip.textAndMnemonic = Lista +FileChooser.lookInLabel.textAndMnemonic = Kolla i: +FileChooser.newFolderActionLabel.textAndMnemonic = Ny mapp +FileChooser.newFolderToolTip.textAndMnemonic = Skapa Ny Mapp +FileChooser.refreshActionLabel.textAndMnemonic = Refresh +FileChooser.saveInLabel.textAndMnemonic = Spara i: +FileChooser.upFolderToolTip.textAndMnemonic = Upp en niv\u00e5 +FileChooser.viewMenuButtonAccessibleName = Visa meny +FileChooser.viewMenuButtonToolTipText = Visa meny +FileChooser.viewMenuLabel.textAndMnemonic = Visa +FileChooser.newFolderActionLabelText = Ny mapp +FileChooser.listViewActionLabelText = Lista +FileChooser.detailsViewActionLabelText = Detaljer +FileChooser.refreshActionLabelText = Uppdatera +FileChooser.sortMenuLabelText = Ordna ikoner efter +FileChooser.viewMenuLabelText = Visa +FileChooser.fileSizeKiloBytes = {0} KB +FileChooser.fileSizeMegaBytes = {0} MB +FileChooser.fileSizeGigaBytes = {0} GB +FileChooser.folderNameLabelText = Mappnamn: + +error.occured = Ett fel uppstod : %error% +button.abort = Avbryt +button.retry = F\u00f6rs\u00f6k igen +button.ignore = Ignorera + +font.source = Typsnitts k\u00e4lla: + +#after version 1.6.7: + +menu.export = Exportera +menu.general = Allm\u00e4nt +menu.language = Spr\u00e5k start. + +startup.welcometo = V\u00e4lkommen till +startup.selectopen = Klicka p\u00e5 ikonen \u00d6ppna p\u00e5 den \u00f6vre panelen eller dra SWF-filen till f\u00f6nstret f\u00f6r att starta. + +error.font.nocharacter = Vald teckensnitt-k\u00e4lla inneh\u00e5ller inte bokstav "%char%". + +warning.initializers = Statiska f\u00e4lt och consts initieras i initierare ofta.\nRedigera v\u00e4rdet h\u00e4r \u00e4r oftast inte tillr\u00e4ckligt! + +#after version 1.7.0u1: + +menu.tools.searchMemory = S\u00f6k efter SWFs i minnet +menu.file.reload = Ladda om +message.confirm.reload = Denna \u00e5tg\u00e4rd avbryter alla \u00e4ndringar som inte sparats och laddar om SWF filen igen.\nVill du forts\u00e4tta? + +dialog.selectbkcolor.title = V\u00e4lj bakgrundsf\u00e4rg f\u00f6r SWF display +button.selectbkcolor.hint = V\u00e4lj bakgrundsf\u00e4rg + +ColorChooser.okText = Acceptera +ColorChooser.cancelText = Avbryt +ColorChooser.resetText = \u00c5terst\u00e4ll +ColorChooser.previewText = F\u00f6rhandsvisning +ColorChooser.swatchesNameText = F\u00e4rgrutor +ColorChooser.swatchesRecentText = Nyligen: +ColorChooser.sampleText=Exempel Text Exempel Text + +#after version 1.7.1: + +preview.play = Spela +preview.pause = Pausa +preview.stop = Stoppa + +message.confirm.removemultiple = \u00c4r du s\u00e4ker p\u00e5 att du vill ta bort %count% objekt\noch alla andra objekt som \u00e4r beroende av objektet? + +menu.tools.searchCache = S\u00f6k i webbl\u00e4sarens cache + +#after version 1.7.2u2 + +error.trait.exists = Egenskap med namnet "%name%" finns redan. +button.addtrait = L\u00e4gg till egenskap +button.font.embed = Inb\u00e4dda... +button.yes.all = Ja till alla +button.no.all = Nej till alla +message.font.add.exists = Tecken %char% finns redan i typsnitts tag:en.\nVill du ers\u00e4tta den? + +filter.gfx = ScaleForm GFx filer (*.gfx) +filter.supported = Alla filtyper som st\u00f6ds +work.canceled = Avbruten +work.restoringControlFlow = \u00c5terst\u00e4llande fl\u00f6deskontroll +menu.advancedsettings.advancedsettings = Avancerade Inst\u00e4llningar +menu.recentFiles = Senaste Filerna + +#after version 1.7.4 +work.restoringControlFlow.complete = Reglerings fl\u00f6de \u00e5terst\u00e4llt +message.confirm.recentFileNotFound = Filen hittades inte. Vill du ta bort den fr\u00e5n senaste filer? +contextmenu.closeSwf = St\u00e4ng SWF +menu.settings.autoRenameIdentifiers = byt namn Automatisk p\u00e5 identifierare +menu.file.saveasexe = Spara som Exe... +filter.exe = K\u00f6rbara filer (*.exe) + +#after version 1.8.0 +font.updateTexts = Uppdatera texter + +#after version 1.8.0u1 +menu.file.close = St\u00e4ng +menu.file.closeAll = St\u00e4ng alla +menu.tools.otherTools = Annat +menu.tools.otherTools.clearRecentFiles = Rensa senaste filer +fontName.name = Typsnitt visningsnamn: +fontName.copyright = Typsnitt Upphovsr\u00e4tt: +button.preview = F\u00f6rhandsgranska +button.reset = \u00c5terst\u00e4ll +errors.info = Det \u00e4r information i loggen. Klicka f\u00f6r att visa. +errors.warning = Det \u00e4r varningar i loggen. Klicka f\u00f6r att visa.. + +decompilationError = Dekompilering felmeddelande + +disassemblingProgress.toString = toString +disassemblingProgress.reading = L\u00e4ser +disassemblingProgress.deobfuscating = Deobfuskering + +contextmenu.moveTag = Flytta tag till + +filter.swc = SWC komponent filer (*.swc) +filter.zip = ZIP komprimerade filer (*.zip) +filter.binary = Bin\u00e4r s\u00f6kning - alla filer (*.*) + +open.error = Fel +open.error.fileNotFound = Filen hittades inte +open.error.cannotOpen = Kan inte \u00f6ppna filen + +node.others = andra + +#after version 1.8.1 +menu.tools.search = Text S\u00f6kning + +#after version 1.8.1u1 +menu.tools.timeline = Tidslinje + +dialog.selectcolor.title = V\u00e4lj f\u00e4rg +button.selectcolor.hint = Klicka f\u00f6r att v\u00e4lja f\u00e4rg + +#default item name, will be used in following sentences +generictag.array.item = artikel +generictag.array.insertbeginning = Infoga %item% vid b\u00f6rjan +generictag.array.insertbefore = Infoga %item% f\u00f6re +generictag.array.remove = Tabort %item% +generictag.array.insertafter = Infoga %item% efter +generictag.array.insertend = Infoga %item% vid slutet + +#after version 2.0.0 +contextmenu.expandAll = Expandera alla +binaryData.truncateWarning = %count% bytes truncated. +filter.sounds = St\u00f6djande ljudformat (*.wav, *.mp3) +filter.sounds.wav = Wave filformat (*.wav) +filter.sounds.mp3 = MP3 komprimerat format (*.mp3) + +error.sound.invalid = Ogiltigt ljud. + +button.prev = F\u00f6reg\u00e5ende +button.next = N\u00e4sta + +#after version 2.1.0 +message.action.playerglobal.title = PlayerGlobal bibliotek beh\u00f6vs +message.action.playerglobal.needed = F\u00f6r ActionScript 3 direkt redigering, beh\u00f6vs ett bibliotek som kallas "PlayerGlobal.swc" det beh\u00f6vs laddas ned fr\u00e5n Adobe's hemsida.\r\n%adobehomepage%\r\nKlicka p\u00e5 okej f\u00f6r att g\u00e5 till nerladdningssidan. +message.action.playerglobal.place = Ladda ned biblioteket som kallas PlayerGlobal(.swc), och placera det i katalogen\r\n%libpath%\r\n Klica okej f\u00f6r att forts\u00e4tta. + +message.confirm.experimental.function = Denna funktion \u00e4r experimenterande. Det menas att du inte ska lita p\u00e5 resultaten och SWF-filen kan bli ej fungerande efter sparning. +message.confirm.donotshowagain = Visa inte igen + +menu.import = Importera +menu.file.import.text = Importera text +import.select.directory = V\u00e4lj kategori som du vill importera +error.text.import = Fel uppstod under text importering. Vill du forts\u00e4tta? + +#after version 2.1.1 +contextmenu.removeWithDependencies = Bort med beroenden + +abc.action.find-usages = Hitta anv\u00e4ndningar +abc.action.find-declaration = Hitta f\u00f6rklaring + +contextmenu.rawEdit = Raw \u00e4ndring +contextmenu.jumpToCharacter = Hoppa till tecken + +menu.settings.dumpView = Dump vy + +menu.view = Vy +menu.file.view.resources = Resurser +menu.file.view.hex = Hex dumpning + +node.header = header + +header.signature = Signature: +header.compression = Kompression: +header.compression.lzma = LZMA +header.compression.zlib = ZLIB +header.compression.none = Ingen kompression +header.version = SWF Version: +header.gfx = GFX: +header.filesize = Fil storlek: +header.framerate = Ram hastighet: +header.framecount = Ram r\u00e4knare: +header.displayrect = Visa rect: +header.displayrect.value.twips = %xmin%,%ymin% = > %xmax%,%ymax% twips +header.displayrect.value.pixels = %xmin%,%ymin% = > %xmax%,%ymax% pixlar + +#after version 2.1.2 +contextmenu.saveToFile = Spara till Fil +contextmenu.parseActions = Parse actions +contextmenu.parseABC = Parse ABC +contextmenu.parseInstructions = Parse AVM2 Instruktioner + +#after version 2.1.3 +menu.deobfuscation = Deobfuskering +menu.file.deobfuscation.old = Gammal stil +menu.file.deobfuscation.new = Ny stil + +#after version 2.1.4 +contextmenu.openswfinside = \u00d6ppna SWF inuti +binarydata.swfInside = Det ser ut som om det \u00e4r en SWF inuti denna bin\u00e4ra data tagg. Klicka h\u00e4r f\u00f6r att ladda det som subtree. + +#after version 3.0.0 +button.zoomin.hint = Zooma in +button.zoomout.hint = Zooma ut +button.zoomfit.hint = Zooma f\u00f6r att passa +button.zoomnone.hint = Zooma till 1:1 +button.snapshot.hint = Ta snapshot intill clipboard + +editorTruncateWarning = Text trunkerad vid position %chars% i debugg mode. + +#Font name which is presented in the SWF Font tag +font.name.intag = Typsnittsnamn i tagg: + +menu.debugger = Debugger +menu.debugger.switch = Debugger +menu.debugger.replacetrace = Ers\u00e4tt sp\u00e5rsamtal +menu.debugger.showlog = Visa Logg + +message.debugger = Denna SWF Debugger kan bara anv\u00e4ndas till att skriva ut meddelanden till logg f\u00f6nstret, webbl\u00e4sare konsol eller larm. Den \u00e4r INTE designad f\u00f6r egenskaper som step code, breakpoints och s\u00e5 vidare. + +contextmenu.addTag = L\u00e4gg till tagg + +deobfuscation.comment.tryenable = Tips: Du kan testa att aktivera "Automatisk deobfuskering" i Inst\u00e4llningar +deobfuscation.comment.failed = Deobfuskering \u00e4r aktiverad men dekompileringen slutf\u00f6rdes inte. Om filen INTE \u00e4r obfuskerad, inaktivera "Automatisk Deobfuskering" f\u00f6r ett b\u00e4ttre resultat. + +#after version 4.0.2 +preview.nextframe = N\u00e4sta ram +preview.prevframe = F\u00f6reg\u00e5ende ram +preview.gotoframe = G\u00e5 till ram... + +preview.gotoframe.dialog.title = G\u00e5 till ram +preview.gotoframe.dialog.message = Skriv in ram nummer (%min% - %max%) +preview.gotoframe.dialog.frame.error = Ogiltigt ram nummer. Det m\u00e5ste vara ett nummer mellan %min% och %max%. + +error.text.invalid.continue = Ogiltig text: %text% p\u00e5 rad %line%. Vill du forts\u00e4tta? + +#after version 4.0.5 +contextmenu.copyTag = Kopiera tagg till +fit = passa +button.setAdvanceValues = S\u00e4tt avancerade v\u00e4rden + +menu.tools.replace = Ers\u00e4tt text + +message.confirm.close = Det finns osparade f\u00f6r\u00e4ndringar. Vill du verkligen st\u00e4nga {swfName}? +message.confirm.closeAll = Det finns osparade f\u00f6r\u00e4ndringar. Vill du verkligen st\u00e4nga alla SWFs? + +contextmenu.exportJavaSource = Exportera Java K\u00e4lla +contextmenu.exportSwfXml = Exportera SWF som XML +contextmenu.importSwfXml = Importera SWF XML + +filter.xml = XML + +#after version 4.1.0 +contextmenu.undo = \u00c5ngra + +text.align.left = V\u00e4nster justering +text.align.right = H\u00f6ger justering +text.align.center = Mitt justering +text.align.justify = R\u00e4ttf\u00e4rdiga justering + +text.undo = \u00c5ngra f\u00f6r\u00e4ndringar + +menu.file.import.xml = Importera SWF XML +menu.file.export.xml = Exportera SWF XML + +#after version 4.1.1 +text.align.translatex.decrease = Minska TranslateX +text.align.translatex.increase = \u00d6ka TranslateX +selectPreviousTag = V\u00e4lj f\u00f6reg\u00e5ende tagg +selectNextTag = V\u00e4lj n\u00e4sta tagg +button.ignoreAll = Ignorera Allt +menu.file.import.symbolClass = Symbol Klass +text.toggleCase = S\u00e4tter p\u00e5 eller st\u00e4nger av fallet + +#after version 5.0.2 +preview.loop = Repetera +menu.file.import.script = Importera skript +contextmenu.copyTagWithDependencies = Kopiera tag med beroenden till +button.replaceWithTag = Ers\u00e4tt med andra tecken tag +button.resolveConstants = L\u00f6sa constants + +#after version 5.1.0 +button.viewConstants = Granska Constants +work.exported = Exporterad +button.replaceAlphaChannel = Ers\u00e4tt alfakanal... + +tagInfo.header.name = Namn +tagInfo.header.value = V\u00e4rde +tagInfo.tagType = Tag Typ +tagInfo.characterId = Tecken Id +tagInfo.offset = Offset +tagInfo.length = L\u00e4ngd +tagInfo.bounds = Gr\u00e4nser +tagInfo.width = Bredd +tagInfo.height = H\u00f6jd +tagInfo.neededCharacters = Beh\u00f6vande Tecken + +button.viewhexpcode = Granska Hex med instruktioner +taginfo.header = Grundl\u00e4ggande tag information + +tagInfo.dependentCharacters = Beroende Tecken + +#after version 5.3.0 +header.uncompressed = Okomprimerad +header.warning.unsupportedGfxCompression = GFX st\u00f6der endast okomprimerat eller Zlib komprimerad inneh\u00e5ll. +header.warning.minimumZlibVersion = Zlib kompression beh\u00f6ver SWF version 6 eller st\u00f6rre. +header.warning.minimumLzmaVersion = LZMA kompression beh\u00f6ver SWF version 13 eller st\u00f6rre. + +filter.dmg = Mac K\u00f6rbara filer (*.dmg) +filter.linuxExe = Linux K\u00f6rbara filer diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties index 62d4741d2..0c79ca224 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_zh.properties @@ -488,6 +488,6 @@ contextmenu.parseActions = \u89e3\u6790\u52a8\u4f5c contextmenu.parseABC = \u89e3\u6790ABC contextmenu.parseInstructions = \u89e3\u6790AVM2\u6307\u4ee4 -menu.deobfuscation = AS1/2 \u53cd\u6df7\u6dc6 +menu.deobfuscation = \u53cd\u6df7\u6dc6 menu.file.deobfuscation.old = \u65e7\u6837\u5f0f menu.file.deobfuscation.new = \u65b0\u6837\u5f0f